我正在尝试找到我的内存在linux中运行的java进程的位置。有人建议我使用pmap -x来确切了解内存的作用。
输出真的很长,但基本上很好的一部分是重复这个:
00007fbf75f6a000 1016 - - - rwx-- [ anon ]
00007fbf76068000 12 - - - ----- [ anon ]
这究竟是什么意思?为什么我有这么多的条目(4000 +)?
答案 0 :(得分:31)
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内存问题?
答案 1 :(得分:3)
答案 2 :(得分:2)
使用Eclipse MAT(当您在Java堆中获得OutOfMemoryExceptions而不是本机堆时)。
答案 3 :(得分:1)
我在线程泄漏之前看过那个模式。如果你有代码试图汇集线程,但不知何故弄乱并泄漏一个线程,你会得到一个类似于pmap的模式。
我认为每个内存都是线程的最小堆栈大小,当然它与我们的情况下没有任何关系。
当我们达到操作系统限制时,我们仍然会得到OutOfMemoryErrors,甚至当我们分析堆没有进行过度分配时也是如此。
当我们遇到这样的问题时pmap [pid] | grep -c 12K
被证明是正在使用的线程数。