我正在调查在由 mesos marathon 编排的 docker 容器中运行的 java 应用程序的内存不足问题。
- 容器设置为 2GB 内存
- JVM 堆显式设置为最小 1Gb 和最大 1.5GB
- 持续测试工作负载,然后是最终容器退出代码 137 (OOM(。
- 在测试开始时比较了两个javacore,并在1小时后,注意到称为JIT"Other"的东西具有最大的增量
- JVM 堆使用没有问题
初
2MEMUSER +--JIT: 318,789,520 bytes / 778 allocations
2MEMUSER | |
3MEMUSER | +--JIT Code Cache: 268,435,456 bytes / 1 allocation
2MEMUSER | |
3MEMUSER | +--JIT Data Cache: 16,777,728 bytes / 8 allocations
2MEMUSER | |
3MEMUSER | +--Other: 33,576,336 bytes / 769 allocations
1小时后
2MEMUSER +--JIT: 525,843,728 bytes / 8046 allocations
2MEMUSER | |
3MEMUSER | +--JIT Code Cache: 268,435,456 bytes / 1 allocation
2MEMUSER | |
3MEMUSER | +--JIT Data Cache: 62,916,480 bytes / 30 allocations
2MEMUSER | |
3MEMUSER | +--Other: 194,491,792 bytes / 8015 allocations
我想知道使用 Eclipse Memory Analyzer Tool (MAT( 进行核心转储是否可以阐明这个"其他"空间中的内容。
我们试图通过以下讨论来限制 JIT 内存的使用
*-Xjit:disableCodeCacheConsolidation
-Xcodecachetotal128m*
但似乎无法让 args 工作。
我们正在使用 IBM JRE 1.8.0 Linux amd64-64 (build 8.0.5.17 - pxa6480sr5fp17-20180627_01(SR5 FP17((
人们可以分享工具/经验排查 JIT 本机内存消耗吗?
您可能在"元空间"内存中存在内存泄漏。 这是堆外内存,JVM 使用它来保存(例如(JIT 编译的类和其他类元数据。
元空间泄漏的几个常见原因是:
- 由于在开发过程中反复热加载代码而导致的类加载器泄漏,或
Proxy
类/对象或类似内容的泄漏。
有一些JVM选项可以限制元空间的大小;例如-XX:MaxMetaspaceSize=256m
.
以下是关于诊断元空间泄漏的问答:
- 如何诊断Java 8元空间泄漏?
我刚刚注意到您使用的是IBM JRE,而不是Oracle/OpenJDK。 所以以上不直接适用。
不过,根本问题很可能是相同的:通过类加载器/热加载或通过代理类泄漏。