使用 HPROF 側寫程式

HPROF 是 IBM® SDK 隨附的示範側寫程式,使用 JVMTI 來收集並記錄 Java™ 執行的相關資訊。 您可以使用 HPROF 來找出程式的哪些部分使用最多記憶體或處理器時間。

若要提高應用程式的效率,您必須知道程式碼的哪些部分正在使用大量記憶體及處理器資源。 HPROF 是範例 JVMTI 代理程式,並使用下列語法來啟動:
java -Xrunhprof[:<option>=<value>,...] <classname>

當您使用 HPROF 執行 Java 時,會在程式結束時建立檔案。 除非提供不同的檔名,否則這個檔案會放在現行工作目錄中,稱為 java.hprof.txt (如果使用二進位格式,則稱為java.hprof )。 此檔案包含許多不同的區段,但確切的格式和內容取決於選取的選項。

如果您需要 HPROF 的相關資訊,請參閱 https://docs.oracle.com/javase/8/docs/technotes/samples/hprof.html

指令 java -Xrunhprof:help 顯示可用的選項:

heap=dump|sites|all
此選項有助於分析記憶體用量。 它會告知 HPROF 產生堆疊追蹤,您可以從中查看配置記憶體的位置。 如果您使用 heap=dump 選項,則會取得資料堆中所有存活物件的傾出。 使用 heap=sites,您會在開始時取得具有最多配置物件之站台的排序清單。 預設值 all 會提供兩種類型的輸出。
cpu=samples|times|old
cpu 選項提供的資訊有助於判斷處理器花費大部分時間的位置。 如果 cpu 設為 samples, JVM 會暫停執行,並識別作用中的方法呼叫。 如果取樣率夠高,您可以清楚瞭解程式大部分時間花在何處。 如果 cpu 設為 times,您會收到精確測量,指出每一個方法被呼叫的次數,以及每次執行所花費的時間。 雖然此選項更精確,但它會使程式變慢。 如果 cpu 設為 old,則會以舊的 HPROF 格式產生側寫資料。
interval=y|n
interval 選項僅適用於 cpu=samples ,並控制取樣執行緒在執行緒堆疊樣本之間休眠的時間。
monitor=y|n
monitor 選項可協助您瞭解同步化對應用程式效能的影響。 監視器會實作執行緒同步化。 取得監視器的相關資訊,可以告訴您在嘗試存取已鎖定的資源時,不同的執行緒所花費的時間。 HPROF 也會提供使用中監視器的 Snapshot。 此資訊有助於偵測死鎖。
format=a|b
輸出檔的預設值是 ASCII 格式。 如果您要指定二進位格式,請將 format 設為 'b' ,這對於部分公用程式 (例如「資料堆分析工具」) 是必要的。
file=<filename>
使用 file 選項來變更輸出檔的名稱。 ASCII 檔案的預設名稱為 java.hprof.txt。 二進位檔的預設名稱是 java.hprof
force=y|n
通常,預設值 (force=y) 會改寫輸出檔中的任何現有資訊。 因此,如果您有多個 JVM 在啟用 HPROF 的情況下執行,請使用 force=n,這會視需要將其他字元附加至輸出檔名稱。
net=<host>:<port>
若要透過網路而非本端檔案傳送輸出,請使用 net 選項。
depth=<size>
depth 選項指出堆疊追蹤中要顯示的方法訊框數。 預設值為 4。
thread=y|n
如果您將 thread 選項設為 y,則會在每一個追蹤旁邊列印執行緒 ID。 如果您無法看到哪個執行緒與哪個追蹤相關聯,則此選項非常有用。 這種類型的問題可能發生在多執行緒應用程式中。
doe=y|n
預設行為是在應用程式結束時收集設定檔資訊。 若要在執行期間收集側寫資料,請將 doe (結束時傾出) 設為 n
msa=y|n
此特性在 IBM SDK 平台上不受支援。
cutoff=<value>
產生的許多範例項目佔總執行時間的小百分比。 依預設, HPROF 包括所有執行路徑,這些執行路徑至少代表處理器所花費時間的 0.0001 百分比。 您可以使用此選項來增加或減少該截斷點。 例如,若要刪除代表總執行時間的四分之一以下的所有項目,請指定 cutoff=0.0025
verbose=y|n
此選項會在取得傾出時產生訊息。 預設值為 y
lineno=y|n
每一個訊框通常包括已處理的行號,但您可以使用此選項來抑制輸出清單中的行號。 如果啟用,則每一個頁框都包含文字 Unknown line ,而不是行號。
TRACE 1056:
java/util/Locale.toUpperCase(Locale.java:Unknown line)
java/util/Locale.<init>(Locale.java:Unknown line)
java/util/Locale.<clinit>(Locale.java:Unknown line)
sun/io/CharacterEncoding.aliasName(CharacterEncoding.java:Unknown line)