试图find泄漏! anon对于pmap意味着什么?

我试图find我的内存已经去了在linux中运行的java进程。 有人build议我使用pmap -x来查看内存在做什么。

输出真的很长,但其中很大一部分是重复的:

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

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

Solutions Collecting From Web of "试图find泄漏! anon对于pmap意味着什么?"

匿名块是通过malloc或mmap分配的“大”块 – 请参阅联机帮助页。 因此,它们与Java堆没有任何关系(除了整个堆应该存储在这个块中的事实之外)。

根据我的经验,线程堆栈也使用匿名块。 如果你看到很多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内存问题?

看到 这部分 匿名内存的系统性能调整的这一部分 。

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

在线程泄漏之前,我已经看到了这种模式。 如果你的代码尝试去合并线程,但是不知何故,你会得到一个类似于pmap的模式。

我认为每一点内存都是线程的最小堆栈大小,在我们的例子中它确实与堆没有关系。
当我们达到操作系统的限制时,我们仍然会遇到OutOfMemoryErrors,即使是当我们分析堆没有被超额分配的时候。

当我们遇到像这样的问题时, pmap [pid] | grep -c 12K pmap [pid] | grep -c 12K竟然是正在使用的线程数量。