我從示例中編譯了一個(gè)java代碼(添加class和imports因?yàn)樗鼪]有編譯它們):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());? ? }}}然后我按照課程運(yùn)行: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.結(jié)果將寫入:C:\AM\out\flight.jfrjava的Windows任務(wù)管理器中的內(nèi)存使用量上升,然后在超過200秒后:線程“main”中出現(xiàn)異常 java.lang.OutOfMemoryError:TestFlightRecorder.main(TestFlightRecorder.java:12) 處的 Java 堆空間 [jfr][ERROR][1014.291] 關(guān)閉時(shí)無法刪除存儲(chǔ)庫(kù)結(jié)果flight.jfr大小為 0 字節(jié)。(當(dāng)我使用簡(jiǎn)單的 hello world java 類執(zhí)行相同的命令時(shí),創(chuàng)建的 Flight.jfr 大小為 125Kb,其中包含“空”信息 - 我猜這是因?yàn)閼?yīng)用程序運(yùn)行得如此之快,飛行記錄尚未開始 - 而這個(gè)問題不是關(guān)于那種空虛)。此類錯(cuò)誤的網(wǎng)絡(luò)搜索沒有結(jié)果。為什么會(huì)出錯(cuò),是不是我錄音時(shí)做錯(cuò)了什么?
2 回答

翻翻過去那場(chǎng)雪
TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊
當(dāng)應(yīng)用程序結(jié)束時(shí),Java Flight Recorder 將轉(zhuǎn)儲(chǔ)寫入 Java 關(guān)閉掛鉤中。如果沒有足夠的內(nèi)存來生成轉(zhuǎn)儲(chǔ),它將失敗。
發(fā)生該錯(cuò)誤的原因是,當(dāng)關(guān)閉掛鉤線程嘗試刪除該文件時(shí),該文件仍由 JVM 保留。

狐的傳說
TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
OOMError 可能會(huì)嚴(yán)重破壞 JVM,導(dǎo)致飛行記錄器無法寫入
我運(yùn)行代碼的重新編碼時(shí)間為 20 秒,而不是 200 秒(在任務(wù)管理器中,我看到 java 內(nèi)存使用量也在大約這段時(shí)間內(nèi)增長(zhǎng)到了 2Gb 的最大堆),并獲得了與課程中呈現(xiàn)的圖表類似的記錄結(jié)果。所以我認(rèn)為當(dāng)前的問題已經(jīng)解決。
添加回答
舉報(bào)
0/150
提交
取消