首页 文章 精选 留言 我的

精选列表

搜索[腾讯技术创作特训营S8],共10000篇文章
优秀的个人博客,低调大师

一次因PageHelper引起的多线程复用问题的排查和解决 | 京东物流技术团队

A、Problem Description 1. PageHelper方法使用了静态的ThreadLocal参数,在startPage()调用紧跟MyBatis查询方法后,才会自动清除ThreadLocal存储的对象。 2. 当一个线程先执行了A方法的PageHelper.startPage(int pageNum, int pageSize)后,在未执行到SQL语句前,因为代码抛异常而提前结束。 3. 这个线程被另一个请求复用,根据当前的pageNum和pageSize参数,执行了B方法中的SQL语句。 4. B方法的SQL是全表扫描并查询出所有符合条件的数据,所以因为A方法的分页参数限定<<实际B方法中符合条件的数据量,导致了B方法查询结果的错误。  B、Problem inspection Steps 1. Code Review     先看一下A方法的代码就会发现,在使用了PageHelper.startPage之后,Mybatis查询SQL之前,有很多判断逻辑,并且问题就发生在中间标红的异常情况判断。    B方法在执行到第一个SQL查询语句的时候,就会因为复用线程中 PageMethod 所带有A方法中ThreadLocal的(pageNum,pageSize)参数导致B方法的查询也限定了分页参数。  2. Log Check and Prove a. A方法提前抛异常,且没执行MyBatis查询方法的日志截图   b. B方法执行到MyBatis查询方法的截图   C、Analysis Steps 1. How to use PageHelper a. Github Official Document Link https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md  PageHelper 方法使用了静态的 ThreadLocal 参数,分页参数和线程是绑定的。 只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。  b. Analysis Source Code of PageHelper i. startPage() and getLocalPage()    通过上图我们可以发现,当一个请求来的时候,会获取持有当前请求的线程的ThreadLocal,调用LOCAL_PAGE.get(),查看当前线程是否有未执行的分页配置,再通过setLocalPage(page)方法设置线程的分页配置。  ii. Intercept Method in PageInterceptor @Override public Object intercept(Invocation invocation) throws Throwable { try { Object[] args = invocation.getArgs(); MappedStatement ms = (MappedStatement) args[0]; Object parameter = args[1]; RowBounds rowBounds = (RowBounds) args[2]; ResultHandler resultHandler = (ResultHandler) args[3]; Executor executor = (Executor) invocation.getTarget(); CacheKey cacheKey; BoundSql boundSql; //由于逻辑关系,只会进入一次 if (args.length == 4) { //4 个参数时 boundSql = ms.getBoundSql(parameter); cacheKey = executor.createCacheKey(ms, parameter, rowBounds, boundSql); } else { //6 个参数时 cacheKey = (CacheKey) args[4]; boundSql = (BoundSql) args[5]; } checkDialectExists(); List resultList; //调用方法判断是否需要进行分页,如果不需要,直接返回结果 if (!dialect.skip(ms, parameter, rowBounds)) { //判断是否需要进行 count 查询 if (dialect.beforeCount(ms, parameter, rowBounds)) { //查询总数 Long count = count(executor, ms, parameter, rowBounds, resultHandler, boundSql); //处理查询总数,返回 true 时继续分页查询,false 时直接返回 if (!dialect.afterCount(count, parameter, rowBounds)) { //当查询总数为 0 时,直接返回空的结果 return dialect.afterPage(new ArrayList(), parameter, rowBounds); } } resultList = ExecutorUtil.pageQuery(dialect, executor, ms, parameter, rowBounds, resultHandler, boundSql, cacheKey); } else { //rowBounds用参数值,不使用分页插件处理时,仍然支持默认的内存分页 resultList = executor.query(ms, parameter, rowBounds, resultHandler, cacheKey, boundSql); } return dialect.afterPage(resultList, parameter, rowBounds); } finally { if(dialect != null){ dialect.afterAll(); } } } 我们需要关注mybatis什么时候使用的这个ThreadLocal,也就是何时将分页参数获取的? 前面提到过,通过PageHelper的startPage()方法进行page缓存的设置,当程序执行sql接口mapper的方法时,就会被拦截器PageInterceptor拦截到。 PageHelper其实就是mybatis的分页插件,其实现原理就是通过拦截器的方式,pageHelper通PageInterceptor实现分页,我们只关注intercept方法。  iii. dialect.skip(ms, parameter, rowBounds) 此处的skip方法进行设置分页参数,内部调用方法: Page page = pageParams.getPage(parameterObject, rowBounds); 继续跟踪getPage(),发现此方法的第一行就获取了ThreadLocal的值: Page page = PageHelper.getLocalPage();  iv. ExecutorUtil.pageQuery resultList = ExecutorUtil.pageQuery(dialect, executor, ms, parameter, rowBounds, resultHandler, boundSql, cacheKey); 这是分页方法,此方法在执行分页之前,会判断是否执行分页,依据就是前面我们通过ThreadLocal的获取的page。  v. executor.query resultList = executor.query(ms, parameter, rowBounds, resultHandler, cacheKey, boundSql); 这是非分页方法,我们可以思考一下,如果ThreadLoad在使用后没有被清除,当执行非分页的方法时,那么就会将Limit拼接到sql后面。 为什么不分也得也会拼接?我们回头看下前面提到的dialect.skip(ms, parameterObject, rowBounds):   如上所示,只要page被获取到了,那么这个sql,就会走前面提到的ExecutorUtil.pageQuery分页逻辑,最终导致出现不可预料的情况。 其实PageHelper对于分页后的ThreaLocal是有清除处理的。 vi. clearPage() 在intercept方法的最后,会在sql方法执行完成后,清理page缓存:   看看这个afterAll()方法:   只关注 clearPage():  vii. Conclusion 整体看下来,似乎不会存在什么问题,但是我们可以考虑集中极端情况: • 如果使用了startPage(),但是没有执行对应的sql,那么就表明,当前线程ThreadLocal被设置了分页参数,可是没有被使用,当下一个使用此线程的请求来时,就会出现问题。 • 如果程序在执行sql前,发生异常了,就没办法执行finally当中的clearPage()方法,也会造成线程的ThreadLocal被污染。 所以,官方给我们的建议,在使用PageHelper进行分页时,执行sql的代码要紧跟startPage()方法。 除此之外,我们可以手动调用clearPage()方法 ,在存在问题的方法之前。  2. How to solve the problem 1. 确保PageHelper 方法调用后紧跟 MyBatis 查询方法,在查询前不要写任何逻辑处理,因为任何代码都可能产生Exception并发生线程复用的问题。 2. 如果原有不合理的代码太多,没办法一一修改,可以考虑Controller层增加切面,JSF接口增加Filter,手动调用clearPage()方法。代码示例如下: // 针对JSF接口的Filter @Slf4j public class BscJsfAspectForPageHelper extends AbstractFilter { public BscJsfAspectForPageHelper(){} @Override public ResponseMessage invoke(RequestMessage requestMessage) { try { log.info("BscJsfAspectForPageHelper.invoke For JSF PageHelper.clearPage()"); PageHelper.clearPage(); }catch (Exception e){ log.error("BscJsfAspectForPageHelper.invoke发生异常,error msg:", e); } return getNext().invoke(requestMessage); } } // XML配置 <bean id="bscJsfAspectForPageHelper" class="com.jdl.bsc.aspect.BscJsfAspectForPageHelper" scope="prototype"> </bean> // 针对Controller的切面 @Aspect @Component @Slf4j public class BscAspectForPageHelper{ @Pointcut("execution(public * com.jdl.bsc.controller.*.*(..)) ") public void bscAspectForPageHelper(){} @Before("bscAspectForPageHelper()") public void doBefore(JoinPoint joinPoint) { try { log.info("BscAspectForPageHelper.doBefore For PageHelper.clearPage()"); PageHelper.clearPage(); }catch (Exception e){ log.error("BscAspectForPageHelper.doBefore发生异常,error msg:", e); } } } 作者:京东物流 王崧 来源:京东云开发者社区 自猿其说 Tech 转载请注明来源

优秀的个人博客,低调大师

性能加速包: SpringBoot 2.7&JDK 17,你敢尝一尝吗 | 京东物流技术团队

前言 众所周知,SpringBoot3.0迎来了全面支持JDK17的局面,且最低支持版本就是JDK17,这就意味着,Spring社区将完全抛弃JDK8,全面转战JDK17。作为JAVA开源生态里的扛把子,Spring可以说是整个JAVA生态的风向标,可以说,当Spring转战JDK17,会很快带领JAVA生态全面的跟进JDK17。而我本篇文章重点讲述Spring版本和JDK17升级中的实践整理。 为什么是Spring Boot 2.7 Spring Boot 3.0是全面放弃JDK8,而Spring社区当然不会把事情做的那么决绝,在推出3.0之前,Spring就开始着手布局JDK17升级。而2.7版本,就是Spring社区为了升级JDK17而推出的过渡版本,具体包括一以下几个方面的升级和改进: 1. 支持了JDK 17的新特性,例如switch表达式、文本块、局部变量类型推断等。这使得在Spring应用程序中使用JDK 17的特性变得更加容易和方便。 2. 利用了JDK 17的性能优化:JDK 17引入了许多性能优化,例如新的垃圾收集器、线程调度等。Spring 2.7利用了这些性能优化,可以提高Spring应用程序的性能和响应速度。 3. 默认配置与JDK 17兼容:Spring Boot 2.7的默认配置与JDK 17兼容,这意味着您不需要进行额外的配置就可以在JDK 17上运行Spring Boot应用程序。这点很重要,Spring Boot 2.7依赖于Servlet 4.0,而Servlet 4.0本身并不直接支持JDK 17, Spring Boot 2.7为了支持JDK 17进行了一些兼容性调整和优化,以使其能够在JDK 17上运行。 4. 改进的安全性:JDK 17通过增强加密算法、禁用旧版TLS和SSL协议等增强了安全性。Spring Boot 2.7利用了这些安全改进,提高了应用程序的安全性。 5. 持续的性能优化和提升。相比于老系统的2.1到2.3版本,2.7版本对内存管理和bean管理都有很大程度的优化和提升,内存使用更加合理。虽然官网没有给出所谓的性能提升对比,但性能的优化和系统的稳定性是一定加强的。 总之,使用Spring Boot 2.7可以更好地利用JDK 17的特性,提高应用程序的性能和响应速度,同时还可以获得更好的兼容性和安全性。所以通过Spring Boot 2.7过渡升级JDK17,是一种更为温和方式,且遇到的兼容性问题最小。当然这不全是我自顾自说,Spring官方给出了这样的说明: If you’re currently running with an earlier version of Spring Boot, we strongly recommend that you upgrade to Spring Boot 2.7 before migrating to Spring Boot 3.0. 为什么是JDK17 关于JDK17的新特性和优势,对于它支持的新语法和编程特性,我在此不再赘述,因为网上有很多文章介绍。 对于我落地JDK17的动力主要源于两个方面:一是更为安全的语言特性,二是更加优异的垃圾回收器和性能提升。 a. 安全的语言特性 1. 安全性首先体现在JDK17对于包扫描和反射的权限控制,可能大家对当年的FastJson漏洞记忆犹新,它的病根在于对反射的滥用。而对于这种反射的滥用,在JDK17里有了更严格的控制。 JDK 17对反射进行了优化,主要表现在对反射调用进行了权限控制。具体来说,它通过setAccessible()方法启动或禁止访问安全检查开关。当参数值为true时,反射的对象在使用时取消安全检查,提高反射的效率;当参数值为false时,反射的对象执行安全检查。这样的优化使得在处理反射调用时,可以更加灵活地控制访问权限。 1. 除此之外,JDK 17增强了包扫描的权限控制。在之前的版本中,Java的包扫描是基于类的,而在JDK 17中,它扩展到了对整个包的权限控制。这使得开发者可以更加精细地控制对特定包的访问权限。 2. 针对于语法本身,引入了密封的类和接口,具体使用细节大家可以网上查看。通过密封类和接口,进一步增加了面向对象开发的封闭性,提升代码质量的安全可靠。 b. 垃圾收集器 JDK17引入了ZGC作为垃圾收集器,此处引用一下京东科技同事做的关于不同垃圾收集器在不同JDK版本下的压测结果: 压测服务背景: DOS平台上选择了不同配置的机器(2C4G、4C8G、8C16G),并分别使用JDK8、JDK11和JDK17进行部署和压测。整个压测过程限时60分钟,用180个虚拟用户并发请求一个接口,每次接口请求都创建512Kb的数据。最终产出不同GC回收器的各项指标数据,来分析GC的性能提升效果。  以上的压测结果对于我们来说非常诱人,ZGC配合JDK17的性能对于其他JDK和垃圾收集器组合来说是碾压获胜,且不论任何机器配置下,都推荐使用ZGC,ZGC的停顿时间达到亚毫秒级,吞吐量也比较高。这个对于一个高并发业务场景下,对于资源的优化是非常客观的。 c. OpenJDK17下载地址 提供了一个下载地址: https://adoptium.net/zh-cn/temurin/releases/?version=17&os=linux&arch=x64 行云部署上的实践方案 a. Spring Boot 2.7 1. pom.xml版本依赖 实践的版本选择上我选择了2.7大版本下的最新小版本,即Spring Boot 2.7.17版本。pom.xml依赖如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.jd.magnus</groupId> <artifactId>magnus-multi-ddd</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.17</version> </parent> <modules> <module>magnus-multi-ddd-adapter</module> <module>magnus-multi-ddd-application</module> <module>magnus-multi-ddd-domain</module> <module>magnus-multi-ddd-infrastructure</module> <module>magnus-multi-ddd-client</module> <module>magnus-multi-ddd-worker</module> </modules> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <jsf-lite.version>1.0.0-HOTFIX-T2</jsf-lite.version> <ump.version>20221231.1</ump.version> </properties> </project> 2. 动态配置 Spring Boot 2.7对动态配置进行了更新。具体来说,Spring Boot 2.7更改了自动配置注册文件的路径和格式,从META-INF/spring.factories变更为META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。 同时,Spring Boot 2.7还引入了新的注解@SpringBootApplication,该注解包含了@EnableAutoConfiguration和@ComponentScan等注解,使得配置更加简洁和方便。此外,Spring Boot 2.7还更新了一些自动配置的类和方法,以支持新版本的Spring Framework和Java。 1. 废弃的方法和类删除。列一下主要删除的方法和类: SpringBootServletInitializer:在Spring Boot 2.7中,该类已经被移除,建议使用SpringBootServletWebServerApplicationContext来代替。 ServletWebServerFactoryCustomizer:这个接口已经从Spring Boot 2.7中移除,可以使用WebServerFactoryCustomizer来代替。 BasicErrorController:这个类已经从Spring Boot 2.7中移除,可以使用ErrorController接口来代替。 ContentNegotiationStrategy:这个接口已经从Spring Boot 2.7中移除,可以使用RequestMappingHandlerMapping的setContentTypeResolver(ContentTypeResolver)方法来代替。 HttpMessageConverters:这个接口已经从Spring Boot 2.7中移除,可以使用HttpMessageConvertingComparator来代替。 HttpMessageConvertingComparator:这个类已经从Spring Boot 2.7中移除,可以使用ComparatorChain来代替。 ServletWebServerFactoryCustomizerBeanPostProcessor:这个类已经从Spring Boot 2.7中移除。 SpringBootApplicationContextLoader:这个类已经从Spring Boot 2.7中移除,可以使用SpringApplicationWebApplicationContext来代替。 SpringBootServletInitializerAutoConfiguration:这个类已经从Spring Boot 2.7中移除,可以使用SpringBootServletWebServerApplicationContextAutoConfiguration来代替。 此外,还有一些被移除的配置属性,例如spring.http.converters.preferred-json-mapper、spring.jackson.serialization-features.default-pretty-print-xml、spring.jackson.serialization-features.sort-property-names-by-default等。其他信息大家可以看Spring的版本更新说明: github上的release版本说明: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.7-Release-Notes  3. 单元测试升级 在Spring Boot 2.7版本,已经不再依赖JUnit4, 而是将Test换成了 JUnit Jupiter, 这也导致之前单元测试使用的方法和注解会产生变化。 常用的一些方法和注解变化如下: 变更项 JUnit4 JUnit Jupiter @Test注解 包路径: org.junit.Test 包路径: org.junit.jupiter.api.Test 断言 类:org.junit.Assert 类:rg.junit.jupiter.api.Assertions ,提供了更简洁的断言方法 @RunWith 需要使用@RunWith注解来指定测试运行器 @RunWith移除,不再需要,单侧只需要@SpringBootTest即可 参数化接口测试 @RunWith配合@Parameters实现参数化 @ParameterizedTest和@ValueSource注解配合使用  4. hibernate-validator包依赖问题 Springboot从2.3以后,spring-boot-starter-web中不再引入hibernate-validator,需要手动引入。此处可以直接引用spring-boot-starter-validation的包,里面会间接引用hibernate-validator的包,且版本号可以被spring boot parent统一管理。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 4. 诊断升级兼容性方法 如果是老项目版本升级,Spring Boot 提供了一种在启动时分析应用程序环境并打印诊断信息的方法,而且还可以在运行时为您临时迁移属性。要启用该功能,请将以下依赖项添加到您的项目中: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-properties-migrator</artifactId> <scope>runtime</scope> </dependency> b. 行云部署配置 1. 镜像配置 首先需要新的基础镜像包,包括OpenJDK17的。之前行云的镜像市场上是没有相关的镜像的,后来联系科技运维同事帮忙制作了新的镜像,新的镜像包是基于Tomcat应用类型的,大家可以在jdos的中国站的景象市场搜索到。镜像名如下,: base_tomcat/java-jd-centos7-jdk17-tomcat8.5.42-ngx197:latest 2. 编译配置 编译配置中,需要选择的JDK版本为17,同时Maven的版本也可以尽量选高一些。因为按照惯例,maven的版本会对JDK的版本兼容性有所不同,一般越是高版本的Maven对JDK17兼容性更好。虽然官方没有明确说明Maven版本支持情况,但我们选择高版本的Maven是比较稳妥的选择,所以在JDOS上我们选择maven-3.9.0版本比较好。  3. JVM参数配置 然后就是配置JVM启动参数,我们需要开启ZGC.具体启动参数以4C8G的资源为例,配置参数如下: -Xms5324m -Xmx5324m -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=256m -XX:MaxDirectMemorySize=983m -Djava.library.path=/usr/local/lib -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300 -XX:+UseZGC 此处需要注意,ZGC不要配置并行GC线程的数量,并发标记线程数等信息,配置了反而会出现启动报错情况。 c. 兼容性问题说明 关于兼容性问题之前一篇文章里详细介绍了,包括如何兼容京东的UMP, DUCC等。这些中间件的兼容性问题产生主要由于JDK17中对于反射和扫描的安全性检查导致的,一个简单的解决办法是将没开放的module强制对外开放。所以需要一些额外配置。 先整理结论,额外配置集合如下,该集合可以配置在VM 启动参数之中: --add-opens java.base/sun.security.action=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.math=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/sun.util.calendar=ALL-UNNAMED --add-opens java.base/java.util.concurrent=ALL-UNNAMED --add-opens java.base/java.util.concurrent.locks=ALL-UNNAMED --add-opens java.base/java.security=ALL-UNNAMED --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.management/java.lang.management=ALL-UNNAMED --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED --add-opens java.management/sun.management=ALL-UNNAMED --add-opens java.base/sun.security.action=ALL-UNNAMED --add-opens java.base/sun.net.util=ALL-UNNAMED 1. SGM依赖需要加入 --add-opens java.management/java.lang.management=ALL-UNNAMED --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED --add-opens java.management/sun.management=ALL-UNNAMED 2. R2M需要加入 --add-opens java.base/java.time=ALL-UNNAMED 3. DUCC依赖需要加入 --add-opens java.base/java.util.concurrent=ALL-UNNAMED --add-opens java.base/java.util.concurrent.locks=ALL-UNNAMED --add-opens java.base/java.security=ALL-UNNAMED --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED 4. AKS依赖需要加入 --add-exports java.base/sun.security.action=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.math=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/sun.util.calendar=ALL-UNNAMED 5. Pfinder依赖需要加入 --add-opens java.base/sun.net.util=ALL-UNNAMED 6. Swagger兼容性配置 分两步: 1. properties配置文件中增加一下配置: spring.mvc.pathmatch.matching-strategy=ant_path_matcher 1. 代码在配置类中新增BeanPostProcessor重写: /** * 增加如下配置可解决Spring Boot 2.7.15 与Swagger 3.0.0 不兼容问题 **/ @Bean public BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() { return new BeanPostProcessor() { @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) { customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); } return bean; } private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) { List<T> copy = mappings.stream().filter(mapping -> mapping.getPatternParser() == null).collect(Collectors.toList()); mappings.clear(); mappings.addAll(copy); } @SuppressWarnings("unchecked") private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) { try { Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); field.setAccessible(true); return (List<RequestMappingInfoHandlerMapping>) field.get(bean); } catch (IllegalArgumentException | IllegalAccessException e) { throw new IllegalStateException(e); } } }; } 7. JDK维度兼容性问题(只挑我遇到的问题重点说) • JDK11就删除了javaFX库,所以该库下的所有方法在JDK17中不可用。如果你是从JDK8直接升级到JDK17, 需要注意,javaFX下的javafx.util包方法有可能会被大家不小心用到。 以下列举一下javafx.util下的一些常用工具类(项目中尽量不要再用): 类名 方法说明 javafx.util.Pair getKey():获取 Pair 对象的键。 getValue():获取 Pair 对象的值。 setKey(K key):设置 Pair 对象的键。 setValue(V value):设置 Pair 对象的值。 avafx.util.Duration toSeconds():将持续时间转换为秒。 toMillis():将持续时间转换为毫秒。 toNanos():将持续时间转换为纳秒。 add(Duration other):将另一个持续时间添加到当前持续时间。 subtract(Duration other):从当前持续时间中减去另一个持续时间。 javafx.util.converter fromString(String value):将字符串值转换为目标类型。 toString(T value):将目标类型的值转换为字符串。 javafx.util.StringConverter fromString(String value):将字符串值转换为目标类型。 toString(T value):将目标类型的值转换为字符串。  • 其次, Java EE(Java Enterprise Edition)规范在 Java 9 之后被重新命名为 Jakarta EE。这是由于 Java EE 规范的开源版本迁移到了 Eclipse Foundation,并改名为 Jakarta EE。 因此有一些包名路径变更,为了兼容JSF,需要手动引入一些JAR包。但由于我们部署环境采用的是外置的Tomcat8,所以还是包含java EE的相关包。不需要额外加入,但本地debug时,需要加入。 尽管 Jakarta EE 是 Java EE 的继任者,但为了保持向后兼容性,许多 Java EE 规范和 API 在 Jakarta EE 中仍然存在,并且在 Jakarta EE 中的命名空间从 javax 变为 jakarta。且一些命名空间也改变了,比如javax包下的方法和属性都不能再试用,例如: javax.xml.bind.*更改为jakarta.xml.bind.*。以下有一个该问题引起的JSF报错修复: 关于JSF启动有报错信息:运行时找不到 javax.xml.bind.JAXBException 类。在 JDK 9 及更高版本中,javax.xml.bind 包被移除了,并且不再包含在标准的 Java SE 中。 如果您的项目依赖于 JAXB API,您可以尝试以下解决方法之一: 如果您使用的是 JDK 8 或更早版本,请确保您的项目使用的是兼容的 JDK 版本。 如果您使用的是 JDK 9 或更高版本,并且需要使用 JAXB API,您可以添加以下依赖项来解决该问题: <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>3.0.1</version> <!-- 根据您的需求选择合适的版本 --> </dependency> • 此处正好多说一下Spring boot 3.0的一个小问题,@Resource在Spring boot 3.0上,已经不再依赖javax.annoation包,所以包路径也由javax.annotation.Resource改为了jakarta.annotation.Resource。当然此处在2.7版本依然兼容,可以不用修改。 以下贴一个报名改动对比图: module packages replacement groupId replacement artifactId java.activation javax.activation com.sun.activation jakarta.activation java.xml.ws.annotation java.annotation jakarta.annotation jakarta.annotation-api java.xml.bind javax.xml.bind.* jakarta.xml.bind.com.sun.xml.bind jakarta.xml.bind-apijaxb-impl  垃圾回收器的话,从JDK14开始,已经删除了CMS,所以在JDK17下,只建议使用ZGC。 还有一个最大的变化是之前的--illegal-access参数不在可用,如果在java 17使用这个参数访问受限的api则会报出InaccessibleObjectException,大多数情况下只要升级了依赖项是不会碰到这个情况的,但如果出现问题,则可以使用--add-opens来对不可访问的api授权。以上的SGM,R2M,DUCC,AKS,Pfinder的兼容性问题都是因为这个特性变化引起的。 脚手架支持 目前最的DDD脚手架已经支持Spring Boot 2.7.17 和JDK17 ,下载脚本如下: mvn archetype:generate \ -DarchetypeGroupId=com.jd.magnus \ -DarchetypeArtifactId=magnus-multi-ddd-archetype \ -DarchetypeVersion=1.0.0-SNAPSHOT \ -DinteractiveMode=false \ -DarchetypeCatalog=remote \ -Dversion=1.0.0-SNAPSHOT \ -DgroupId=com.jdl.sps \ -DartifactId=bff-demo1 该脚手架以在京东内部申请为开源项目,开源项目地址如下: http://xingyun.jd.com/shendeng/openSource/detail/793 IDE配置注意事项 1. 在Idea中,需要安装JDK17,然后项目需要配置对应的JDK17版本,截图如下:  1. 大家有两种选择:1. 直接安装Idea JDK17插件。 2. 或者自己下载OpenJDK17安装,然后绑定路径。 modules也需要更改Language level, 截图如下:  1. 注意:对外的JSF client JDK还要用JDK8进行打包,也不要在client JDK中使用JDK17的新语法特性。因为外部依赖系统不一定是JDK17版本的。 2. 本地Debug注意事项。 当本地debug时,需要配置debug的启动参数,配置VM options,并将上面【行云部署上的实践方案-c.兼容性问题说明】章节中所说的兼容性问题配置添加到该处。如下图所示:   此方法也适用于本地debug JUnit Test单元测试本地调试时用。当然,如果为了避免每个单元测试都要手动配置,可以点击图中的Edit configuration templates,配置模板,做到一劳永逸。具体配置如下图所示:    1. Maven test注意事项。 同理,在使用maven命令对工程进行test命令时,也需要额外配置启动参数,来兼容JDK17订单安全性检查,需要在pom文件中的maven-surefire-plugin增加如下配置:   总结 目前,将部门内的京旗API服务, 发货平台BFF服务,物流发货商家基础信息服务作为试点,已经在行云测试环境上用JDK17+Spring Boot2.7版本进行试运行,京东三方依赖包括JSF lite版本,ducc, easyJob,jmq, 云redis, ump, pfinder。经测试,兼容性没有太大问题,服务可用。后续还会进一步观察和测试。 据我了解,现在开源社区里,以apache为代表的大型开源项目都对JDK17有了不错的兼容, 未来可以逐步再从Spring Boot 2.7升级到Spring Boot 3.0。  作者:京东物流 赵勇萍 来源:京东物流 自猿其说 Tech 转载请注明来源

优秀的个人博客,低调大师

线上JAVA应用平稳运行一段时间后出现JVM崩溃问题 | 京东云技术团队

一、问题是怎么发现的 系统是一个定时任务系统,需要定时执行业务代码,业务代码主要是访问MYSQL数据库和缓存进行操作,该开始启动,系统日志一切正常,但是运行一段时间到凌晨后,系统就自动崩溃了,java进程没有了,只留下了程序崩溃日志如下: cat: /proc/1/environ: Permission denied [admin@host-11-40-38-52 ~]$ more hs_err_pid231.log # # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x00007f21a8c21325, pid=231, tid=139779725313792 # # JRE version: Java(TM) SE Runtime Environment (8.0_20-b26) (build 1.8.0_20-b26) # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.20-b23 mixed mode linux-amd64 c ompressed oops) # Problematic frame: # V [libjvm.so+0x858325] LoadKlassNode::make(PhaseGVN&, Node*, Node*, TypePtr const*, TypeKlassPtr const*)+0x45 # # Core dump written. Default location: /home/admin/core or core.231 # # If you would like to submit a bug report, please visit: # http://bugreport.sun.com/bugreport/crash.jsp # --------------- T H R E A D --------------- Current thread (0x00007f21a4b80800): JavaThread "C2 CompilerThread5" daemon [_t hread_in_native, id=398, stack(0x00007f2100cfc000,0x00007f2100dfd000)] siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x0000000000 000010 Registers: RAX=0x00007f21a48fbab0, RBX=0x00007f21a48fe4b0, RCX=0x0000000000000000, RDX=0x00 000000fffffff4 RSP=0x00007f2100df9c40, RBP=0x00007f2100df9c80, RSI=0x00007f20b00e9050, RDI=0x00 007f1fe84e3650 R8 =0x00007f21a48fe4b0, R9 =0x00007f21a48fbab0, R10=0x00007f1ffc059d90, R11=0x00 007f21a8cf3560 R12=0x00007f2100dfad00, R13=0x00007f1fe84e3650, R14=0x00007f2100dfa100, R15=0x00 007f2100df9ee0 RIP=0x00007f21a8c21325, EFLAGS=0x0000000000010296, CSGSFS=0x0000000000000033, ER R=0x0000000000000004 TRAPNO=0x000000000000000e Top of Stack: (sp=0x00007f2100df9c40) 0x00007f2100df9c40: 00007f20b00e9050 00007f21a48fbab0 0x00007f2100df9c50: 00007f2100df9c80 00007f21a48fe4b0 0x00007f2100df9c60: 00007f21a48fd440 00007f1fe84e3650 0x00007f2100df9c70: 00007f21a8cf3560 00007f2100df9ee0 0x00007f2100df9c80: 00007f2100df9da0 00007f21a891acb6 0x00007f2100df9c90: 00007f1ffc5122a0 00007f20b00301d0 0x00007f2100df9ca0: 00007f2100df9ce0 00007f1ffc933fc0 0x00007f2100df9cb0: 00007f2100df9ee0 00007f1ffc933fc0 0x00007f2100df9cc0: 00007f2100df9cf0 00007f21a89ac798 0x00007f2100df9cd0: 00007f2100df9cf0 00007f2100dfad00 0x00007f2100df9ce0: 0000000000000000 0000000000000002 0x00007f2100df9cf0: 00007f1ffc933fc0 00007f1ffc93ba68 0x00007f2100df9d00: 0000000000000000 00007f1ffc93ba68 0x00007f2100df9d10: 00007f2100df9d30 00007f2100000002 0x00007f2100df9d20: 00007f1ffc93b828 0000000000000000 0x00007f2100df9d30: 00007f20b0029970 0000000500000004 0x00007f2100df9d40: 00007f20b00301d0 00007f00000001b0 0x00007f2100df9d50: 000000c700000e83 00007f1ffc93b828 0x00007f2100df9d60: 00007f2100dfa100 00007f1ffc5126a0 0x00007f2100df9d70: 0000000000001019 00007f1ffc933fc0 0x00007f2100df9d80: 00007f2100df9ee0 00007f2100df9db0 0x00007f2100df9d90: 0000000000000000 00007f2100df9fd8 0x00007f2100df9da0: 00007f2100df9df0 00007f21a8cd1b0a 0x00007f2100df9db0: 00007f2100df9ee0 0000000000000000 0x00007f2100df9dc0: 00007f1f00000001 00007f2100df9ee0 0x00007f2100df9dd0: 0000000000000000 00007f2100df9ee0 0x00007f2100df9de0: 0000000000000000 00000000000001b0 0x00007f2100df9df0: 00007f2100df9e30 00007f21a8cd46f0 0x00007f2100df9e00: 00007f2100df9e30 00007f2100dfabd0 0x00007f2100df9e10: 00007f20b00fd458 00007f2100df9ee0 0x00007f2100df9e20: 000000000000001f 00007f1ffc936508 0x00007f2100df9e30: 00007f2100df9e80 00007f21a8cd4967 Instructions: (pc=0x00007f21a8c21325) 0x00007f21a8c21305: c0 48 8b 02 4c 8b 67 10 49 89 fe 48 89 d7 ff 50 0x00007f21a8c21315: 28 8b 50 10 31 c9 83 ea 0e 83 fa 07 48 0f 42 c8 0x00007f21a8c21325: 8b 41 10 83 e8 10 83 f8 02 0f 87 9c 01 00 00 80 0x00007f21a8c21335: 79 32 00 0f 84 92 01 00 00 49 8b 06 49 89 df 48 Register to memory mapping: RAX=0x00007f21a48fbab0 is an unknown value RBX=0x00007f21a48fe4b0 is an unknown value RCX=0x0000000000000000 is an unknown value RDX=0x00000000fffffff4 is an unknown value RSP=0x00007f2100df9c40 is pointing into the stack for thread: 0x00007f21a4b80800 RBP=0x00007f2100df9c80 is pointing into the stack for thread: 0x00007f21a4b80800 RSI=0x00007f20b00e9050 is an unknown value RDI=0x00007f1fe84e3650 is an unknown value R8 =0x00007f21a48fe4b0 is an unknown value R9 =0x00007f21a48fbab0 is an unknown value R10=0x00007f1ffc059d90 is an unknown value R11=0x00007f21a8cf3560: <offset 0x92a560> in /home/export/servers/jdk1.8.0_20/jr e/lib/amd64/server/libjvm.so at 0x00007f21a83c9000 R12=0x00007f2100dfad00 is pointing into the stack for thread: 0x00007f21a4b80800 R13=0x00007f1fe84e3650 is an unknown value R14=0x00007f2100dfa100 is pointing into the stack for thread: 0x00007f21a4b80800 R15=0x00007f2100df9ee0 is pointing into the stack for thread: 0x00007f21a4b80800 Stack: [0x00007f2100cfc000,0x00007f2100dfd000], sp=0x00007f2100df9c40, free sp ace=1015k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [libjvm.so+0x858325] LoadKlassNode::make(PhaseGVN&, Node*, Node*, TypePtr co nst*, TypeKlassPtr const*)+0x45 V [libjvm.so+0x551cb6] Parse::catch_inline_exceptions(SafePointNode*)+0x946 V [libjvm.so+0x908b0a] Parse::do_exceptions()+0xba V [libjvm.so+0x90b6f0] Parse::do_one_block()+0x180 V [libjvm.so+0x90b967] Parse::do_all_blocks()+0x127 V [libjvm.so+0x90fd58] Parse::Parse(JVMState*, ciMethod*, float, Parse*)+0x7b8 V [libjvm.so+0x3e7d09] ParseGenerator::generate(JVMState*, Parse*)+0x99 V [libjvm.so+0x4931cc] Compile::Compile(ciEnv*, C2Compiler*, ciMethod*, int, b ool, bool, bool)+0x126c V [libjvm.so+0x3e67e8] C2Compiler::compile_method(ciEnv*, ciMethod*, int)+0x19 8 V [libjvm.so+0x49ba4a] CompileBroker::invoke_compiler_on_method(CompileTask*)+ 0xc8a V [libjvm.so+0x49e420] CompileBroker::compiler_thread_loop()+0x620 V [libjvm.so+0xa2990f] JavaThread::thread_main_inner()+0xdf V [libjvm.so+0xa29a3c] JavaThread::run()+0x11c V [libjvm.so+0x8e75f8] java_start(Thread*)+0x108 C [libpthread.so.0+0x7aa1] start_thread+0xd1 Current CompileTask: C2:43781461 13331 ! 4 com.mysql.cj.NativeSession::execSQL (579 bytes) --------------- P R O C E S S --------------- Java Threads: ( => current thread ) 0x00007f2010003800 JavaThread "qtp1589683045-1271" [_thread_blocked, id=142149 , stack(0x00007f20fa995000,0x00007f20faa96000)] 0x00007f1f58001800 JavaThread "Keep-Alive-Timer" daemon [_thread_blocked, id=1 40557, stack(0x00007f20f830e000,0x00007f20f840f000)] 0x00007f1fb005e800 JavaThread "logback-1" daemon [_thread_blocked, id=42936, s tack(0x00007f20fad99000,0x00007f20fae9a000)] 0x00007f1f7c0c3000 JavaThread "logback-8" daemon [_thread_blocked, id=565, sta ck(0x00007f20ea6f6000,0x00007f20ea7f7000)] 0x00007f1f50003000 JavaThread "logback-7" daemon [_thread_blocked, id=521, sta ck(0x00007f20fab97000,0x00007f20fac98000)] 0x00007f1f10001000 JavaThread "logback-6" daemon [_thread_blocked, id=520, sta ck(0x00007f20f002b000,0x00007f20f012c000)] 0x00007f1f74004800 JavaThread "logback-5" daemon [_thread_blocked, id=519, sta ck(0x00007f20f1830000,0x00007f20f1931000)] 0x00007f1f5441d000 JavaThread "UMP-CheckFileRemovedThread" daemon [_thread_blo cked, id=518, stack(0x00007f20ea7f7000,0x00007f20ea8f8000)] 0x00007f1f5441b800 JavaThread "UMP-ProfilerFileUpdateThread" daemon [_thread_b locked, id=517, stack(0x00007f20ea8f8000,0x00007f20ea9f9000)] 0x00007f1f54419800 JavaThread "UMP-WriteLog2FileThread-jvmLogger" daemon [_thr ead_blocked, id=516, stack(0x00007f20ea9f9000,0x00007f20eaafa000)] 0x00007f1f54418000 JavaThread "UMP-WriteLog2FileThread-commonLogger" daemon [_ thread_blocked, id=515, stack(0x00007f20eaafa000,0x00007f20eabfb000)] 0x00007f1f54416000 JavaThread "UMP-WriteLog2FileThread-tpLogger" daemon [_thre ad_blocked, id=514, stack(0x00007f20eabfb000,0x00007f20eacfc000)] 0x00007f1f5440f800 JavaThread "UMP-WriteLog2FileThread-bizLogger" daemon [_thr ead_blocked, id=513, stack(0x00007f20eacfc000,0x00007f20eadfd000)] 0x00007f1f54410800 JavaThread "UMP-WriteLog2FileThread-businessLogger" daemon [_thread_blocked, id=512, stack(0x00007f20eadfd000,0x00007f20eaefe000)] 0x00007f1f54408800 JavaThread "UMP-WriteLog2FileThread-aliveLogger" daemon [_t hread_blocked, id=511, stack(0x00007f20eaefe000,0x00007f20eafff000)] 0x00007f1f543da000 JavaThread "DatebookHikariCP2 housekeeper" daemon [_thread_ blocked, id=509, stack(0x00007f20f012c000,0x00007f20f022d000)] 0x00007f1f543cf800 JavaThread "Jim-NioEventLoop - 1" daemon [_thread_in_native , id=508, stack(0x00007f20f042d000,0x00007f20f052e000)] 0x00007f1f54259800 JavaThread "SystemClock" daemon [_thread_blocked, id=507, s tack(0x00007f20f172f000,0x00007f20f1830000)] 0x00007f1f54216000 JavaThread "DatebookHikariCP4 housekeeper" daemon [_thread_ blocked, id=505, stack(0x00007f20f289f000,0x00007f20f29a0000)] 0x00007f1f540b5000 JavaThread "UMP-WriteTPLogThread" daemon [_thread_blocked, id=504, stack(0x00007f20fa490000,0x00007f20fa591000)] 0x00007f1f50002000 JavaThread "logback-4" daemon [_thread_blocked, id=503, sta ck(0x00007f20fa38f000,0x00007f20fa490000)] 0x00007f1f74003000 JavaThread "logback-3" daemon [_thread_blocked, id=502, sta ck(0x00007f20f29a0000,0x00007f20f2aa1000)] 0x00007f21a4bc4000 JavaThread "http-nio-8001-Acceptor-0" daemon [_thread_in_na tive, id=501, stack(0x00007f20f1d31000,0x00007f20f1e32000)] 0x00007f21a4bc2000 JavaThread "http-nio-8001-ClientPoller-1" daemon [_thread_i n_native, id=500, stack(0x00007f20f1e32000,0x00007f20f1f33000)] 0x00007f21a4bc0000 JavaThread "http-nio-8001-ClientPoller-0" daemon [_thread_i n_native, id=499, stack(0x00007f20f1f33000,0x00007f20f2034000)] 0x00007f21a4bbe800 JavaThread "http-nio-8001-exec-10" daemon [_thread_blocked, id=498, stack(0x00007f20f2034000,0x00007f20f2135000)] 0x00007f21a4958800 JavaThread "http-nio-8001-exec-9" daemon [_thread_blocked, id=497, stack(0x00007f20f2135000,0x00007f20f2236000)] 0x00007f21a4956800 JavaThread "http-nio-8001-exec-8" daemon [_thread_blocked, id=496, stack(0x00007f20f2236000,0x00007f20f2337000)] 0x00007f21a4955000 JavaThread "http-nio-8001-exec-7" daemon [_thread_blocked, id=495, stack(0x00007f20f2337000,0x00007f20f2438000)] 0x00007f21a4953800 JavaThread "http-nio-8001-exec-6" daemon [_thread_blocked, id=494, stack(0x00007f20f2438000,0x00007f20f2539000)] 0x00007f21a4952000 JavaThread "http-nio-8001-exec-5" daemon [_thread_blocked, id=493, stack(0x00007f20f2539000,0x00007f20f263a000)] 0x00007f21a4b7e800 JavaThread "http-nio-8001-exec-4" daemon [_thread_blocked, id=492, stack(0x00007f20f263a000,0x00007f20f273b000)] 0x00007f21a4b7d000 JavaThread "http-nio-8001-exec-3" daemon [_thread_blocked, id=491, stack(0x00007f20f273b000,0x00007f20f283c000)] 0x00007f21a4b7b800 JavaThread "http-nio-8001-exec-2" daemon [_thread_blocked, id=490, stack(0x00007f20f2cfd000,0x00007f20f2dfe000)] 0x00007f21a4b7a000 JavaThread "http-nio-8001-exec-1" daemon [_thread_blocked, id=489, stack(0x00007f20f2dfe000,0x00007f20f2eff000)] 0x00007f21a4b78800 JavaThread "ContainerBackgroundProcessor[StandardEngine[Cat alina]]" daemon [_thread_blocked, id=488, stack(0x00007f20f2aa1000,0x00007f20f2b a2000)] 0x00007f1f7cb62800 JavaThread "scheduling-1" [_thread_in_native, id=487, stack (0x00007f20f2ba2000,0x00007f20f2ca3000)] 0x00007f1f74001000 JavaThread "logback-2" daemon [_thread_blocked, id=486, sta ck(0x00007f20f2eff000,0x00007f20f3000000)] 0x00007f1f7ca2b800 JavaThread "Jim-ConfigPoolingHeartbeat-1571143858733" daemo n [_thread_in_native, id=442, stack(0x00007f20f800b000,0x00007f20f810c000)] 0x00007f1f7c913800 JavaThread "mysql-cj-abandoned-connection-cleanup" daemon [ _thread_blocked, id=441, stack(0x00007f20f8833000,0x00007f20f8934000)] 0x00007f1f7c7b8800 JavaThread "configurator-supervise" daemon [_thread_blocked , id=440, stack(0x00007f20f810c000,0x00007f20f820d000)] 0x00007f1f7c7b7000 JavaThread "Thread-51" daemon [_thread_blocked, id=439, sta ck(0x00007f20f820d000,0x00007f20f830e000)] 0x00007f1f7c71e000 JavaThread "JSF-Future-Checker-CB-1-T-1" daemon [_thread_bl ocked, id=436, stack(0x00007f20f8b34000,0x00007f20f8c35000)] 0x00007f1f7c71d800 JavaThread "JSF-Future-Checker-0-T-1" daemon [_thread_block ed, id=435, stack(0x00007f20f9bc2000,0x00007f20f9cc3000)] 0x00007f1f7c3ba000 JavaThread "logback-1" daemon [_thread_blocked, id=433, sta ck(0x00007f20f9635000,0x00007f20f9736000)] 0x00007f21a4e27800 JavaThread "NioBlockingSelector.BlockPoller-1" daemon [_thr ead_in_native, id=429, stack(0x00007f20fa591000,0x00007f20fa692000)] 0x00007f2030001000 JavaThread "qtp1589683045-59 Selector15" [_thread_in_native , id=414, stack(0x00007f20fb39f000,0x00007f20fb4a0000)] 0x00007f21a4da0800 JavaThread "GC Daemon" daemon [_thread_blocked, id=413, sta ck(0x00007f20fbafd000,0x00007f20fbbfe000)] 0x00007f21a4baa000 JavaThread "Service Thread" daemon [_thread_blocked, id=411 , stack(0x00007f20fbeff000,0x00007f20fc000000)] 0x00007f21a4b9a800 JavaThread "C1 CompilerThread17" daemon [_thread_blocked, i d=410, stack(0x00007f21000f0000,0x00007f21001f1000)] 0x00007f21a4b98800 JavaThread "C1 CompilerThread16" daemon [_thread_blocked, i d=409, stack(0x00007f21001f1000,0x00007f21002f2000)] 0x00007f21a4b96800 JavaThread "C1 CompilerThread15" daemon [_thread_blocked, i d=408, stack(0x00007f21002f2000,0x00007f21003f3000)] 0x00007f21a4b94800 JavaThread "C1 CompilerThread14" daemon [_thread_blocked, i d=407, stack(0x00007f21003f3000,0x00007f21004f4000)] 0x00007f21a4b92000 JavaThread "C1 CompilerThread13" daemon [_thread_blocked, i d=406, stack(0x00007f21004f4000,0x00007f21005f5000)] 0x00007f21a4b90000 JavaThread "C1 CompilerThread12" daemon [_thread_blocked, i d=405, stack(0x00007f21005f5000,0x00007f21006f6000)] 0x00007f21a4b8e000 JavaThread "C2 CompilerThread11" daemon [_thread_blocked, i d=404, stack(0x00007f21006f6000,0x00007f21007f7000)] 0x00007f21a4b8b800 JavaThread "C2 CompilerThread10" daemon [_thread_blocked, i d=403, stack(0x00007f21007f7000,0x00007f21008f8000)] 0x00007f21a4b89800 JavaThread "C2 CompilerThread9" daemon [_thread_blocked, id =402, stack(0x00007f21008f8000,0x00007f21009f9000)] 0x00007f21a4b87000 JavaThread "C2 CompilerThread8" daemon [_thread_blocked, id =401, stack(0x00007f21009f9000,0x00007f2100afa000)] 0x00007f21a4b85000 JavaThread "C2 CompilerThread7" daemon [_thread_blocked, id =400, stack(0x00007f2100afa000,0x00007f2100bfb000)] 0x00007f21a4b83000 JavaThread "C2 CompilerThread6" daemon [_thread_blocked, id =399, stack(0x00007f2100bfb000,0x00007f2100cfc000)] =>0x00007f21a4b80800 JavaThread "C2 CompilerThread5" daemon [_thread_in_native, id=398, stack(0x00007f2100cfc000,0x00007f2100dfd000)] 0x00007f21a4b76800 JavaThread "C2 CompilerThread4" daemon [_thread_blocked, id =397, stack(0x00007f2100dfd000,0x00007f2100efe000)] 0x00007f21a4b74000 JavaThread "C2 CompilerThread3" daemon [_thread_blocked, id =396, stack(0x00007f2100efe000,0x00007f2100fff000)] 0x00007f21a4b72000 JavaThread "C2 CompilerThread2" daemon [_thread_blocked, id =395, stack(0x00007f2108098000,0x00007f2108199000)] 0x00007f21a4b6f800 JavaThread "C2 CompilerThread1" daemon [_thread_blocked, id =394, stack(0x00007f2108199000,0x00007f210829a000)] 0x00007f21a4b6e000 JavaThread "C2 CompilerThread0" daemon [_thread_blocked, id =393, stack(0x00007f210829a000,0x00007f210839b000)] 0x00007f21a4b6b000 JavaThread "qtp1589683045-38 Selector14" [_thread_in_native , id=392, stack(0x00007f210839b000,0x00007f210849c000)] 0x00007f21a4b69000 JavaThread "qtp1589683045-37 Selector13" [_thread_in_native , id=391, stack(0x00007f210849c000,0x00007f210859d000)] 0x00007f21a4b67000 JavaThread "qtp1589683045-36 Selector12" [_thread_in_native , id=390, stack(0x00007f210859d000,0x00007f210869e000)] 0x00007f21a4b65000 JavaThread "qtp1589683045-35 Selector11" [_thread_in_native , id=389, stack(0x00007f210869e000,0x00007f210879f000)] 0x00007f21a4b62800 JavaThread "qtp1589683045-34 Selector10" [_thread_in_native , id=388, stack(0x00007f210879f000,0x00007f21088a0000)] 0x00007f21a4b60800 JavaThread "qtp1589683045-33 Selector9" [_thread_in_native, id=387, stack(0x00007f21088a0000,0x00007f21089a1000)] 0x00007f21a4b5e800 JavaThread "qtp1589683045-32 Selector8" [_thread_in_native, id=386, stack(0x00007f21089a1000,0x00007f2108aa2000)] 0x00007f21a4b5c800 JavaThread "qtp1589683045-31 Selector7" [_thread_in_native, id=385, stack(0x00007f2108aa2000,0x00007f2108ba3000)] 0x00007f21a4b5a800 JavaThread "qtp1589683045-30 Selector6" [_thread_in_native, id=384, stack(0x00007f2108ba3000,0x00007f2108ca4000)] 0x00007f21a4b58800 JavaThread "qtp1589683045-29 Selector5" [_thread_in_native, id=383, stack(0x00007f2108ca4000,0x00007f2108da5000)] 0x00007f21a4b56800 JavaThread "qtp1589683045-28 Selector4" [_thread_in_native, id=382, stack(0x00007f2108da5000,0x00007f2108ea6000)] 0x00007f21a4b54800 JavaThread "qtp1589683045-27 Selector3" [_thread_in_native, id=381, stack(0x00007f2108ea6000,0x00007f2108fa7000)] 0x00007f21a4b52800 JavaThread "qtp1589683045-26 Selector2" [_thread_in_native, id=380, stack(0x00007f2108fa7000,0x00007f21090a8000)] 0x00007f21a4b50800 JavaThread "qtp1589683045-25 Selector1" [_thread_in_native, id=379, stack(0x00007f21090a8000,0x00007f21091a9000)] 0x00007f21a49ad800 JavaThread "qtp1589683045-24 Selector0" [_thread_in_native, id=378, stack(0x00007f21091a9000,0x00007f21092aa000)] 0x00007f21a49ac000 JavaThread "qtp1589683045-23 Acceptor15 SelectChannelConnec tor@0.0.0.0:7001 STARTING" [_thread_blocked, id=377, stack(0x00007f21092aa000,0x 00007f21093ab000)] 0x00007f21a49a8800 JavaThread "qtp1589683045-22 Acceptor14 SelectChannelConnec tor@0.0.0.0:7001 STARTING" [_thread_blocked, id=376, stack(0x00007f21093ab000,0x 00007f21094ac000)] 0x00007f21a49a6800 JavaThread "qtp1589683045-21 Acceptor13 SelectChannelConnec tor@0.0.0.0:7001 STARTING" [_thread_blocked, id=375, stack(0x00007f21094ac000,0x 00007f21095ad000)] 0x00007f21a49a4800 JavaThread "qtp1589683045-20 Acceptor12 SelectChannelConnec tor@0.0.0.0:7001 STARTING" [_thread_blocked, id=374, stack(0x00007f21095ad000,0x 00007f21096ae000)] 0x00007f21a49a2800 JavaThread "qtp1589683045-19 Acceptor11 SelectChannelConnec tor@0.0.0.0:7001 STARTING" [_thread_blocked, id=373, stack(0x00007f21096ae000,0x 00007f21097af000)] 0x00007f21a49a0800 JavaThread "qtp1589683045-18 Acceptor10 SelectChannelConnec tor@0.0.0.0:7001 STARTING" [_thread_blocked, id=372, stack(0x00007f21097af000,0x 00007f21098b0000)] 0x00007f21a499e800 JavaThread "qtp1589683045-17 Acceptor9 SelectChannelConnect or@0.0.0.0:7001 STARTING" [_thread_blocked, id=371, stack(0x00007f21098b0000,0x0 0007f21099b1000)] 0x00007f21a499d800 JavaThread "qtp1589683045-16 Acceptor7 SelectChannelConnect or@0.0.0.0:7001 STARTING" [_thread_in_native, id=370, stack(0x00007f21099b1000,0 x00007f2109ab2000)] 0x00007f21a4994800 JavaThread "qtp1589683045-15 Acceptor8 SelectChannelConnect or@0.0.0.0:7001 STARTING" [_thread_blocked, id=369, stack(0x00007f2109ab2000,0x0 0007f2109bb3000)] 0x00007f21a4992800 JavaThread "qtp1589683045-14 Acceptor6 SelectChannelConnect or@0.0.0.0:7001 STARTING" [_thread_blocked, id=368, stack(0x00007f2109bb3000,0x0 0007f2109cb4000)] 0x00007f21a4990800 JavaThread "qtp1589683045-13 Acceptor3 SelectChannelConnect or@0.0.0.0:7001 STARTING" [_thread_blocked, id=367, stack(0x00007f2109cb4000,0x0 0007f2109db5000)] 0x00007f21a498e800 JavaThread "qtp1589683045-12 Acceptor2 SelectChannelConnect or@0.0.0.0:7001 STARTING" [_thread_blocked, id=366, stack(0x00007f2109db5000,0x0 0007f2109eb6000)] 0x00007f21a498c800 JavaThread "qtp1589683045-11 Acceptor5 SelectChannelConnect or@0.0.0.0:7001 STARTING" [_thread_blocked, id=365, stack(0x00007f2109eb6000,0x0 0007f2109fb7000)] 0x00007f21a498a800 JavaThread "qtp1589683045-10 Acceptor4 SelectChannelConnect or@0.0.0.0:7001 STARTING" [_thread_blocked, id=364, stack(0x00007f2109fb7000,0x0 0007f210a0b8000)] 0x00007f21a4988800 JavaThread "qtp1589683045-9 Acceptor1 SelectChannelConnecto r@0.0.0.0:7001 STARTING" [_thread_blocked, id=363, stack(0x00007f210a0b8000,0x00 007f210a1b9000)] 0x00007f21a4987000 JavaThread "qtp1589683045-8 Acceptor0 SelectChannelConnecto r@0.0.0.0:7001 STARTING" [_thread_blocked, id=362, stack(0x00007f210a1b9000,0x00 007f210a2ba000)] 0x00007f21a497c000 JavaThread "HashSessionScavenger-0" daemon [_thread_blocked , id=361, stack(0x00007f210a2ba000,0x00007f210a3bb000)] 0x00007f21a46a5800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id= 360, stack(0x00007f210abec000,0x00007f210aced000)] 0x00007f21a4676800 JavaThread "Finalizer" daemon [_thread_blocked, id=359, sta ck(0x00007f210aced000,0x00007f210adee000)] 0x00007f21a4674800 JavaThread "Reference Handler" daemon [_thread_blocked, id= 358, stack(0x00007f210adee000,0x00007f210aeef000)] 0x00007f21a400b000 JavaThread "main" [_thread_in_native, id=243, stack(0x00007 f21a9e2b000,0x00007f21a9f2c000)] Other Threads: 0x00007f21a466d800 VMThread [stack: 0x00007f210aeef000,0x00007f210aff0000] [id =355] 0x00007f21a4bad000 WatcherThread [stack: 0x00007f20fbdfe000,0x00007f20fbeff000 ] [id=412] VM state:not at safepoint (normal execution) VM Mutex/Monitor currently owned by a thread: None Heap: PSYoungGen total 1305088K, used 1009509K [0x000000076ab00000, 0x00000007c0 000000, 0x00000007c0000000) eden space 1209856K, 82% used [0x000000076ab00000,0x00000007a7b58fa8,0x0000000 7b4880000) from space 95232K, 10% used [0x00000007ba300000,0x00000007bac804c0,0x00000007c 0000000) to space 92672K, 0% used [0x00000007b4880000,0x00000007b4880000,0x00000007ba 300000) ParOldGen total 2796544K, used 50182K [0x00000006c0000000, 0x000000076ab0 0000, 0x000000076ab00000) object space 2796544K, 1% used [0x00000006c0000000,0x00000006c31019c8,0x000000 076ab00000) Metaspace used 69176K, capacity 71536K, committed 71808K, reserved 111206 4K class space used 7973K, capacity 8461K, committed 8576K, reserved 1048576K Card table byte_map: [0x00007f21937c9000,0x00007f2193fca000] byte_map_base: 0x00 007f21901c9000 Marking Bits: (ParMarkBitMap*) 0x00007f21a9320ac0 Begin Bits: [0x00007f20a4000000, 0x00007f20a8000000) End Bits: [0x00007f20a8000000, 0x00007f20ac000000) Polling page: 0x00007f21a9f33000 CodeCache: size=245760Kb used=45854Kb max_used=45878Kb free=199905Kb bounds [0x00007f219438a000, 0x00007f219709a000, 0x00007f21a338a000] total_blobs=11396 nmethods=10825 adapters=479 compilation: enabled Compilation events (10 events): Event: 42853.758 Thread 0x00007f21a4b98800 nmethod 13322 0x00007f21967d2650 code [0x00007f21967d2840, 0x00007f21967d30f8] Event: 42941.467 Thread 0x00007f21a4b89800 13327 4 java.util.concurr ent.ScheduledThreadPoolExecutor$DelayedWorkQueue::add (9 bytes) Event: 42941.467 Thread 0x00007f21a4b87000 13328 ! 4 java.util.concurr ent.ScheduledThreadPoolExecutor$DelayedWorkQueue::offer (124 bytes) Event: 42941.467 Thread 0x00007f21a4b80800 13329 4 java.util.concurr ent.ThreadPoolExecutor::ensurePrestart (41 bytes) Event: 42941.469 Thread 0x00007f21a4b80800 nmethod 13329 0x00007f21967d0dd0 code [0x00007f21967d0f20, 0x00007f21967d0ff8] Event: 42941.493 Thread 0x00007f21a4b87000 nmethod 13328 0x00007f219708a2d0 code [0x00007f219708a540, 0x00007f219708b680] Event: 42941.493 Thread 0x00007f21a4b89800 nmethod 13327 0x00007f2197070390 code [0x00007f2197070600, 0x00007f2197071700] Event: 43421.467 Thread 0x00007f21a4b74000 13330 4 com.mysql.cj.resu lt.DefaultColumnDefinition::<init> (41 bytes) Event: 43421.469 Thread 0x00007f21a4b74000 nmethod 13330 0x00007f2196854910 code [0x00007f2196854a60, 0x00007f2196854b78] Event: 43781.449 Thread 0x00007f21a4b80800 13331 ! 4 com.mysql.cj.Nati veSession::execSQL (579 bytes) GC Heap History (10 events): Event: 2901.101 GC heap before {Heap before GC invocations=9 (full 3): PSYoungGen total 1223168K, used 1048576K [0x000000076ab00000, 0x00000007c0 000000, 0x00000007c0000000) eden space 1048576K, 100% used [0x000000076ab00000,0x00000007aab00000,0x000000 07aab00000) from space 174592K, 0% used [0x00000007aab00000,0x00000007aab00000,0x00000007b 5580000) to space 101376K, 0% used [0x00000007b9d00000,0x00000007b9d00000,0x00000007c 0000000) ParOldGen total 2796544K, used 50126K [0x00000006c0000000, 0x000000076ab0 0000, 0x000000076ab00000) object space 2796544K, 1% used [0x00000006c0000000,0x00000006c30f39b8,0x000000 076ab00000) Metaspace used 67592K, capacity 69946K, committed 70144K, reserved 111206 4K class space used 7943K, capacity 8414K, committed 8448K, reserved 1048576K Event: 2901.121 GC heap after Heap after GC invocations=9 (full 3): PSYoungGen total 1296896K, used 14251K [0x000000076ab00000, 0x00000007c000 0000, 0x00000007c0000000) eden space 1195520K, 0% used [0x000000076ab00000,0x000000076ab00000,0x00000007 b3a80000) from space 101376K, 14% used [0x00000007b9d00000,0x00000007baaeaf98,0x00000007 c0000000) to space 100864K, 0% used [0x00000007b3a80000,0x00000007b3a80000,0x00000007b 9d00000) ParOldGen total 2796544K, used 50150K [0x00000006c0000000, 0x000000076ab0 0000, 0x000000076ab00000) object space 2796544K, 1% used [0x00000006c0000000,0x00000006c30f99c8,0x000000 076ab00000) Metaspace used 67592K, capacity 69946K, committed 70144K, reserved 111206 4K class space used 7943K, capacity 8414K, committed 8448K, reserved 1048576K } Event: 10747.104 GC heap before {Heap before GC invocations=10 (full 3): PSYoungGen total 1296896K, used 1209771K [0x000000076ab00000, 0x00000007c0 000000, 0x00000007c0000000) eden space 1195520K, 100% used [0x000000076ab00000,0x00000007b3a80000,0x000000 07b3a80000) from space 101376K, 14% used [0x00000007b9d00000,0x00000007baaeaf98,0x00000007 c0000000) to space 100864K, 0% used [0x00000007b3a80000,0x00000007b3a80000,0x00000007b 9d00000) ParOldGen total 2796544K, used 50150K [0x00000006c0000000, 0x000000076ab0 0000, 0x000000076ab00000) object space 2796544K, 1% used [0x00000006c0000000,0x00000006c30f99c8,0x000000 076ab00000) Metaspace used 68322K, capacity 70672K, committed 70912K, reserved 111206 4K class space used 7963K, capacity 8423K, committed 8448K, reserved 1048576K Event: 10747.119 GC heap after Heap after GC invocations=10 (full 3): PSYoungGen total 1296384K, used 10324K [0x000000076ab00000, 0x00000007c000 0000, 0x00000007c0000000) eden space 1195520K, 0% used [0x000000076ab00000,0x000000076ab00000,0x00000007 b3a80000) from space 100864K, 10% used [0x00000007b3a80000,0x00000007b44951c8,0x00000007 b9d00000) to space 99840K, 0% used [0x00000007b9e80000,0x00000007b9e80000,0x00000007c0 000000) ParOldGen total 2796544K, used 50158K [0x00000006c0000000, 0x000000076ab0 0000, 0x000000076ab00000) object space 2796544K, 1% used [0x00000006c0000000,0x00000006c30fb9c8,0x000000 076ab00000) Metaspace used 68322K, capacity 70672K, committed 70912K, reserved 111206 4K class space used 7963K, capacity 8423K, committed 8448K, reserved 1048576K } Event: 18892.422 GC heap before {Heap before GC invocations=11 (full 3): PSYoungGen total 1296384K, used 1205844K [0x000000076ab00000, 0x00000007c0 000000, 0x00000007c0000000) eden space 1195520K, 100% used [0x000000076ab00000,0x00000007b3a80000,0x000000 07b3a80000) from space 100864K, 10% used [0x00000007b3a80000,0x00000007b44951c8,0x00000007 b9d00000) to space 99840K, 0% used [0x00000007b9e80000,0x00000007b9e80000,0x00000007c0 000000) ParOldGen total 2796544K, used 50158K [0x00000006c0000000, 0x000000076ab0 0000, 0x000000076ab00000) object space 2796544K, 1% used [0x00000006c0000000,0x00000006c30fb9c8,0x000000 076ab00000) Metaspace used 68759K, capacity 71020K, committed 71168K, reserved 111206 4K class space used 7970K, capacity 8429K, committed 8448K, reserved 1048576K Event: 18892.439 GC heap after Heap after GC invocations=11 (full 3): PSYoungGen total 1299968K, used 9668K [0x000000076ab00000, 0x00000007c0000 000, 0x00000007c0000000) eden space 1200128K, 0% used [0x000000076ab00000,0x000000076ab00000,0x00000007 b3f00000) from space 99840K, 9% used [0x00000007b9e80000,0x00000007ba7f11f8,0x00000007c0 000000) to space 97792K, 0% used [0x00000007b3f00000,0x00000007b3f00000,0x00000007b9 e80000) ParOldGen total 2796544K, used 50166K [0x00000006c0000000, 0x000000076ab0 0000, 0x000000076ab00000) object space 2796544K, 1% used [0x00000006c0000000,0x00000006c30fd9c8,0x000000 076ab00000) Metaspace used 68759K, capacity 71020K, committed 71168K, reserved 111206 4K class space used 7970K, capacity 8429K, committed 8448K, reserved 1048576K } Event: 27681.725 GC heap before {Heap before GC invocations=12 (full 3): PSYoungGen total 1299968K, used 1209796K [0x000000076ab00000, 0x00000007c0 000000, 0x00000007c0000000) eden space 1200128K, 100% used [0x000000076ab00000,0x00000007b3f00000,0x000000 07b3f00000) from space 99840K, 9% used [0x00000007b9e80000,0x00000007ba7f11f8,0x00000007c0 000000) to space 97792K, 0% used [0x00000007b3f00000,0x00000007b3f00000,0x00000007b9 e80000) ParOldGen total 2796544K, used 50166K [0x00000006c0000000, 0x000000076ab0 0000, 0x000000076ab00000) object space 2796544K, 1% used [0x00000006c0000000,0x00000006c30fd9c8,0x000000 076ab00000) Metaspace used 68898K, capacity 71216K, committed 71424K, reserved 111206 4K class space used 7971K, capacity 8429K, committed 8448K, reserved 1048576K Event: 27681.740 GC heap after Heap after GC invocations=12 (full 3): PSYoungGen total 1297920K, used 9809K [0x000000076ab00000, 0x00000007c0000 000, 0x00000007c0000000) eden space 1200128K, 0% used [0x000000076ab00000,0x000000076ab00000,0x00000007 b3f00000) from space 97792K, 10% used [0x00000007b3f00000,0x00000007b48944d0,0x00000007b 9e80000) to space 95232K, 0% used [0x00000007ba300000,0x00000007ba300000,0x00000007c0 000000) ParOldGen total 2796544K, used 50174K [0x00000006c0000000, 0x000000076ab0 0000, 0x000000076ab00000) object space 2796544K, 1% used [0x00000006c0000000,0x00000006c30ff9c8,0x000000 076ab00000) Metaspace used 68898K, capacity 71216K, committed 71424K, reserved 111206 4K class space used 7971K, capacity 8429K, committed 8448K, reserved 1048576K } Event: 36688.570 GC heap before {Heap before GC invocations=13 (full 3): PSYoungGen total 1297920K, used 1209937K [0x000000076ab00000, 0x00000007c0 000000, 0x00000007c0000000) eden space 1200128K, 100% used [0x000000076ab00000,0x00000007b3f00000,0x000000 07b3f00000) from space 97792K, 10% used [0x00000007b3f00000,0x00000007b48944d0,0x00000007b 9e80000) to space 95232K, 0% used [0x00000007ba300000,0x00000007ba300000,0x00000007c0 000000) ParOldGen total 2796544K, used 50174K [0x00000006c0000000, 0x000000076ab0 0000, 0x000000076ab00000) object space 2796544K, 1% used [0x00000006c0000000,0x00000006c30ff9c8,0x000000 076ab00000) Metaspace used 69049K, capacity 71376K, committed 71552K, reserved 111206 4K class space used 7972K, capacity 8461K, committed 8576K, reserved 1048576K Event: 36688.584 GC heap after Heap after GC invocations=13 (full 3): PSYoungGen total 1305088K, used 9729K [0x000000076ab00000, 0x00000007c0000 000, 0x00000007c0000000) eden space 1209856K, 0% used [0x000000076ab00000,0x000000076ab00000,0x00000007 b4880000) from space 95232K, 10% used [0x00000007ba300000,0x00000007bac804c0,0x00000007c 0000000) to space 92672K, 0% used [0x00000007b4880000,0x00000007b4880000,0x00000007ba 300000) ParOldGen total 2796544K, used 50182K [0x00000006c0000000, 0x000000076ab0 0000, 0x000000076ab00000) object space 2796544K, 1% used [0x00000006c0000000,0x00000006c31019c8,0x000000 076ab00000) Metaspace used 69049K, capacity 71376K, committed 71552K, reserved 111206 4K class space used 7972K, capacity 8461K, committed 8576K, reserved 1048576K } Deoptimization events (10 events): Event: 12281.446 Thread 0x00007f1f7cb62800 Uncommon trap: reason=unreached actio n=reinterpret pc=0x00007f2195f964f0 method=com.mysql.cj.result.DefaultColumnDefi nition.findColumn(Ljava/lang/String;ZI)I @ 28 Event: 13726.994 Thread 0x00007f1f74001000 Uncommon trap: reason=unreached actio n=reinterpret pc=0x00007f2196c65958 method=java.util.concurrent.ScheduledThreadP oolExecutor$DelayedWorkQueue.take()Ljava/util/concurrent/RunnableScheduledFuture ; @ 59 Event: 14951.443 Thread 0x00007f1f7cb62800 Uncommon trap: reason=range_check act ion=make_not_entrant pc=0x00007f21966609f0 method=java.util.DualPivotQuicksort.s ort([IIIZ)V @ 56 Event: 14951.507 Thread 0x00007f1f543cf800 Uncommon trap: reason=unreached actio n=reinterpret pc=0x00007f2196a0fad0 method=io.netty.util.internal.shaded.org.jct ools.queues.MpscArrayQueue.poll()Ljava/lang/Object; @ 28 Event: 14951.507 Thread 0x00007f1f543cf800 Uncommon trap: reason=unreached actio n=reinterpret pc=0x00007f2196196cf8 method=io.netty.buffer.PooledByteBuf.interna lNioBuffer()Ljava/nio/ByteBuffer; @ 6 Event: 16841.448 Thread 0x00007f1f543cf800 Uncommon trap: reason=unreached actio n=reinterpret pc=0x00007f21965db2ec method=java.util.concurrent.locks.AbstractQu euedSynchronizer.doReleaseShared()V @ 69 Event: 43243.574 Thread 0x00007f1f54408800 Uncommon trap: reason=unreached actio n=reinterpret pc=0x00007f21959945c4 method=com.jd.ump.profiler.util.MessagesStor e$WriteLog2File.run()V @ 22 Event: 43243.574 Thread 0x00007f1f54410800 Uncommon trap: reason=unreached actio n=reinterpret pc=0x00007f21959945c4 method=com.jd.ump.profiler.util.MessagesStor e$WriteLog2File.run()V @ 22 Event: 43243.575 Thread 0x00007f1f5440f800 Uncommon trap: reason=unreached actio n=reinterpret pc=0x00007f21959945c4 method=com.jd.ump.profiler.util.MessagesStor e$WriteLog2File.run()V @ 22 Event: 43243.575 Thread 0x00007f1f54418000 Uncommon trap: reason=unreached actio n=reinterpret pc=0x00007f21959945c4 method=com.jd.ump.profiler.util.MessagesStor e$WriteLog2File.run()V @ 22 Internal exceptions (10 events): Event: 42812.465 Thread 0x00007f1f04001000 Exception <a 'java/net/SocketExceptio n'> (0x000000079fe54f30) thrown at [/HUDSON/workspace/8-2-build-linux-amd64/jdk8 u20/1074/hotspot/src/share/vm/prims/jni.cpp, line 716] Event: 42812.466 Thread 0x00007f1f04001000 Exception <a 'java/net/SocketExceptio n': Socket closed> (0x000000079fe57398) thrown at [/HUDSON/workspace/8-2-build-l inux-amd64/jdk8u20/1074/hotspot/src/share/vm/prims/jni.cpp, line 742] Event: 42813.148 Thread 0x00007f1f04001000 Exception <a 'java/net/SocketExceptio n'> (0x000000079fe578c0) thrown at [/HUDSON/workspace/8-2-build-linux-amd64/jdk8 u20/1074/hotspot/src/share/vm/prims/jni.cpp, line 716] Event: 42813.148 Thread 0x00007f1f04001000 Exception <a 'java/net/SocketExceptio n': Socket closed> (0x000000079fe59d28) thrown at [/HUDSON/workspace/8-2-build-l inux-amd64/jdk8u20/1074/hotspot/src/share/vm/prims/jni.cpp, line 742] Event: 42821.451 Thread 0x00007f1f7cb62800 Exception <a 'java/net/SocketExceptio n'> (0x000000079f1a5d90) thrown at [/HUDSON/workspace/8-2-build-linux-amd64/jdk8 u20/1074/hotspot/src/share/vm/prims/jni.cpp, line 716] 二、排查问题的详细过程 当JVM 的初始化完成后,类在调用执行过程中,执行引擎会把字节码转为机器码,然后在操作系统中才能执行。在字节码转换为机器码的过程中,虚拟机中还存在着一道编译,那就是即时编译。 最初,JVM 中的字节码是由解释器( Interpreter )完成编译的,当虚拟机发现某个方法或代码块的运行特别频繁的时候,就会把这些代码认定为热点代码。 为了提高热点代码的执行效率,在运行时,即时编译器(JIT,Just In Time)会把这些代码编译成与本地平台相关的机器码,并进行各层次的优化,然后保存到内存中。 C1 编译器 C1 编译器是一个简单快速的编译器,主要的关注点在于局部性的优化,适用于执行时间较短或对启动性能有要求的程序,也称为Client Compiler,例如,GUI 应用对界面启动速度就有一定要求。 C2 编译器 C2 编译器是为长期运行的服务器端应用程序做性能调优的编译器,适用于执行时间较长或对峰值性能有要求的程序,也称为Server Compiler,例如,服务器上长期运行的 Java 应用对稳定运行就有一定的要求。 触发标准 在 HotSpot 虚拟机中,热点探测是 JIT 的触发标准。 热点探测是基于计数器的热点探测,采用这种方法的虚拟机会为每个方法建立计数器统计方法的执行次数,如果执行次数超过一定的阈值就认为它是“热点方法” 。虚拟机为每个方法准备了两类计数器:方法调用计数器(Invocation Counter)和回边计数器(Back Edge Counter)。在确定虚拟机运行参数的前提下,这两个计数器都有一个确定的阈值,当计数器超过阈值溢出了,就会触发 JIT 编译。 方法调用计数器 方法调用计数器用于统计方法被调用的次数,默认阈值在 C1 模式下是 1500 次,在 C2 模式在是 10000 次,可通过-XX: CompileThreshold来设定;而在分层编译的情况下-XX: CompileThreshold指定的阈值将失效,此时将会根据当前待编译的方法数以及编译线程数来动态调整。当方法计数器和回边计数器之和超过方法计数器阈值时,就会触发 JIT 编译器。 显然是定时任务一直在执行某一段程序代码,触发了JIT编译,所以JVM对该段代码进行JIT编译,但是在编译过程中出现了异常,导致JVM异常退出。 三、如何解决问题 既然知道了是由于热点代码执行次数过多触发了JIT编译,所以有两种解决方案 1:通过JVM命令进制对某个方法进行JIT编译,JVM相关配置命令如下 java -Xint -version ## 解释模式,输出interpreted mode java –Xcomp -version ##编译模式,输出compiled mode java -Xmixed -version ##混合模式,输出mixed mode -XX:+PrintCompilation (输出jit编译信息) -XX:CompileCommand=exclude,the/package/and/Class,methodName #判处指定的方法不做jit优化 -XX:CompileCommand='compileonly,java/lang/StringBuffer.*' #指定方法做编译 -XX:CompileThreshold=1000 #通过JIT编译器,将方法编译成机器码的触发阀值,可以理解为调用方法的次数,例如调1000次,将方法编译为机器码 2:考虑到之前使用老版本的mysql连接驱动,程序一直没有问题,所以对mysql驱动包进行降级,恢复到稳定版本,有问题的版本为spring-boot-2.1.6.RELEASE 依赖的mysql驱动 作者:京东零售 曹志飞 来源:京东云开发者社区 转载请注明来源

优秀的个人博客,低调大师

记一次MySQL5初始化被kill的问题排查 | 京东云技术团队

写在前面 由于测试环境JED申请比较繁琐,所以Eone提供了单机版Mysql供用户使用,近期Eone搭建Mysql5的时候发现莫名被kill了,容器规格是4C8G,磁盘30G 这不科学,之前都是可以的,镜像没变,配置没变,咋就不行了呢,一定不是我的问题,是机器的问题 问题排查 重现 通过多次搭建mysql5进行采样,发现并不是稳定复现,有一些容器是可以正常启动提供服务的,找到被mysql服务被kill的容器日志,发现是MySQL初始化被kill了, /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/export/data/mysql/data --user=admin --initialize-insecure mysql配置文件: [client] socket=/tmp/mysql.sock [mysqld] basedir=/usr/local/mysql datadir=/export/data/mysql/data port=3306 server_id=1 socket=/tmp/mysql.sock log-error=/tmp/mysqld.err pid-file=/tmp/mysqld.pid skip-host-cache skip-name-resolve skip-grant-tables 问题排查 初始化为什么被kill? 手动执行了下初始化的命令,发现直接被kill了 通过dmesg命令发现,貌似oom了  纳尼?怎么用了这么多内存?容器都没这么大内存诶 通过排查,发现MySQL有一个8G的匿名内存,这是哪来的??? 将容器规格调整为32G内存,再次尝试,发现成功启动了,但是内存占用貌似不太正常  这不科学,正常的容器内存使用情况是这样的👇  MySQL配置不合理? 难道是因为mysql设置的大小不合理?默认不设置innodb_buffer_pool_size按理说应该是128M才对,抱着侥幸心理设置下试下  然而问题依旧,改了配置也没有效果,看来不是配置的问题 真是机器的问题? 对比了一下正常启动的机器,拿着ip找到运维,发现异常的机器是近期添加的云舰系统的机器,之前centos系统宿主机是正常的,新加的云舰系统宿主机都是异常的,看来真是机器的问题,这两台机器有啥差别呢,接下来运维同学开启了排查之路: 1. 首先,看看两台宿主机是不是物理CPU总数不一样 2. 再确认下CentOS是否开启了富容器功能 对比了下两台宿主机的资源配置,发现好像是资源配置的问题  正常的机器配置是这样的  或许真的有可能,修改下open files限制再试下 ulimit -n 1048576 竟然可以了!!!MySQL正常提供服务了,真的是机器的问题  问题分析 strace log分析 28139 execve("/usr/local/mysql/bin/mysqld-debug", ["/usr/local/mysql/bin/mysqld-debu"..., "--initialize-insecure", "--basedir=/usr/local/mysql", "--datadir=/export/data/mysql/dat"..., "--user=admin"], 0x7ffe74bdcbe8 /* 294 vars */) = 0 28139 brk(NULL) = 0x4b50000 28139 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f93d3bf6000 28139 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) 28139 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 28139 fstat(3, {st_mode=S_IFREG|0644, st_size=16580, ...}) = 0 28139 mmap(NULL, 16580, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f93d3bf1000 28139 close(3) = 0 28139 open("/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3 28139 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240l\0\0\0\0\0\0"..., 832) = 832 28139 fstat(3, {st_mode=S_IFREG|0755, st_size=142304, ...}) = 0 28139 mmap(NULL, 2208864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f93d37ba000 28139 mprotect(0x7f93d37d0000, 2097152, PROT_NONE) = 0 28139 mmap(0x7f93d39d0000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7f93d39d0000 28139 mmap(0x7f93d39d2000, 13408, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f93d39d2000 28139 close(3) = 0 28139 open("/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3 28139 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\16\0\0\0\0\0\0"..., 832) = 832 28139 fstat(3, {st_mode=S_IFREG|0755, st_size=19520, ...}) = 0 28139 mmap(NULL, 2109744, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f93d35b6000 28139 mprotect(0x7f93d35b9000, 2093056, PROT_NONE) = 0 28139 mmap(0x7f93d37b8000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f93d37b8000 28139 close(3) = 0 28139 open("/lib64/libaio.so.1", O_RDONLY|O_CLOEXEC) = 3 28139 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\5\0\0\0\0\0\0"..., 832) = 832 28139 fstat(3, {st_mode=S_IFREG|0755, st_size=6264, ...}) = 0 28139 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f93d3bf0000 28139 mmap(NULL, 2101328, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f93d33b4000 28139 mprotect(0x7f93d33b5000, 2093056, PROT_NONE) = 0 28139 mmap(0x7f93d35b4000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x7f93d35b4000 28139 close(3) = 0 28139 open("/lib64/libnuma.so.1", O_RDONLY|O_CLOEXEC) = 3 28139 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0004\0\0\0\0\0\0"..., 832) = 832 28139 fstat(3, {st_mode=S_IFREG|0755, st_size=50704, ...}) = 0 28139 mmap(NULL, 2144448, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f93d31a8000 28139 mprotect(0x7f93d31b2000, 2097152, PROT_NONE) = 0 28139 mmap(0x7f93d33b2000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xa000) = 0x7f93d33b2000 28139 close(3) = 0 28139 open("/lib64/libcrypt.so.1", O_RDONLY|O_CLOEXEC) = 3 28139 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\16\0\0\0\0\0\0"..., 832) = 832 28139 fstat(3, {st_mode=S_IFREG|0755, st_size=40816, ...}) = 0 28139 mmap(NULL, 2318912, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f93d2f71000 28139 mprotect(0x7f93d2f79000, 2093056, PROT_NONE) = 0 28139 mmap(0x7f93d3178000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7f93d3178000 28139 mmap(0x7f93d317a000, 184896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f93d317a000 28139 close(3) = 0 28139 open("/lib64/librt.so.1", O_RDONLY|O_CLOEXEC) = 3 28139 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\"\0\0\0\0\0\0"..., 832) = 832 28139 fstat(3, {st_mode=S_IFREG|0755, st_size=44096, ...}) = 0 28139 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f93d3bef000 28139 mmap(NULL, 2128952, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f93d2d69000 28139 mprotect(0x7f93d2d70000, 2093056, PROT_NONE) = 0 28139 mmap(0x7f93d2f6f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7f93d2f6f000 28139 close(3) = 0 28139 open("/lib64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3 28139 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\264\5\0\0\0\0\0"..., 832) = 832 28139 fstat(3, {st_mode=S_IFREG|0755, st_size=995840, ...}) = 0 28139 mmap(NULL, 3175456, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f93d2a61000 28139 mprotect(0x7f93d2b4a000, 2097152, PROT_NONE) = 0 28139 mmap(0x7f93d2d4a000, 40960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe9000) = 0x7f93d2d4a000 28139 mmap(0x7f93d2d54000, 82976, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f93d2d54000 28139 close(3) = 0 28139 open("/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 3 28139 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260T\0\0\0\0\0\0"..., 832) = 832 28139 fstat(3, {st_mode=S_IFREG|0755, st_size=1141560, ...}) = 0 28139 mmap(NULL, 3150168, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f93d275f000 28139 mprotect(0x7f93d2860000, 2093056, PROT_NONE) = 0 28139 mmap(0x7f93d2a5f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x100000) = 0x7f93d2a5f000 28139 close(3) = 0 28139 open("/lib64/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3 28139 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320*\0\0\0\0\0\0"..., 832) = 832 28139 fstat(3, {st_mode=S_IFREG|0755, st_size=88720, ...}) = 0 28139 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f93d3bee000 28139 mmap(NULL, 2184192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f93d2549000 28139 mprotect(0x7f93d255e000, 2093056, PROT_NONE) = 0 28139 mmap(0x7f93d275d000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14000) = 0x7f93d275d000 28139 close(3) = 0 28139 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 28139 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \34\2\0\0\0\0\0"..., 832) = 832 28139 fstat(3, {st_mode=S_IFREG|0755, st_size=2112384, ...}) = 0 28139 mmap(NULL, 3936832, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f93d2187000 28139 mprotect(0x7f93d233e000, 2097152, PROT_NONE) = 0 28139 mmap(0x7f93d253e000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b7000) = 0x7f93d253e000 28139 mmap(0x7f93d2544000, 16960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f93d2544000 28139 close(3) = 0 28139 open("/lib64/libfreebl3.so", O_RDONLY|O_CLOEXEC) = 3 28139 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\v\0\0\0\0\0\0"..., 832) = 832 28139 fstat(3, {st_mode=S_IFREG|0755, st_size=11376, ...}) = 0 28139 mmap(NULL, 2105536, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f93d1f84000 28139 mprotect(0x7f93d1f86000, 2093056, PROT_NONE) = 0 28139 mmap(0x7f93d2185000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x7f93d2185000 28139 close(3) = 0 28139 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f93d3bed000 28139 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f93d3bec000 28139 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f93d3bea000 28139 arch_prctl(ARCH_SET_FS, 0x7f93d3bea740) = 0 28139 mprotect(0x7f93d253e000, 16384, PROT_READ) = 0 28139 mprotect(0x7f93d37b8000, 4096, PROT_READ) = 0 28139 mprotect(0x7f93d2185000, 4096, PROT_READ) = 0 28139 mprotect(0x7f93d275d000, 4096, PROT_READ) = 0 28139 mprotect(0x7f93d2a5f000, 4096, PROT_READ) = 0 28139 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f93d3be9000 28139 mprotect(0x7f93d2d4a000, 32768, PROT_READ) = 0 28139 mprotect(0x7f93d39d0000, 4096, PROT_READ) = 0 28139 mprotect(0x7f93d2f6f000, 4096, PROT_READ) = 0 28139 mprotect(0x7f93d3178000, 4096, PROT_READ) = 0 28139 mprotect(0x7f93d33b2000, 4096, PROT_READ) = 0 28139 mprotect(0x7f93d35b4000, 4096, PROT_READ) = 0 28139 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f93d3be7000 28139 mprotect(0x7f93d3bf7000, 4096, PROT_READ) = 0 28139 munmap(0x7f93d3bf1000, 16580) = 0 28139 set_tid_address(0x7f93d3beaa10) = 28139 28139 set_robust_list(0x7f93d3beaa20, 24) = 0 28139 rt_sigaction(SIGRTMIN, {sa_handler=0x7f93d37c0780, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7f93d37c9100}, NULL, 8) = 0 28139 rt_sigaction(SIGRT_1, {sa_handler=0x7f93d37c0810, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7f93d37c9100}, NULL, 8) = 0 28139 rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0 28139 getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0 28139 brk(NULL) = 0x4b50000 28139 brk(0x4b71000) = 0x4b71000 28139 open("/proc/self/status", O_RDONLY) = 3 28139 fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 28139 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f93d3bf5000 28139 read(3, "Name:\tmysqld-debug\nUmask:\t0022\nS"..., 1024) = 1024 28139 read(3, "0,00000000,00000000,00000000,000"..., 1024) = 334 28139 close(3) = 0 28139 munmap(0x7f93d3bf5000, 4096) = 0 28139 openat(AT_FDCWD, "/sys/devices/system/node", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3 28139 getdents(3, /* 11 entries */, 32768) = 360 28139 open("/sys/devices/system/node/node0/meminfo", O_RDONLY) = 4 28139 fstat(4, {st_mode=S_IFREG|0444, st_size=4096, ...}) = 0 28139 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f93d3bf5000 28139 read(4, "Node 0 MemTotal: 226242196"..., 4096) = 1175 28139 stat("/etc/sysconfig/64bit_strstr_via_64bit_strstr_sse2_unaligned", 0x7ffda2f609d0) = -1 ENOENT (No such file or directory) 28139 stat("/etc/sysconfig/64bit_strstr_via_64bit_strstr_sse2_unaligned", 0x7ffda2f609d0) = -1 ENOENT (No such file or directory) 28139 read(4, "", 4096) = 0 28139 close(4) = 0 28139 munmap(0x7f93d3bf5000, 4096) = 0 28139 getdents(3, /* 0 entries */, 32768) = 0 28139 close(3) = 0 28139 sched_getaffinity(0, 512, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59]) = 8 28139 openat(AT_FDCWD, "/sys/devices/system/cpu", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3 28139 getdents(3, /* 77 entries */, 32768) = 2368 28139 getdents(3, /* 0 entries */, 32768) = 0 28139 close(3) = 0 28139 open("/proc/self/status", O_RDONLY) = 3 28139 fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 28139 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f93d3bf5000 28139 read(3, "Name:\tmysqld-debug\nUmask:\t0022\nS"..., 1024) = 1024 28139 read(3, "0,00000000,00000000,00000000,000"..., 1024) = 334 28139 read(3, "", 1024) = 0 28139 close(3) = 0 28139 munmap(0x7f93d3bf5000, 4096) = 0 28139 futex(0x7f93d2d6696c, FUTEX_WAKE_PRIVATE, 2147483647) = 0 28139 futex(0x7f93d2d66978, FUTEX_WAKE_PRIVATE, 2147483647) = 0 28139 stat("/etc/my.cnf", {st_mode=S_IFREG|0644, st_size=370, ...}) = 0 28139 open("/etc/my.cnf", O_RDONLY) = 3 28139 fstat(3, {st_mode=S_IFREG|0644, st_size=370, ...}) = 0 28139 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f93d3bf5000 28139 read(3, "[client]\nsocket=/tmp/mysql.sock\n"..., 4096) = 370 28139 read(3, "", 4096) = 0 28139 close(3) = 0 28139 munmap(0x7f93d3bf5000, 4096) = 0 28139 stat("/etc/mysql/my.cnf", 0x7ffda2f5c8d0) = -1 ENOENT (No such file or directory) 28139 stat("/usr/local/mysql/etc/my.cnf", 0x7ffda2f5c8d0) = -1 ENOENT (No such file or directory) 28139 stat("/root/.my.cnf", 0x7ffda2f5c8d0) = -1 ENOENT (No such file or directory) 28139 getrlimit(RLIMIT_NOFILE, {rlim_cur=1073741816, rlim_max=1073741816}) = 0 28139 mmap(NULL, 17179869184, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8fd1f84000 28139 +++ killed by SIGKILL +++ 可以看到最后用 mmap 一次分配了 16G 内存,然后就被杀了。 mmap 前调用了 getrlimit , 猜测是 mysql 会根据系统资源限制来分配内存 MySQL源码分析 MySQL 源码中直接调用 getrlimit 的地方不多,排除了 ndb、innodb_memcached、libevent 之后,只有一处直接调用: static uint set_max_open_files(uint max_file_limit) { struct rlimit rlimit; uint old_cur; DBUG_ENTER("set_max_open_files"); DBUG_PRINT("enter",("files: %u", max_file_limit)); if (!getrlimit(RLIMIT_NOFILE,&rlimit)) { old_cur= (uint) rlimit.rlim_cur; DBUG_PRINT("info", ("rlim_cur: %u rlim_max: %u", (uint) rlimit.rlim_cur, (uint) rlimit.rlim_max)); if (rlimit.rlim_cur == (rlim_t) RLIM_INFINITY) rlimit.rlim_cur = max_file_limit; if (rlimit.rlim_cur >= max_file_limit) DBUG_RETURN(rlimit.rlim_cur); /* purecov: inspected */ rlimit.rlim_cur= rlimit.rlim_max= max_file_limit; if (setrlimit(RLIMIT_NOFILE, &rlimit)) max_file_limit= old_cur; /* Use original value */ else { rlimit.rlim_cur= 0; /* Safety if next call fails */ (void) getrlimit(RLIMIT_NOFILE,&rlimit); DBUG_PRINT("info", ("rlim_cur: %u", (uint) rlimit.rlim_cur)); if (rlimit.rlim_cur) /* If call didn't fail */ max_file_limit= (uint) rlimit.rlim_cur; } } DBUG_PRINT("exit",("max_file_limit: %u", max_file_limit)); DBUG_RETURN(max_file_limit); 其中逻辑是:如果系统的文件打开限制是 RLIM_INFINITY 或者比要设置的 max_file_limit 大,都返回系统的限制。 这个函数也只被直接调用一次: uint my_set_max_open_files(uint files) { struct st_my_file_info *tmp; DBUG_ENTER("my_set_max_open_files"); DBUG_PRINT("enter",("files: %u my_file_limit: %u", files, my_file_limit)); files+= MY_FILE_MIN; files= set_max_open_files(MY_MIN(files, OS_FILE_LIMIT)); // 获取最大打开文件数 if (files <= MY_NFILE) DBUG_RETURN(files); // 分配内存 if (!(tmp= (struct st_my_file_info*) my_malloc(key_memory_my_file_info, sizeof(*tmp) * files, MYF(MY_WME)))) DBUG_RETURN(MY_NFILE); // 初始化 /* Copy any initialized files */ memcpy((char*) tmp, (char*) my_file_info, sizeof(*tmp) * MY_MIN(my_file_limit, files)); memset((tmp + my_file_limit), 0, MY_MAX((int) (files - my_file_limit), 0) * sizeof(*tmp)); my_free_open_file_info(); /* Free if already allocated */ my_file_info= tmp; my_file_limit= files; DBUG_PRINT("exit",("files: %u", files)); DBUG_RETURN(files); } 原来 MySQL5 会根据最大可打开文件数,提前为每个文件分配和初始化内存,在这个时候就可能分配过多内存,导致 OOM。MySQL8修复了这个问题。 解决 启动前设置ulimit ENTRYPOINT ["ulimit -n 1048576 && /home/admin/start.sh"] 写在后面 在linux中,open files设置过大会出现很多问题,应该合理控制open files数量 参考文献 https://learnku.com/articles/34598 作者:京东零售 杨云龙 来源:京东云开发者社区 转载请注明来源

优秀的个人博客,低调大师

以效率为导向:用ChatGPT和HttpRunner实现敏捷自动化测试(二) | 京东云技术团队

1、前言 在上一篇文章: 利用ChatGPT提升测试工作效率——测试工程师的新利器(一)中,我们提到了如何通过chatGPT生成单接口测试用例,然后再让chatGPT去根据测试用例去生成接口自动化脚本。本篇文章将详细讲解一下我们团队内部在遇到业务痛点时如何利用Httprunner框架进行接口自动化测试的。当最近邂逅chatGPT后又是如何将二者结合起来,实现"敏捷"自动化测试的。 首先业务测试面对的痛点就是在商业化Devops产品在交付过程中,不同的客户现场和公司内部存在各种各样的环境还有各种国产化系统,并行多个客户交付,多版本需要进行回归测试。如果在有限的人力资源下,通过测试人员人工进行回归的化可能就会不能按时按点完成交付。如何快速的实现接口自动化辅助回归,经过团队内部选型,根据快速性,灵活性,易用性最终选择了HttpRunner框架。最终实现了能在不同的客户现场环境,当运维人员部署完成环境后能够快速实现基本功能回归测试,大大减少了测试人员的回归时间。 接下来详细讲一下我们是如何使用Httprunner通过“点”,“改”,“查”这三板斧进行接口自动化测试的。点就是通过在web前端进行业务操作将对应接口录制下来,然后一条命令输出自动化脚本。改就是需要将所有重复需要替换的内容用脚本进行批量更改,当然变量抽取及断言目前仍然需要每个接口人工进行更改。查就是运行调试找错修正。相比一些接口测试工具或平台需要人工单接口录入,Httprunner简直是so easy,哪里麻烦点哪里!下面先举例详细介绍一下如何通过Httprunner生成自动化脚本。 2、招式一:点一点 现在我以一个简单的业务场景进行说明,要将在团队空间模块创建团队空间,创建迭代,创建卡片整个流程实现自动化。首先需要在Web端进行对应的操作。 同时用Fiddler等抓包工具,或者浏览器本身的F12功能也可以抓取业务流程接口。删除次要保留核心接口,将所有接口导出成har文件createSpaceCardDemo.har。(抓包工具及浏览器都可以导出) 接下来通过Httprunner框架的工具命令行:har2case.exe createSpaceCardDemo.har将har文件转化成py脚本。(当然也可以是yml格式,相比较而言py格式的更简洁易读)  3、招式二:改一改 运行命令第一轮生成这样的:通过观察发现脚本里面url,headers,cookies,请求体等信息会根据不同环境不同用户进行变更,所以需要参数化。 “秘制”脚本第二轮替换后变成这样:将url,headers,cookies进行抽离后,此时脚本已经非常简洁明了了。  人工第三轮替换:将入参参数化保证每次都能运行。返回值字段抽取后吐给下个结果或其他依赖脚本。断言针对每个接口的业务特性有针对性的进行判断。  4、招式三:查一查 修改完成后,通过命令hrun .\testcases\space\space\createSpaceCardDemo_test.py --html=reports\index.html运行,检查脚本的正确性。 是不是感觉特别简单。比把大象装冰箱还要简单。  说明:前期框架需要做好规划,变量抽离函数封装要做好。还需要考虑不同环境,不同部署方式,接口前缀变动等等业务特点。这样后期的自动化脚本就越简单。 5、ChatGPT生成用例 以上就是Httprunner实现接口自动化的基本流程。但是如果要做核心接口的异常场景如何测试呢,前端不能通过点一点,录制一下就会自动生成脚本。如果人工去手工写也会大大提高测试人员的工作量。现在chatGPT闪亮登场了。初步想法就是给chatGPT接口入参,入参的约束条件。然后让chatGPT生成接口的异常场景的测试用例。再让chatGPT将我们的测试用例转成我们需要的自动化脚本。又是如此简单,so easy!哪里不对再让chatGPT改哪里。 经过几轮的改改改,最终chatGPT生成的用例如下:  6、ChatGPT生成Httprunner脚本 接下来再将生成好的测试用例喂给chatGPT,让它自动生成接口自动化脚本。先训练按照一个用例生成符合预期的接口自动化脚本。 接下来将所有生成的测试用例"喂"给chatGPT,让其将所有测试用例生成Httprunner接口自动化脚本。通过命令hrun .\testcases\space\exceptions\createSpaceException_P01_test.py运行后发现直接成功。当然目前的断言还只是状态码断言,还需针对不同场景的消息体进行断言。  7、总结 以上就是当chatGPT与Httprunner(官网链接)碰撞出的火花。Httprunner对于写接口用例已经非常简单了,当再遇到chatGPT后功能又大大增强了。我们对于能录制的接口只需通过三板斧,点一点,改一改和查一查就能写好一个场景的用例。对于不能进行录制的单接口可以通过chatGPT去生成用例,然后再让chatGPT去自动生成自动化脚本。当然目前的应用还属于相对比较简单的接口,前期刚刚使用可能会像小孩子刚学走路会磕磕绊绊,但是我相信随着不断探索和学习,随着chatGPT的发展会越来越熟练。因为星星之火可以燎原。 作者:京东科技 张兴磊 来源:京东云开发者社区 转载请注明来源

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册