有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正在尝试查找漏洞!anon对pmap意味着什么?

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

输出非常长,但基本上大部分是重复的:

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

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


共 (4) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    使用EclipseMat(当您从Java堆而不是本机堆中获取OfMemoryExceptions时)

  3. # 4 楼答案

    我以前在螺纹泄漏中见过这种模式。如果您的代码试图汇集线程,但不知何故弄乱并泄漏了一个线程,那么您会在pmap中得到类似的模式

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

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