0

我们有性能构建,它在打开以下标志的情况下生成我们的应用程序:

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=dumponexit=true,dumponexitpath=/tmp/ImaginaryApplication/logs/flightRecorder.jfr -XX:StartFlightRecording=defaultrecording=true,settings=MyCustomSetting

自定义设置是通过 Flight Recorder UI 创建的,所有设置均已打开。我想与我的问题相关的重要部分如下:

  <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% 确信它会记录所有内容。首先,在 Memory -> Garbage Collection 页面中只报告了少量 GC。我知道这一点,因为我们还打开了将 GC 写入文件的标志。GC 比飞行记录器中报告的要多得多。更重要的是,我担心内存分配结果没有记录准确的信息(就像 GC 事件一样)。在这种情况下,我们可能会花费大量精力来调整错误的区域。

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

先感谢您!

4

2 回答 2

1

我使用settings=profile的默认设置不记录所有分配信息。

即使这样,它也只记录触发新 TLAB 的对象,默认情况下该对象可能很大。为了增加样本数量,我使用-XX:TLABSize=128kNOTE 缩小了 TLAB,这可能会稍微损害性能,所以除了分析之外我不会使用。

于 2018-10-20T10:11:55.990 回答
0

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

启用所有 GC 事件的最简单方法是使用 Java Mission Control 和 Recording Wizard 导出配置。在“垃圾收集”的下拉菜单中选择“全部”。

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

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

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

JVM 不会读取问题中显示的设置。它们仅由 JMC 用于应用设置。

于 2018-10-20T23:19:34.280 回答