2008-11-18 59 views
5

當我打電話就像一個靜態方法:的Java:`static`方法

Something.action(); 

由於不創建一個實例多久靜態方法的類被保存在內存中?

如果我調用相同的方法,將爲每個調用重新加載Class,因爲沒有實例存在?

只有在調用時加載單個靜態方法,或者是加載到內存中的所有方法和類的靜態方法,即使只使用一種靜態方法?

回答

11

除非您配置了permgenspace的垃圾回收,否則該類會留在內存中,直到vm退出。完整的類用所有靜態方法加載。

+0

雖然這是一個合理的類加載心理模型,但這並不嚴格。 一些虛擬機將動態卸載未使用的類,以減少常駐內存大小;然而,這樣的優化只會在運行很長的進程中發揮作用,並且只能在實現它的虛擬機上運行。 – 2008-11-18 13:24:36

4

該類留在內存中,直到加載該類的類加載器保留在內存中。所以,如果這個類是從系統類加載器加載的,那麼就我所知,這個類永遠不會被卸載。

如果你想卸載一個類時,你需要:

  1. 加載類和所有類使用自定義類加載器
  2. 引用該類您正在使用類,發行完成後所有對類的引用 - 即確保沒有該類的對象實例
  3. 通過釋放加載這些類的自定義類加載器實例來卸載引用它的類和所有類。
1

東西類將在加載調用者類時加載。正如krosenvold所說,它一直呆在那裏直到虛擬機退出。

2

在某些配置中,類在您撥打電話前甚至會被加載。我們使用了BES(Borland Enterprise Server),並且我們的Solaris生產服務器出現問題,其中所有引用的類在我們的應用程序啓動時遞歸加載。這意味着,當我們的應用程序的主類被加載時,應用程序服務器遞歸地加載該類的導入部分中引用的所有類。作爲一個方面說明,除非你在一個非常內存的約束環境中運行,或者如果你正在加載很多很多不必要的類,那麼你不應該在意內存中加載的類的內存使用情況。

+0

您所引用的類「過早」加載時遇到的問題是什麼?我很好奇會遇到什麼樣的問題。 – 2008-11-18 14:31:31