我正在运行一个运行jetty的简单java进程,其顶部显示2.9g的RAM.使用的JDK版本是1.8.0_112.
使用本机内存跟踪(jcmd),它显示总提交内存只有1.5G的内存
据jvisualvm报道,直接缓冲池的大小也非常小.
我完全知道NMT显示的内存是提交内存,不需要在RAM中.在那种情况下,NMT存储器对RES的贡献应该小于1.5GB的RES存储器.
在我的情况下,这里的差异是~1.4G(RES显示1.4G的更多内存),这不能仅归因于共享库,jar.有人可以建议我如何知道这个额外的内存是什么,以及可以使用哪些工具来检查它们?
我已经在线检查了所有现有的相关问题/ Stackoverflow,但找不到合适的答案.
pmap -X <pid>将从操作系统角度显示 RSS 的详细细分。
NMT 不计算由本机非 JVM 代码分配的内存,即使该内存是由标准 Java 类库分配的,例如通过ZipInputStream. 请参阅相关问题。
另一个可能的原因是malloc它本身。本机内存分配器很少将未使用的内存返回给操作系统。例如,如果应用程序使用 malloc 分配 1 GB 的小块,然后释放所有这些块,从应用程序的角度来看,将有 1 GB 的可用内存,但操作系统可能会将这 1 GB 计入 RSS 中。该内存基本上属于应用程序的 malloc 池,可以重用以供将来的malloc调用。
尝试使用替代分配器,例如jemalloc或tcmalloc。顺便说一句,它们都有一个分配分析器,可以帮助查找本机内存泄漏。
| 归档时间: |
|
| 查看次数: |
441 次 |
| 最近记录: |