當我打電話就像一個靜態方法:的Java:`static`方法
Something.action();
由於不創建一個實例多久靜態方法的類被保存在內存中?
如果我調用相同的方法,將爲每個調用重新加載Class,因爲沒有實例存在?
只有在調用時加載單個靜態方法,或者是加載到內存中的所有方法和類的靜態方法,即使只使用一種靜態方法?
當我打電話就像一個靜態方法:的Java:`static`方法
Something.action();
由於不創建一個實例多久靜態方法的類被保存在內存中?
如果我調用相同的方法,將爲每個調用重新加載Class,因爲沒有實例存在?
只有在調用時加載單個靜態方法,或者是加載到內存中的所有方法和類的靜態方法,即使只使用一種靜態方法?
除非您配置了permgenspace的垃圾回收,否則該類會留在內存中,直到vm退出。完整的類用所有靜態方法加載。
該類留在內存中,直到加載該類的類加載器保留在內存中。所以,如果這個類是從系統類加載器加載的,那麼就我所知,這個類永遠不會被卸載。
如果你想卸載一個類時,你需要:
東西類將在加載調用者類時加載。正如krosenvold所說,它一直呆在那裏直到虛擬機退出。
在某些配置中,類在您撥打電話前甚至會被加載。我們使用了BES(Borland Enterprise Server),並且我們的Solaris生產服務器出現問題,其中所有引用的類在我們的應用程序啓動時遞歸加載。這意味着,當我們的應用程序的主類被加載時,應用程序服務器遞歸地加載該類的導入部分中引用的所有類。作爲一個方面說明,除非你在一個非常內存的約束環境中運行,或者如果你正在加載很多很多不必要的類,那麼你不應該在意內存中加載的類的內存使用情況。
您所引用的類「過早」加載時遇到的問題是什麼?我很好奇會遇到什麼樣的問題。 – 2008-11-18 14:31:31
雖然這是一個合理的類加載心理模型,但這並不嚴格。 一些虛擬機將動態卸載未使用的類,以減少常駐內存大小;然而,這樣的優化只會在運行很長的進程中發揮作用,並且只能在實現它的虛擬機上運行。 – 2008-11-18 13:24:36