我從示例中編譯了一個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
提交
取消