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

kub*_*zyk 10 java memory-leaks jmap java-8

我解决了一个奇怪的内存泄漏问题.它特定于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... ]
Run Code Online (Sandbox Code Playgroud)

这些类似乎通过以下方式增加类计数器输出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
Run Code Online (Sandbox Code Playgroud)

问题是这些类永远不会从元空间中进行垃圾收集,从来没有[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
Run Code Online (Sandbox Code Playgroud)

这会响铃还是带来任何我可以传递给程序员的提示?他们说他们无法找到泄漏点.我是否可以通过摆弄JVM选项来阻止这种泄漏?

Ser*_*lov 6

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

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


小智 4

我认为 JaxB 正在将类加载到您的内存中,而这些类没有被垃圾收集。如果不卸载类,元空间不会清空。

检查Java 8 的 JaxB 内存问题。我认为您可以通过交换依赖项 api 版本或切换额外参数来摆脱此异常:

-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true
Run Code Online (Sandbox Code Playgroud)