Java 内存泄漏 - jmap 不显示类,但 jstat 显示

标签 java memory-leaks java-8 jmap

我解决了一个奇怪的内存泄漏问题。它特定于 Java8,不会发生在 7u79 上。

我无权访问 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

<bootstrap>     2574    4493256   null          live    <internal>
0x0000000087d016d0      1       1471    0x000000008237f088      dead    sun/reflect/DelegatingClassLoader@0x00007ff4135d02d0
... some lines omitted ...
0x000000008237f088      6505    12228227        0x0000000080383938      dead    org/apache/catalina/loader/WebappClassLoader@0x00007ff411546ad0
... some lines omitted ...
total = 600     14002   25351427            N/A         alive=1, dead=599           N/A

这是否敲响了警钟或带来了我可以传递给程序员的提示?他们说他们无法找到泄漏点。我可以通过摆弄 JVM 选项来阻止这种泄漏吗?

最佳答案

如果有问题的类无法卸载,那么它必须缓存在应用程序的某个地方,据我了解,您的目标是找到它的位置并为开发人员提供此信息。

您可以尝试使用 Eclipse Memory Analyzer ( MAT ) 检查您的堆转储,它可以显示问题区域、类和具有错误类链接的实例。

关于Java 内存泄漏 - jmap 不显示类,但 jstat 显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39616117/

相关文章:

PHP算法大数组内存问题

java - 由于 rxJava 函数中的 foreach 导致 Android 设备崩溃

java - 在java中使用ScriptEngine,如何提取函数列表?

java - sun.misc 包在 java 中仍然可用吗?

ios - 在 iPad 上显示大型 PDF 时 UIWebView 泄漏

ios - Twitter 和 Fabric 中的内存泄漏 - Swift

使用 lambda 表达式返回结果的 Java 方法引用

JavaFx 动态列值

java - GlassFish 扩展通用类加载器使用的 JAR

java - 如何在 Java 中导出字符串中空格之间的数字?