Java飞行记录器未报告所有GC事件

Java飞行记录器未报告所有GC事件,java,performance,garbage-collection,jmc,jfr,Java,Performance,Garbage Collection,Jmc,Jfr,我们有一个性能构建,在启用以下标志的情况下生成应用程序: -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=dumponexit=true,dumponexitpath=/tmp/ImaginaryApplication/logs/flightRecorder.jfr -XX:StartFlightRecording=defaultrecording=true,settings=MyCustom

我们有一个性能构建,在启用以下标志的情况下生成应用程序:

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=dumponexit=true,dumponexitpath=/tmp/ImaginaryApplication/logs/flightRecorder.jfr -XX:StartFlightRecording=defaultrecording=true,settings=MyCustomSetting
自定义设置是通过飞行记录器用户界面创建的,所有设置都已打开。我想与我的问题相关的重要部分如下:

  <selection name="gc-level" default="all" label="Garbage Collector">
    <option label="Off" name="off">off</option>
    <option label="Normal" name="detailed">normal</option>
    <option label="All" name="all">all</option>
  </selection>

  <condition name="gc-enabled-normal" true="true" false="false">
    <or>
      <test name="gc-level" operator="equal" value="normal"/>
      <test name="gc-level" operator="equal" value="all"/>
    </or>
  </condition>

  <condition name="gc-enabled-all" true="true" false="false">
    <test name="gc-level" operator="equal" value="all"/>
  </condition>

关
典型的
全部的
飞行记录是在构建停止时生成的。然而,我并不是100%确信它记录了一切。首先,在内存->垃圾收集页面中只报告了很少的GC。我知道这一点,因为我们还打开了将GC写入文件的标志。有比飞行记录器中报告的更多的GC。 更重要的是,我担心内存分配结果没有记录准确的信息(就像GC事件一样)。在这种情况下,我们可能会花费大量精力调整错误的区域

我错过了这里的任何设置吗


提前谢谢你

我使用
settings=profile
,因为默认设置不会记录所有分配信息


即使如此,它也只记录触发新TLAB的对象,默认情况下,新TLAB可能很大。为了增加样本数,我使用
-XX:TLABSize=128k收缩TLAB
注意,这会稍微影响性能,因此除了评测之外,我不会使用它。

默认情况下,所有垃圾收集事件都不会启用。我的意思是,主要的GC事件在那里,所以你可以看到暂停时间等,但不是所有的细节

启用所有GC事件的最简单方法是使用Java任务控制和录制向导导出配置。在“垃圾收集”下拉列表中选择“全部”

如果无法使用JMC连接到JVM,则可以使用JMC中位于窗口菜单中的Flight Recorder模板管理器。您可以导入位于JDK_HOME/bin/lib/jfr目录中的default.jfc,复制并编辑它。为垃圾收集选择“全部”,并将配置导出到新文件

然后,您可以使用以下命令启动JVM:

java -XX:StartFlightRecording:settings=all-gc-events.jfc

JVM无法读取问题中显示的设置。它们仅用于JMC应用设置。

谢谢Peter。我要试一试。