java - 调查 Java JIT 其他内存
问题描述
我正在调查在由 mesos marathon 编排的 docker 容器中运行的 java 应用程序的内存不足问题。
- 容器设置为 2GB 内存
- JVM 堆显式设置为 1Gb min 和 1.5GB max
- 持续的测试工作量,然后是最终的容器退出代码 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 内存分析器工具 (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
。
这是关于诊断元空间泄漏的问答:
我刚刚注意到您使用的是 IBM JRE 而不是 Oracle / OpenJDK。所以以上内容并不直接适用。
不过,根本问题很可能是相同的:通过类加载器/热加载或代理类泄漏。
推荐阅读
- python-3.x - 删除 Django 表单中的帮助文本
- c# - 刚体.MovePosition(rb.position + offset) 使下落缓慢
- flutter - FloatingActionButton 上的背景颜色
- python - RDS Aurora Mysql 和 ECS 连接超时 (pymysql.err.OperationalError) (2003, "Can't connect to MySQL)
- python-3.x - CFFI:是否有可能捕获警告?
- javascript - Javascript ES6 语法单选按钮检查
- nginx - 我无法使用 nginx-reverse-proxy 正确重定向
- typescript - 有没有办法在 Typescript 中访问 firebase 函数返回?
- python-3.x - Odoo14:将 Many2many 与 Many2one 联系起来
- python - Scikit Learn 中的分类朴素贝叶斯给出了 IndexError