我正在尝试查找在Linux中运行的Java进程的存储空间。有人建议我使用pmap -x来确切查看内存在做什么。

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

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

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

最佳答案

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

以我的经验,线程堆栈也使用匿名块。如果您看到很多匿名块都具有相同的大小,并且大小为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内存问题?

10-07 20:50