我试图找到我的内存在哪里运行在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内存问题?