Unsafe.defineClass挂起-反射速度慢
在Java 8 / SpringBoot 1.5.13 / Tomcat 8.5 Web应用程序中观察到运行时间极长的请求(> 30s)。而且卡顿时间会随程序运行时间变久。但是大部分请求的响应还是正常的。卡顿发生时的cpu负载增长到100%,过几分钟后会自己降下来。
Threaddumps显示Unsafe.defineClass正在挂起:
"http-nio-8080-exec-9" #254 daemon prio=5 os_prio=0 tid=0x00007f8a98b4f000 nid=0x2258 runnable [0x00007f89fb0b0000]
java.lang.Thread.State: RUNNABLE
at sun.misc.Unsafe.defineClass(Native Method)
at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:394)
at java.security.AccessController.doPrivileged(Native Method)
at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:393)
at sun.reflect.MethodAccessorGenerator.generateMethod(MethodAccessorGenerator.java:75)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:53)
at sun.reflect

本文讨论了在Java 8、SpringBoot 1.5.13和Tomcat 8.5环境中遇到的长时间请求延迟问题,与Unsafe.defineClass的挂起有关。CPU负载增加到100%后会自行下降。线程转储显示类加载过程中存在挂起。文章还探讨了在不同JVM版本下-XX: TraceClassUnloading参数的效果,并引发了关于类加载器委托机制的讨论。
最低0.47元/天 解锁文章
1255

被折叠的 条评论
为什么被折叠?



