Java Flight Recorder 未报告所有 GC 事件

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

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

提前谢谢您!

最佳答案

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

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

关于Java Flight Recorder 未报告所有 GC 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52902849/

相关文章:

java - 垃圾收集似乎在 Java 中不起作用

java - 通过将输入(日期)作为字符串对日期进行排序

java - 最佳实践? JNDI、Hibernate 和 Tomcat

multithreading - JMeter:tearDown Thread Group 的目的是什么

PHP MySQL : How to select multiple tables and return output summary with good performance?

JavaScript/JQuery 垃圾收集和事件

java - 当您丢弃对 SoftReference 的引用时,它的清除仍会放在 ReferenceQueue 上吗?

java - a += a++ * a++ * a++ 在 Java 中。它是如何被评估的?

java - OpenGL ES 2.0 和动态 VBO

c++ - 在什么平台上 memmove 和 memcpy 会有显着的性能差异?