2

我正在学习 Java Flight Recorder 用法java-flight-recorder-monitoring 的课程。

我从示例编译了一个java代码(添加class并且imports因为它没有编译它们):

import java.util.ArrayList;
import java.util.List;

class TestFlightRecorder {
public static void main(String[] args) {
    List<Object> items = new ArrayList<>(1);
    try {
        while (true){
            items.add(new Object());
        }
    } catch (OutOfMemoryError e){
        System.out.println(e.getMessage());
    }
    assert items.size() > 0;
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        System.out.println(e.getMessage());
    }
}
}

然后我按照课程运行:

C:\Program Files\Java\jdk1.8.0_191\bin>java -XX:+UnlockCommercialFeatures -XX:+F lightRecorder -XX:StartFlightRecording=duration=200s,filename=c:\am\out\flight.j fr - cp c:\am\out TestFlightRecorder

之后立即输出:

开始录制 1. 结果将写入:

C:\AM\out\flight.jfr

java的Windows任务管理器中的内存使用量上升,然后超过200秒:

线程“主”java.lang.OutOfMemoryError 中的异常:TestFlightRecorder.main(TestFlightRecorder.java:12) 处的 Java 堆空间 [jfr][ERROR][1014.291] 关闭时无法删除存储库

结果flight.jfr大小为 0 字节。(当我使用简单的 hello world java 类发出相同的命令时,flight.jfr 的创建大小为 125Kb,其中包含“空”信息——我猜这是因为应用程序运行得如此之快,飞行记录尚未开始——而这问题不在于那种空虚)。

对此类错误的网络搜索没有结果。为什么出错,我做错了什么来录制?

4

2 回答 2

2

当应用程序结束时,Java Flight Recorder 将转储写入 Java 关闭挂钩。如果没有足够的内存来生成转储,它将失败。

发生该错误是因为该文件仍由 JVM 持有,而关闭挂钩线程试图将其删除。

于 2019-08-30T13:54:49.320 回答
1

亚伦的评论暗示:

OOMError 可能会破坏 JVM,导致飞行记录器无法写入

我以 20 秒而不是 200 秒的重新编码时间运行代码(在任务管理器中,我看到 java 内存使用量也在大约那个时间增长到 2Gb 的最大堆)并得到了与课程中呈现的图表类似的记录。所以我认为当前的问题已经解决。

于 2019-08-29T16:26:00.800 回答