java - 在创建任何对象时在 java 中保存堆栈跟踪并在程序中的任何其他点使用它
问题描述
出于调试目的,我想在创建对象时保存堆栈跟踪,并稍后在程序中引用/打印它。我尝试在 OpenJDK 本身的 Object 类中添加一个字段,但正如这里提到的,它会导致 OpenJDK 中的硬编码元素出现问题。
有人可以建议一种有效的方法来做到这一点。
解决方案
如果对象很大或很频繁,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
]
}
...
推荐阅读
- python - 我已经安装了 python 扩展(windows),但无法在集成终端的右侧菜单中看到 python(VS Code)
- python - 如何创建以下四面体结构
- c# - 在 foreach 循环中等待任务完成
- c# - Serilog 没有记录任何东西
- c# - 如何使用 azure 功能运行运行时间超过 10 分钟的应用程序?
- .net-core - 有没有人在使用 .NET Core 3 时变得花哨?
- laravel - 使用 laravel-dompdf 和 vuejs 前端下载 PDF
- javascript - 如果本地存储对象中存在数据 ID,如何禁用按钮?
- sqlite - Xamarin Android SQLite 数据读取给了我“SQLite.SQLiteException:没有这样的表:tblLidhja”异常
- mysql - 如何在我的sql数据库中的两个时间戳记录之间按每分钟查找所有时间戳值间隔