Java任务控制(Java Mission Control)堆剖析

10

我正在使用随Java 7u40一起发布的全新Java Mission Control Profiler,并尝试对分配和收集对象统计数据进行分析,但无论我如何尝试,在“内存”->“对象统计”窗口中都看不到任何统计信息。

以下命令可启动收集:

jcmd <pid> JFR.start duration=60s settings=profile filename=alloc-prof.jfr

Java任務控制文檔中沒有提到啟用對象分析的具體選項。我嘗試創建自己的配置文件並設置:

  <flag name="heap-statistics-enabled" label="Heap Statistics">true</flag>
  <flag name="allocation-profiling-enabled" label="Allocation Profiling">true</flag>

但仍未收集到任何对象统计信息。

1个回答

11

使用Mission Control中提供的模板管理器。

转到Windows -> 模板管理器,导入模板并检查堆统计和分配分析,然后导出。完成!

如果您想要手动编辑jfc文件,了解控制元素内部的元素不会被JVM读取,例如flag元素。它们由JMC用于修改控制元素外部的参数(带有control属性的元素)

手动编辑需要修改以下内容:

将java/object_alloc_in_new_TLAB enabled设置为true

将java/object_alloc_outside_TLAB enabled设置为true

将vm/gc/detailed/object_count enabled设置为true

注意,有两个对象计数事件,选择object_count_after_gc将增加GC时间。如果改选上面那个,每个记录块将多一个GC(通常足够)。


1
谢谢!我会先尝试导出选项。 - Aleš
@kire-haglin 谢谢您详细的回复,非常有帮助!是否有更多关于object_countobject_count_after_gc的文档,以及everyChunk期间的确切含义?即,两者是否都会导致_GC,如果是,为什么?"recording chunk"是什么? - Hbf
1
你可以将录制块视为日志文件。当“日志文件”被轮换时,事件会被写入,period="everyChunk" 这样的设置确保每个录制文件(由一个或多个录制块组成)至少包含一个此类事件。只有 object_count 会增加额外的垃圾回收。 - Kire Haglin
这对我没有用。我能够检查“堆统计信息”并尝试了多次,但我仍然无法获得对象计数,并且JMC说在此记录中未启用“对象计数”。是否还需要做其他事情?JVM需要使用某些参数启动吗? - Jason
1
好的,我弄清楚了。它对我不起作用是因为我没有让飞行记录一直持续到我设置的时间结束。我将录制设置为60分钟,并在几分钟后停止了它。所以我尝试了一个5分钟的录音,并让它自己完成。然后对象统计信息出现了。 - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接