我解决了一个奇怪的内存泄漏问题。这是Java8特有的,并没有发生在7u79。Java内存泄漏 - jmap不显示类,但jstat确实
我无权访问Java代码。 我确切地知道哪些用户动作导致的泄漏,我知道泄漏是关于类(不是堆)和违规类是容易察觉+ TraceClassLoading + TraceClassUnloading:
[Loaded com.mastercard.mcwallet.sdk.xml.allservices.ShoppingCartRequest$JaxbAccessorF_oAuthToken from __JVM_DefineClass__]
[Loaded com.mastercard.mcwallet.sdk.... thousand similar classes per one user action... ]
这些类似乎会增加通过jstat -class输出类计数器:
Loaded Bytes Unloaded Bytes Time
14045 26138.8 0 0.0 110.00 << buggy user action
14675 26754.6 0 0.0 110.05
15300 27364.9 0 0.0 110.10
15304 27370.9 0 0.0 110.11
15304 27370.9 0 0.0 110.11
15304 27370.9 0 0.0 110.11
15306 27374.0 0 0.0 110.11
15306 27374.0 0 0.0 110.11
15306 27374.0 0 0.0 110.11
15306 27374.0 0 0.0 110.11 << buggy user action
15930 27982.2 0 0.0 110.18
16553 28589.3 0 0.0 110.23
16553 28589.3 0 0.0 110.23
的事情是,这些类是从来没有垃圾收集从元空间中,从来没有[Unloaded]和他们不jmap -clstats显示。该命令报告的类别数量较少,数量不增加,有没有可疑的类装载器:
class_loader classes bytes parent_loader alive? type
2574 4493256 null live
0x0000000087d016d0 1 1471 0x000000008237f088 dead sun/reflect/[email protected]
... some lines omitted ...
0x000000008237f088 6505 12228227 0x0000000080383938 dead org/apache/catalina/loader/[email protected]
... some lines omitted ...
total = 600 14002 25351427 N/A alive=1, dead=599 N/A
这是否环任何钟或带来任何提示我可以传递给程序员?他们说他们无法找到泄漏。我可以通过摆脱JVM选项来阻止这种泄漏吗?
+0
只有'MetaSpace'的问题?那么'堆'呢?你也可以提供'Java'进程的内存使用情况统计信息吗? –
+0
只有Metaspace,堆是稳定的而不是满的。究竟是什么统计数据? –
+0
我的意思是Java进程内存使用增长的速度有多快? –