我正在使用weblogic服务器,并试图为我的Weblogic服务器获取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,则一旦达到限制,文件就会被删除。
发布于 2018-12-24 17:59:21
我假设JDK是7/8,因为现在是2018年,而您使用的是WLS,这意味着只能将记录转储到Java关闭钩子中。尝试SIGTERM
kill -l 15在JDK9和更高版本中,如果JVM崩溃,也可以(在本地)编写转储。该文件位于启动Java进程的位置,名为hs_err_pidXXX.jfr
JDK 10添加了对旧对象样本事件的支持,可用于诊断内存泄漏。如果应用程序由于OutOfMemoryError而退出,它将编写一个包含GC根目录路径的OOS事件(无论您是否启用了该事件)。它应该提供解决内存泄漏的信息。
JDK 11.03或更高版本包含一个命令行工具,可用于打印记录文件的内容。
$ jfr print --events OldObjectSample hs_oom_pidXXX.jfr通过查看allocationTime,您可以看到对象何时被分配。内存泄漏通常是在应用程序的整个生命周期内分配的,所以如果忽略早期样本(静态对象)和后期样本(短期对象),很可能会发现泄漏对象及其到GC根目录的路径。只要沿着引用链走,直到你找到一个不应该存在的引用。
https://stackoverflow.com/questions/33774667
复制相似问题