Java进程中已提交内存和RSS的差异

时间:2018-03-29 10:02:20

标签: java jvm

我正在运行一个运行jetty的简单java进程,其顶部显示2.9g的RAM。使用的JDK版本是1.8.0_112。

enter image description here

使用本机内存跟踪(jcmd),显示总提交内存仅为1.5G内存

enter image description here

直接缓冲池的大小也非常少,正如jvisualvm报道的那样。

enter image description here

我完全清楚NMT显示的内存是提交内存,不需要在RAM中。在那种情况下,NMT存储器对RES的贡献应该< 1.5GB的RES内存。

在我的情况下,这里的差异是~1.4G(RES显示1.4G的更多内存),这不能仅归因于共享库,jar。有人可以建议我如何知道这个额外的内存是什么,以及可以用哪些工具来检查它们?

我已经在线检查了所有现有的相关问题/ Stackoverflow,但找不到合适的答案。

1 个答案:

答案 0 :(得分:2)

pmap -X <pid>将从操作系统的角度显示RSS的详细分类。

NMT不计算本机非JVM代码分配的内存,即使此内存是由标准Java类库分配的,例如,通过ZipInputStream的原生方法。请参阅the related question

另一个可能的原因是malloc本身。本机内存分配器很少将未使用的内存返回给OS。例如,如果应用程序使用malloc在小块中分配1 GB,然后释放所有这些块,从应用程序的角度来看,将有1 GB的可用内存,但操作系统可能会在RSS中计算此1 GB。此内存基本上属于应用程序的malloc池,可以在将来的malloc调用中重复使用。

尝试使用其他分配器,例如jemalloctcmalloc。顺便说一句,他们都有一个分配探查器,可以帮助找到本机内存泄漏。