1

我正在使用 weblogic 服务器,并试图为我的 Weblogic 服务器获取 JFR。我使用的命令行参数是:

-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=/my/path,repository=/some/path

这里有2个缺点:

1) 最多存储 3 个 JFR,之前的数据丢失。

2) 当出现 OOM 时,我执行脚本以使用信号 11 (SIGSEGV) 终止服务器。这不会转储当前记录的 JFR。

如何在崩溃时获取数据并保留所有 JFR 数据?空间在这里不是问题。如果我指定 maxage=0,则永远不会转储 JFR。如果我指定 maxsize,一旦达到限制,文件就会被删除。

4

1 回答 1

0

我假设 JDK 7/8,因为它是 2018 年并且您在 WLS 上,这意味着只能将记录转储到 Java 关闭挂钩中。尝试 SIGTERM

kill -l 15

在 JDK 9 及更高版本中,如果 JVM 崩溃,也可以(以本机方式)编写转储。该文件位于 Java 进程的启动位置,名为 hs_err_pidXXX.jfr

JDK 10 增加了对 Old Object Sample 事件的支持,可用于诊断内存泄漏。如果应用程序由于 OutOfMemoryError 而退出,它将写入一个带有 GC 根路径的 OOS 事件(无论您是否启用了该事件)。它应该提供解决内存泄漏的信息。

JDK 11.03 或更高版本包含一个命令行工具,可用于打印录制文件的内容。

$ jfr print --events OldObjectSample hs_oom_pidXXX.jfr

通过查看 allocationTime,您可以了解对象的分配时间。内存泄漏通常在应用程序的整个生命周期内分配,因此如果您忽略早期样本(静态对象)和晚期样本(短期对象),您可能会发现泄漏对象及其到 GC 根的路径。只需遵循参考链,直到找到不应该存在的参考。

于 2018-12-24T09:59:21.480 回答