【发布时间】:2021-10-26 06:37:06
【问题描述】:
在 OpenJDK 16.1 上分析我们的应用程序时,我看到 ObjectAllocationSample 事件中记录了一些奇怪的分配样本。
第一个示例事件是这个最初让我有点害怕的事件:
jdk.ObjectAllocationSample {
startTime = 22:22:12.027
objectClass = java.util.ArrayList (classLoader = bootstrap)
weight = 6.1 GB
eventThread = "My thread" (javaThreadId = 52)
stackTrace = [
jdk.jfr.internal.PlatformRecorder.getListeners() line: 169
jdk.jfr.internal.PlatformRecording.notifyIfStateChanged(RecordingState, RecordingState) line: 496
jdk.jfr.internal.PlatformRecording.start() line: 150
jdk.jfr.Recording.start() line: 184
myapp.JfrProfiler.start() line: 152
...
]
}
我很难相信 JFR 侦听器的列表有 6.1GB 大,并且该方法只调用了一次,那么在这种情况下,事件中的堆栈跟踪是什么意思呢? 这只是我们分配 ArrayList 的调用点之一,而且它恰好是开始录制后的第一个调用点吗? 如果是,是否在开始记录之前权重包括所有分配?
相同objectClass 的后续样本呢?我们能否相信堆栈跟踪可以很好地指示分配发生的位置,还是只是分配发生的随机位置?
诸如 JProfiler 之类的工具使用堆栈跟踪来提示哪些方法是分配热点,从而使上述调用站点显着突出,即使它不是大多数分配发生的地方。
【问题讨论】:
标签: java profiling jprofiler jfr