猿问

来自命令行的 Java Flight Recorder (JFR):[jfr] [错误]

我从示例中编译了一个java代码(添加classimports因为它没有编译它们):

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秒后:

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

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

此类错误的网络搜索没有结果。为什么会出错,是不是我录音时做错了什么?


一只萌萌小番薯
浏览 272回答 2
2回答

翻翻过去那场雪

当应用程序结束时,Java Flight Recorder 将转储写入 Java 关闭挂钩中。如果没有足够的内存来生成转储,它将失败。发生该错误的原因是,当关闭挂钩线程尝试删除该文件时,该文件仍由 JVM 保留。

狐的传说

OOMError 可能会严重破坏 JVM,导致飞行记录器无法写入我运行代码的重新编码时间为 20 秒,而不是 200 秒(在任务管理器中,我看到 java 内存使用量也在大约这段时间内增长到了 2Gb 的最大堆),并获得了与课程中呈现的图表类似的记录结果。所以我认为当前的问题已经解决。
随时随地看视频慕课网APP

相关分类

Java
我要回答