Unsafe.defineClass挂起 - 慢速反射调用

时间:2018-03-27 08:32:38

标签: java spring-mvc tomcat8

我在Java 8 / Spring 5 / Tomcat 8.5 Web应用程序中观察到极长的运行请求(> 30s)。大多数请求都会正常响应。 值得注意的是,经过几天的正常运行后,长跑者的频率会增加。

Threaddumps显示Unsafe.defineClass挂起:

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.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.springframework.core.annotation.AnnotationUtils.getValue(AnnotationUtils.java:1328)  
at org.springframework.core.annotation.AnnotatedElementUtils$MergedAnnotationAttributesProcessor.getAdaptedValue(AnnotatedElementUtils.java:1627) 
at org.springframework.core.annotation.AnnotatedElementUtils$MergedAnnotationAttributesProcessor.overrideAttributes(AnnotatedElementUtils.java:1610) 
at org.springframework.core.annotation.AnnotatedElementUtils$MergedAnnotationAttributesProcessor.postProcess(AnnotatedElementUtils.java:1598) 
at org.springframework.core.annotation.AnnotatedElementUtils$MergedAnnotationAttributesProcessor.postProcess(AnnotatedElementUtils.java:1515) 
at org.springframework.core.annotation.AnnotatedElementUtils.searchWithFindSemantics(AnnotatedElementUtils.java:1145) 
at org.springframework.core.annotation.AnnotatedElementUtils.searchWithFindSemantics(AnnotatedElementUtils.java:1066) 
at org.springframework.core.annotation.AnnotatedElementUtils.searchWithFindSemantics(AnnotatedElementUtils.java:1038) 
at org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotationAttributes(AnnotatedElementUtils.java:650) 
at org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation(AnnotatedElementUtils.java:726)
....

有没有人见过这个问题?

1 个答案:

答案 0 :(得分:0)

通过使用保守的-XX:MaxMetaspaceSize或者服务器上没有足够的RAM,可能是因为你的Metaspace用完了吗?由于GC在Metaspace上运行,你的缓慢可能是它努力清理它的结果。默认情况下,如果Metaspace内存到达MaxMetaspaceSize,则会收集它,因此这个30秒的暂停可能是GC。

然而,有一个更大的问题。您的代码中的内容是分配这些类,为什么它经常发生以填充Metaspace。通常,在启动期间创建类,之后不太频繁地创建类。也许您正在进行热部署并且ClassLoader正在泄漏?

在Java 8之前,这可能是由GC和PermGen耗尽导致的,例如as asked in this question where it caused OutOfMemoryError