【问题标题】:Trying to locate a leak! What does anon mean for pmap?试图定位泄漏点! anon 对 pmap 意味着什么?
【发布时间】:2010-12-01 11:07:01
【问题描述】:

我正在尝试查找我的内存在 linux 中运行的 java 进程的去向。有人建议我使用 pmap -x 来准确查看内存在做什么。

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

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

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

【问题讨论】:

    标签: java linux memory memory-management pmap


    【解决方案1】:

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

    【讨论】:

    • 这告诉你匿名分配是如何管理的,而不是它是什么。虽然链接总体上是一个很好的链接。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        匿名块是通过 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 内存问题?

        【讨论】:

        • > 为什么要使用 pmap 来诊断 Java 内存问题?我们有一个堆设置为最大 256MB 的 java 进程,但它的 RSS 内存为 8.9GB。我们还可以使用什么其他工具来诊断?
        • @Opher - 当然,对你来说很有意义。但是你是OP吗? (如果是的话,你为什么要在 8 年后发表评论?)。从最初的问题来看,尚不清楚 OP 是否知道他/她在寻找什么。
        • 作为建议:如果您发现配置的堆大小和 RSS 之间存在这种差异,请查找内存映射文件或直接缓冲区。例如,您会在 Kafka 或 SOLR 服务器中看到此类行为,这很正常。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-04
        • 2014-12-07
        • 2011-12-28
        • 2020-10-12
        相关资源
        最近更新 更多