【发布时间】:2016-11-30 13:53:49
【问题描述】:
场景:
我有一个在 docker 容器中运行的 JVM。我使用两个工具做了一些内存分析:1) top 2) Java Native Memory Tracking。这些数字看起来令人困惑,我试图找出导致差异的原因。
问题:
Java 进程的 RSS 报告为 1272MB,Java 总内存报告为 790.55 MB。我如何解释剩余的内存 1272 - 790.55 = 481.44 MB 去了哪里?
为什么即使在查看了 SO 上的 this question 之后,我仍想保持这个问题:
我确实看到了答案,并且解释很有意义。但是,在从 Java NMT 和 pmap -x 获得输出后,我仍然无法具体映射哪些 Java 内存地址实际上是常驻和物理映射的。我需要一些具体的解释(带有详细的步骤)来找出导致 RSS 和 Java Total commited memory 之间差异的原因。
热门输出
Java NMT
Docker 内存统计数据
图表
我的 docker 容器运行时间超过 48 小时。现在,当我看到一个包含以下内容的图表时:
- 分配给 docker 容器的总内存 = 2 GB
- Java 最大堆 = 1 GB
- 总提交 (JVM) = 始终小于 800 MB
- 使用的堆 (JVM) = 始终小于 200 MB
- 未使用堆 (JVM) = 始终小于 100 MB。
- RSS = 大约 1.1 GB。
那么,1.1 GB (RSS) 到 800 MB(Java 提交的总内存)之间的内存是什么?
【问题讨论】:
-
我也有同样的问题,求解答:(你有什么样的应用程序?
-
上一个问题(stackoverflow.com/a/38630406/6309)的答案满意吗?
-
@sunsin1985 您可能会尝试将 malloc 实现更改为 jemalloc,之后我看到 RSS 显着减少。请参阅gdstechnology.blog.gov.uk/2015/12/11/… 我有一个运行 600MB 堆和 1.3GB RSS 的应用程序 - 我还没有仔细调查,但内存根本就丢失了 - 没有分配重要的本机内存。我怀疑这是由于内存碎片造成的(这就是 jemalloc 有帮助的原因)
-
如果您正在跟踪 Java 本机内存泄漏或希望最大限度地减少 RSS 的使用,有这个问题的答案:stackoverflow.com/questions/26041117/…
标签: java linux memory docker jvm