2015-09-15 22 views
1

我有一個Java程序,我啓動它(parameters for FR的建議在這裏):結束Java的飛行記錄器的選擇不工作,文件存儲只有在持續時間設置

-XX:+ UnlockCommercialFeatures -XX:+ FlightRecorder -XX:StartFlightRecording = duration = 2m,filename = myflightrecord.jfr -XX:FlightRecorderOptions = maxsize = 100k,maxage = 1m

爲了有飛行記錄器信息。

我會想到的是,最大生存週期=1米會給我只有一分鐘的記錄,並MAXSIZE = 100K文件的大小不會是比在100Kb較大,但他們沒有做工作按預期。

我遇到的另一個問題是我想每隔一段時間就要存儲一次文件,讓我們假設每一分鐘。但文件「myflightrecord.jfr」在達到持續時間之前是空的(在本例中爲2分鐘)。

有沒有什麼辦法讓飛行記錄器在持續時間結束前沖水?

PS:我使用的Java版本是JDK1.8.0_45

回答

2

的最大生存週期和maxsize選項只有當你有一個連續記錄(=未設置時間)申請。我也認爲他們只是指導方針,而不是確切的限制。

如果您想要將數據刷新到磁盤進行連續記錄,可以設置disk = true,並且如果要指定數據應該放在哪裏,可以設置repository = path (我相信當內存緩衝區已滿時,數據只會刷新到磁盤,我不確定當線程本地緩衝區已滿或全局緩衝區已滿時,請參閱此幻燈片中的幻燈片13以獲取描述此內容的圖片:http://www.slideshare.net/marcushirt/java-mission-control-java-flight-recorder-deep-dive

請參閱https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html XX:FlightRecorderOptions for more info。你也可以檢查threadbuffersize和globalbuffersize。

我知道標誌的有效組合已經有所不同,所以文檔可能並不完全是最新的。

Kire Haglin可以糾正我在哪裏我誤解了事情。

+0

我試過了你建議的選項,但仍然沒有得到任何東西。我會再次測試參數(可能持續時間是一個參數,不與所有參數結合?),並讓你知道!感謝您的回答 – pokeRex110

+0

正如您從我的答案的詳細程度中可以看出的那樣,持續獲取JFR數據並不是真正的我們支持的用例,因此您必須使用標誌等來實現它。 – Klara

+0

你可以結合maxage,maxsize和duration,但最有可能的不是你想要做的。 –

3

這是針對JDK 7和JDK 8(Hotspot)以及JDK 5和6(JRockit)的。

首先,MAXSIZE最大生存週期只有當你有一個基於磁盤的記錄,因爲參數控制多少數據要保存在磁盤工作。

如果您有內存記錄(defaultrecording = true,disk = false),則內存緩衝區的大小取決於正在使用的線程數,每個線程允許使用多少內存,全局緩衝區的數量等

飛行記錄器是專爲大型服務器與GB的內存和磁盤TB,所以我不認爲JVM將能夠尊重你提供的數量,即一個事件可能大於100kb,但通常大約是50-150字節。

二,參數名稱(maxsize and maxage)是誤導性的。這不是最大大小/年限,而是JVM在旋轉時刪除日誌文件的閾值,通常每12 MB發生一次。爲了儘量減少開銷,當滿足閾值時,JVM不會立即停止所有線程,這意味着數據溢出,實際上它是12-15 MB。如果系統高度飽和,則可能會更多,請考慮30-40 MB。

所以設置MAXSIZE到100K將無法正常工作,你總是會得到至少12 MB,

如果設置了最大生存週期 1分鐘,你會得到的數據至少1分鐘,如果它可以適合大約一個日誌文件的大小,則可能更多,12-15 Mb。

如果您有內存中記錄,則在記錄結束時將數據從內存緩衝區複製到磁盤。這就是爲什麼你的文件是空的。如果您希望Flight Recorder連續寫入磁盤,則應設置disk = true