2016-04-15 60 views
0

我知道,通過使用flag verbose:class,我們可以讓jvm在加載類時從何處註銷。但是,我希望看到一些額外的信息 - 哪個類加載器加載了類,理想情況下是導致加載的正在執行的類。 (不完全確定,後者甚至是有道理的!)Java類加載 - 哪個類加載器和/或類導致加載?

有沒有什麼辦法讓jvm記錄這些信息,或者其他任何有關如何得到它的建議?由於

回答

0

你可以看到什麼觸發在某些情況下的一類負荷,如果你使用-XX:+TraceClassLoading-XX:+TraceClassResolution你會看到Loading消息的集合(當的.class字節得到加載)和隨後的RESOLVE消息時類本身得到解決。因此,通過計算出您看到的哪個RESOLVE消息應該能夠確定導致從屬類加載哪個類。

不幸的是,這並沒有告訴你有關你的類加載器的任何信息。因此,雖然它會打印出加載的JAR,但如果它不能唯一標識類加載器,則可能無法使用標準工具回答問題。但是,如果您使用的是提供自己的類加載器的嵌入式引擎(如Tomcat或OSGi),則可能會有其他調試標誌,您可以啓用該標誌以確定正在使用哪個類加載器實例。

0

如果你的問題是調試類加載,我會考慮使用調試器。

使用intellij我能夠在url-classloader中設置一個斷點。 您可以配置此斷點來記錄自定義消息而不是中斷。

如果你想在生產中打開這個功能,你當然可以編寫你自己的類加載器。

這並不困難,但您必須弄清楚如何在不記錄加載框架的情況下登錄到日誌框架。我猜最簡單的方法是在登錄時忽略一些預定義的軟件包。 如果你選擇這條路線,我可以爲你提供一個解決方案。 只是問。