2012-03-29 69 views
19

如何在jvm中加載和銷燬類時保持跟蹤?有沒有任何回調方法是由jvm公開的?如何跟蹤何時在jvm中加載和銷燬類?

+0

你在這裏問一個問題。你究竟想要學習什麼,或試圖完成什麼?一旦你明白了,接受那個對你最有幫助的答案。 – Frans 2014-12-11 07:05:09

回答

0

您可以使用靜態塊來檢測類加載,但無法檢測類卸載。 在java中,通過系統類加載器加載的所有類將永遠不會被卸載,並且只有在卸載類加載器時纔會卸載通過其他類加載器加載的所有類。

static{ 

     //execute when the class will be loaded 

    } 
5

您可以添加Java選擇只查看哪個類通過加載:

java -verbose:class 

關於銷燬類,我不知道。

0

你想在你的應用程序中使用這些信息,還是隻想從外部分析這些信息?在後一種情況下,你可以使用VisualVM。也許你的問題與此相關:Loaded classes in VisualVM

7

您可以將command line option-verbose:class添加到您的Java進程中,這將顯示關於加載的每個類的信息 。

0

您可以在靜態構造函數中跟蹤類的創建。就我而言,你無法追蹤它的破壞。只有當gc收集用於加載類的類加載器時纔會卸載類。
您可能也有興趣閱讀這樣的:another question on classloaders at StackOverflow

2

如果是正常使用JRockit JVM,您可以利用下面的API,當一個類加載和類卸載,這將給你的回調方法。
查看我們應該使用getClassLibrary()方法的JVM類。
在classLibrary對象,我們可以爲類加載如果你使用的是Sun/Oracle的JVM這給班級名稱等

21

,您可以使用TraceClassLoadingTraceClassUnloading選項註冊事件偵聽器。使用以下命令來看看有什麼選擇你的JVM支持:

java -XX:+AggressiveOpts -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal -version 

如果這些選項都支持,使用-XX:+TraceClassLoading -XX:+TraceClassUnloading運行Java應用程序。你應該看到如下信息:

[Loaded ... from ...] 
[Unloading class ...]