试图找到泄漏!anon 对 pmap 意味着什么?

2022-09-01 03:15:49

我试图找到我的内存去向在linux中运行的java进程的位置。有人建议我使用pmap -x来查看内存到底在做什么。

输出真的很长,但基本上很大一部分是重复的:

00007fbf75f6a000    1016       -       -       - rwx--    [ anon ]
00007fbf76068000      12       -       -       - -----    [ anon ]

这到底是什么意思?为什么我有这么多的条目(4000+)?


答案 1

Anon块是通过malloc或mmap分配的“大”块 - 请参阅手册页。因此,它们与 Java 堆无关(除了整个堆应该存储在这样的块中)。

根据我的经验,线程堆栈也使用 anon 块。如果你看到很多 anon 块都具有相同的大小,并且大小是 512k 到 4Mb(下面的例子对于我运行的 Tomcat 进程重复了十几次),这就是可能的原因。根据程序的不同,您可能拥有多达几十个这样的;如果您看到数千个,则意味着您有线程问题。

b089f000    504K rwx--    [ anon ]
b091d000     12K -----    [ anon ]
b0920000    504K rwx--    [ anon ]
b099e000     12K -----    [ anon ]
b09a1000    504K rwx--    [ anon ]
b0a1f000     12K -----    [ anon ]

但这留下了一个问题:为什么要使用pmap来诊断Java内存问题?


答案 2

请参阅这部分 匿名内存的系统性能调整的这一部分