首页 > 解决方案 > 在创建任何对象时在 java 中保存堆栈跟踪并在程序中的任何其他点使用它

问题描述

出于调试目的,我想在创建对象时保存堆栈跟踪,并稍后在程序中引用/打印它。我尝试在 OpenJDK 本身的 Object 类中添加一个字段,但正如这里提到的,它会导致 OpenJDK 中的硬编码元素出现问题。

有人可以建议一种有效的方法来做到这一点。

标签: javastack-trace

解决方案


如果对象很大或很频繁,JFR 将对分配进行抽样。默认情况下,它的采样率高达 150 次/秒。

JDK 16 或更高版本:

$ java -XX:StartFlightRecording:filename=exitdump.jfr MyApp
...
Stop the application
$ jfr print --events ObjectAllocationSample --stack-depth 64 exitdump.jfr

jdk.ObjectAllocationSample {
  startTime = 12:00:19.826
  objectClass = byte[] (classLoader = bootstrap)
  weight = 23.1 kB
  eventThread = "Image Animator 0" (javaThreadId = 33)
  stackTrace = [
    sun.awt.image.GifFrame.dispose() line: 723
    sun.awt.image.GifImageDecoder.produceImage() line: 247
    sun.awt.image.InputStreamImageSource.doFetch() line: 269
    sun.awt.image.ImageFetcher.fetchloop() line: 212
    sun.awt.image.ImageFetcher.run() line: 176
  ]
}
...

推荐阅读