2013-05-02 112 views
0

我想擺脫一些內存泄漏。我想從類加載器中重置所有類的所有靜態變量(不僅是我的)。有一個classes屬性列出了ClassLoader已知的所有類。如何知道靜態塊初始化是否已經運行?

所以我只是想循環它,並用反射將靜態變量設置爲null。

問題是所有這些類都沒有被初始化(靜態塊初始化沒有運行)。目的是重新設置這些值然後卸載這些類,所以沒有必要對這些類進行初始化。此外,當我重置在另一個類CHILD的SBI中使用的類ROOT時,運行CHILD的SBI可能會導致意外的行爲...

所以問題是:有沒有辦法知道SBI已由JVM運行或不運行。


注:

任何人提議用classloader的findLoadedClass,有在規範這個重要的一句話:*在這篇文章中,有一個重要的提示:「裝載」沒有按」 t意思是「初始化」。初始化僅在JLS3定義的精確時刻發生$ 12.4.1 *

+1

http://stackoverflow.com/questions/3678579/how-to-check-whether-a-class-is-initialized我認爲這是什麼youre搜索 – LionC 2013-05-02 13:17:34

+0

你怎麼知道靜態塊是存儲器鏈接的原因?你有廣泛的個人資料嗎?除非您確切知道原因,否則嘗試過早優化是一個糟糕的主意。 – 2013-05-02 13:18:45

+0

@LionC查看我的帖子編輯 – poussma 2013-05-02 13:39:56

回答

0

static如果在JVM上加載了類,則會初始化塊。

上加載JVM類,你可以檢測ClassLoader

+1

在這篇文章中,有一個重要的注意事項:***「加載」並不意味着「初始化」。初始化只發生在由JLS3 $ 12.4.1定義的精確時刻*** – poussma 2013-05-02 13:36:45