调查Java JIT其他内存

时间:2018-08-31 02:45:40

标签: java out-of-memory jit

我正在调查在由mesos马拉松精心策划的docker容器中运行的Java应用程序的内存不足问题。

  • 容器设置为2GB内存
  • JVM堆显式设置为最小1Gb和最大1.5GB
  • 持续测试工作负载,然后是最终的容器退出代码137(OOM)。
  • 在测试开始时和1小时后比较了两个javacore,发现名为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)进行的核心转储是否可以阐明“其他”空间中的内容。

我们尝试通过遵循this discussion

来限制JIT内存的使用
*-Xjit:disableCodeCacheConsolidation
-Xcodecachetotal128m*

但似乎无法使args正常工作。

我们正在使用 IBM JRE 1.8.0 Linux amd64-64(内部版本8.0.5.17-pxa6480sr5fp17-20180627_01(SR5 FP17))

人们可以分享一些工具/经验来解决JIT本机内存消耗问题吗?

1 个答案:

答案 0 :(得分:1)

“元空间”内存中可能存在内存泄漏。这是JVM用来保存(例如)JIT编译的类和其他类元数据的堆外内存。

元空间泄漏的几种常见原因是:

  • 由于在开发过程中反复热加载代码而导致的类加载器泄漏,或者
  • 泄漏了Proxy个类/对象或类似对象。

有一些JVM选项可以限制元空间的大小。例如-XX:MaxMetaspaceSize=256m


以下是有关元空间泄漏诊断的问答:


我刚刚注意到您使用的是IBM JRE,而不是Oracle / OpenJDK。因此以上内容并不直接适用。

但根本问题可能是相同的:通过类加载器/热加载或通过代理类泄漏。