簡體   English   中英

使用Java Flight Recorder和Java Mission Control監視鎖

[英]Monitoring Locks with Java Flight Recorder and Java Mission Control

我想做的事

我有一個要改進的Java程序。 我懷疑代碼中的同步塊會損害性能,但是在觸摸代碼之前,我想確保這是我的問題。

我如何繼續

為了檢查是否確實存在同步塊,我使用Flight Recorder在測試服務器上記錄了程序的執行情況,將創建的jfr文件下載到了桌面上,並使用Java Mission Control打開了它。 但是, Java Application中的“ Lock Instances頁面未顯示任何內容。 我得到的唯一線索是“結果”視圖中的一條消息,內容為:

Java阻止規則要求事件可以從以下事件類型中獲得:com.oracle.jdk.JavaMonitorEnter

因此,我假設必須有某種選項可以與飛行記錄器一起激活,但到目前為止我還找不到。

我的問題

如何通過Java Flight Recorder記錄來自com.oracle.jdk.JavaMonitorEnter類型的事件?
還是我錯過了其他東西,還有更好的方法來找出Java程序中對同步塊進行了多少阻塞?

我的環境

我正在使用Oracle JDK 1.8.0_191版本。 我在桌面上使用的Java Mission Control版本是6.0.0。 最后,我用來記錄程序執行情況的命令如下:

java -XX:+UnlockCommercialFeatures -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -XX:+FlightRecorder -XX:StartFlightRecording=settings=profile,dumponexit=true,filename=test.jfr -classpath lib/*:src/ <my program with its arguments>

我還應該補充一點,使用Java Mission Control直接連接到服務器不是一種選擇(或者是嗎?),因為我正在使用ssh反彈來實際連接到服務器...

我自己進行的少量研究為我提供了答案。

需要在飛行記錄器配置文件中指定JavaMonitorEnter事件(以及其他要監視的事件)。 在這種情況下,我使用的是Oracle JDK隨附的profile配置和default配置。

我使用Java Mission Control創建了自己的配置。 該博客對介紹如何找到在Java Mission Control中創建自定義錄制配置的工具非常有幫助。

然后,我導出了新創建的配置,將其上傳到測試環境中,並在命令中指定了此配置(僅在經過修改的選項下方):

-XX:StartFlightRecording=settings=/home/<username>/Custom,<other options>...

我真正的問題是

在Oracle JDK提供的飛行記錄器配置中激活了阻止記錄。 但是,要實際記錄阻止,它們需要持續超過一定的閾值( default配置為20ms,配置profile配置為10ms)。

在我的應用程序中,單個阻止的時間短於該閾值,因此當我在Java Mission Control中打開記錄時什么也沒出現。

我的主要困惑來源是消息,指出“ Java阻止規則要求事件可用...”。 關於我的情況的更准確的描述是不會記錄超過配置閾值的阻塞

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM