簡體   English   中英

Java:`靜態`方法

[英]Java: `static` Methods

當我調用靜態方法時:

Something.action();

由於未創建實例,靜態方法的Class將在內存中保存多長時間?

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

並且只是在調用時加載了單獨的靜態方法,或者將一個類的所有方法和靜態方法加載到內存中,即使可能只使用一個靜態方法?

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

該類保留在內存中,直到加載該類的類加載器保留在內存中。 因此,如果從系統類加載器加載類,則據我所知,類永遠不會被卸載。

如果要卸載類,則需要:

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

在某些配置中,在您撥打電話之前,甚至會加載班級。 我們使用了BES(Borland Enterprise Server),我們的Solaris生產服務器出現了問題,其中所有引用的類都在我們的應用程序啟動時遞歸加載。 這意味着,當我們的應用程序的主類被加載時,應用程序服務器加載了該類的導入部分中引用的所有類...遞歸。

作為旁注,除非您在非常大的內存約束環境中運行,或者如果要加載大量不必要的類,否則您不應過多關注內存中加載的類的內存使用情況。

在加載調用者類時,應該加載Something類。 正如krosenvold所說,它一直停留在VM的出口處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM