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

时间:2009-09-25 15:10:42

标签: java linux memory memory-management pmap

我正在尝试找到我的内存在linux中运行的java进程的位置。有人建议我使用pmap -x来确切了解内存的作用。

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

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

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

4 个答案:

答案 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)

请参阅系统性能调优的 this part this part以获取匿名内存。

答案 2 :(得分:2)

使用Eclipse MAT(当您在Java堆中获得OutOfMemoryExceptions而不是本机堆时)。

答案 3 :(得分:1)

我在线程泄漏之前看过那个模式。如果你有代码试图汇集线程,但不知何故弄乱并泄漏一个线程,你会得到一个类似于pmap的模式。

我认为每个内存都是线程的最小堆栈大小,当然它与我们的情况下没有任何关系。
当我们达到操作系统限制时,我们仍然会得到OutOfMemoryErrors,甚至当我们分析堆没有进行过度分配时也是如此。

当我们遇到这样的问题时pmap [pid] | grep -c 12K被证明是正在使用的线程数。