我从示例中编译了一个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.jfrjava的Windows任务管理器中的内存使用量上升,然后在超过200秒后:线程“main”中出现异常 java.lang.OutOfMemoryError:TestFlightRecorder.main(TestFlightRecorder.java:12) 处的 Java 堆空间 [jfr][ERROR][1014.291] 关闭时无法删除存储库结果flight.jfr大小为 0 字节。(当我使用简单的 hello world java 类执行相同的命令时,创建的 Flight.jfr 大小为 125Kb,其中包含“空”信息 - 我猜这是因为应用程序运行得如此之快,飞行记录尚未开始 - 而这个问题不是关于那种空虚)。此类错误的网络搜索没有结果。为什么会出错,是不是我录音时做错了什么?
2 回答

翻翻过去那场雪
TA贡献2065条经验 获得超14个赞
当应用程序结束时,Java Flight Recorder 将转储写入 Java 关闭挂钩中。如果没有足够的内存来生成转储,它将失败。
发生该错误的原因是,当关闭挂钩线程尝试删除该文件时,该文件仍由 JVM 保留。

狐的传说
TA贡献1804条经验 获得超3个赞
OOMError 可能会严重破坏 JVM,导致飞行记录器无法写入
我运行代码的重新编码时间为 20 秒,而不是 200 秒(在任务管理器中,我看到 java 内存使用量也在大约这段时间内增长到了 2Gb 的最大堆),并获得了与课程中呈现的图表类似的记录结果。所以我认为当前的问题已经解决。
添加回答
举报
0/150
提交
取消