我在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)
....
有没有人见过这个问题?
答案 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