尝试找到泄漏点! anon 对 pmap 意味着什么?

问题描述 投票:0回答:4

我正在尝试查找在 Linux 中运行的 Java 进程的内存去向。有人建议我使用

pmap -x
来准确查看内存在做什么。

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

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

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

java linux memory memory-management pmap
4个回答
48
投票

匿名块是通过

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 内存问题?


4
投票

请参阅匿名内存系统性能调优的这部分这部分


3
投票

我之前在线程泄漏中见过这种模式。 如果您有尝试池化线程的代码,但不知何故弄乱并泄漏了线程,您会得到类似于 pmap 中的模式。

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

当我们遇到这样的问题时

pmap [pid] | grep -c 12K
原来是正在使用的线程数。


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.