当前位置: 首页 > 知识库问答 >
问题:

什么是java堆中的活对象?(使用jmap进行堆转储)

尹善
2023-03-14

jmap帮助显示:

...

-dump:<dump-options> to dump java heap in hprof binary format
                    dump-options:
                      live         dump only live objects; if not specified,
                                   all objects in the heap are dumped.

...

一旦我转储一个Tomcat(带有java参数-Xmx384m)堆:

jmap -dump:file=dump.bin <pid>

我有一个300M的转储文件。

当我只使用活动对象转储其堆时:

jmap -dump:live,file=live-dump.bin <pid>

我有一个120M的转储文件。

我对活物体的猜测可能是:

>

  • 年轻一代中的对象;

    使用/引用/可访问且不会被收集的对象。

    哪一个是对的?

    使现代化

    我的猜测#2似乎是正确的,感谢Alexey Ragozin的解释(live选项将导致完整GC)。我根据他的提示再次测试:

    jmap -dump:file=dump.hprof <pid>
    jmap -dump:live,file=live-dump.hprof <pid>
    jmap -dump:file=after-live-dump.hprof <pid>
    

    这3个文件的大小是:

    dump.hprof ~190MB
    live-dump.hprof ~40MB
    after-live-dump.hprof ~40MB
    

    所以在-dump:live之后,堆中几乎所有的对象都是活动的。

  • 共有1个答案

    陆正奇
    2023-03-14

    jmap-dump:live,file=live dump。箱子

    下面jmap命令中的live选项强制JVM在将堆内容倾倒到文件中之前执行完整的GC。

    在完整的GC之后,只有从GC根(活的定义)可瞬态到达的对象留在堆中。

     类似资料:
    • 我使用jmap使用CMS GC转储应用程序的实时堆: 我用YourKit打开了这个转储,它发现8Gb堆的61%是不可访问的,特别是 我以为使用意味着它只包含可访问的对象? 总司令。应用程序的日志文件可疑地缺少由我调用jmap引起的任何完整GC,而是在我进行转储的两侧显示以下行: 在堆转储完成后第一次CMS重置后的第一个ParNew集合中,我看到堆的大小大致与堆转储中的大小相同(大约3-4Gb):

    • 问题内容: 我只是在一本Java书中读到这句话,说Java中的对象驻留在堆上。使用堆是因为它是快速存储数据和快速检索数据的最佳方法吗? 我只有一个关于数据结构初学者的想法。我的意思是为什么不堆叠或其他? 问题答案: 堆栈的问题是您只能删除最近添加的内容。这对于局部变量非常有效,因为它们在您进入和退出函数时会来来去去,但对于生命周期不遵循单个函数的任意数据而言,效果则不太好。内存堆使您可以随意添加和

    • 问题内容: 有人告诉我可以在我的JBoss启动脚本中将参数添加到JVM启动选项中,以在我们的应用程序出现内存不足错误时进行堆转储。我想知道这些数据在哪里转储?它只是到控制台还是一些日志文件?如果只是控制台,如果我没有通过控制台登录Unix服务器怎么办? 问题答案: 这是Oracle文档必须说的: 默认情况下,堆转储在VM的工作目录中的一个名为 的文件中创建,如上例所示。你可以使用该选项指定备用文件

    • 我试图使用以下两个命令获取堆转储 jcmd$pid GC.heap_dump /tmp/filename.dump jmap-转储:格式=b,文件=/tmp/filename.dump$pid jcmd产生约300M的文件大小,jmap产生约1.4G的文件大小。为什么这些尺寸不同,我们在jmap中有其他信息吗?我在jcmd中遗漏了一些论点吗? JDK是1.8.0_162 Xms和Xmx是4G

    • 次要GC-当垃圾收集器清除年轻一代中未从“根”引用的对象时。次要GC仅适用于年轻堆。但是如果从旧堆引用了年轻对象怎么办?

    • 假设MAX-HEAPIFY操作。其中父元素值大于其子元素值。 > siftUp将一个太大的节点与其父节点交换(从而将其向上移动),直到它不大于其上的节点。buildHeap函数获取一个未排序项的数组,并移动它们,直到它们都满足heap属性。 构建堆有两种方法。一种是从堆的顶部(数组的开始)开始,并对每个项调用siftUp。在每个步骤中,先前筛选的项(数组中当前项之前的项)形成一个有效的堆,向上筛选