我正在使用weblogic服务器,并试图获取我的Weblogic Server的JFR。我使用的命令行参数是:
-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=/my/path,repository=/some/path
这里有两个缺点:
1)最多存储3个JFR,之前的数据丢失。
2)当有OOM时,我执行一个脚本以使用信号11(SIGSEGV)来终止服务器。这不会转储当前记录的JFR。
如何在崩溃时获取数据并保留所有JFR数据?空间不是问题。如果我指定maxage = 0,则永远不会转储JFR。如果我指定maxsize,则一旦达到限制就会删除文件。
答案 0 :(得分:0)
我假设JDK 7/8,因为它是2018,并且您在WLS上,这意味着只能将记录转储到Java shutdown挂钩中。试试SIGTERM
kill -l 15
在JDK 9和更高版本中,如果JVM崩溃,也可以写入(以本机方式)转储。该文件位于启动Java进程的位置,名为hs_err_pidXXX.jfr
JDK 10添加了对“旧对象样本”事件的支持,该事件可用于诊断内存泄漏。如果应用程序由于OutOfMemoryError而退出,它将编写一个OOS事件,并带有指向GC根目录的路径(无论是否启用了该事件)。它应该提供解决内存泄漏的信息。
JDK 11.03或更高版本包含一个命令行工具,可用于打印记录文件的内容。
$ jfr print --events OldObjectSample hs_oom_pidXXX.jfr
通过查看分配时间,您可以看到分配对象的时间。内存泄漏通常是在应用程序的整个生命周期内分配的,因此,如果忽略早期样本(静态对象)和晚期样本(短期对象),则很可能会发现泄漏对象及其通往GC根的路径。只需遵循参考链,直到找到不应该存在的参考。