靜態欄位的垃圾收集
當靜態欄位不再被引用時,會出現一個關於靜態欄位命運的常見問題。考慮以下用於程式設定的實用程式類別:
class MyUtils { private static MyObject myObject = new MyObject(); /*package*/static boolean doStuff(Params... params) { // do stuff with myObject and params... } }
myObject 欄位在不再使用後是否會被垃圾回收,還是會在程式執行過程中持續存在?
回答這個問題,我們必須了解靜態變數的本質。靜態變數在類別載入時分配內存,並在類別的生命週期內存在。只要類別被加載,垃圾收集器就無法回收它們。
根據 Java 語言規格 (JLS) 第 12.7 節:
A class or interface may be unloaded if and only if its defining class loader may be reclaimed by the garbage collector [...] Classes and interfaces loaded by the bootstrap loader may not be unloaded.
因此,載入的類別中的靜態變數不能被回收。垃圾收集,直到相應的類別載入器本身被收集。由於引導類別不可卸載,這些類別中的靜態變數將無限期地保留。
對於 MyUtils,由於它不是由引導類別載入器載入的,因此一旦程式執行,它的靜態 myObject 欄位就會被垃圾收集不再需要 MyUtils,無論是否使用它。
以上是靜態欄位不再被引用時會被垃圾收集嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!