[英]When does GC starts collecting garbage?
我對垃圾收集器很天真。 如果在當前方法執行期間堆內存不足,垃圾收集器是否會等到方法退出? 或者,它可以啟動里程碑1(換句話說,在當前方法執行的中間)並釋放關鍵字占用的空間(換句話說,當前方法的局部變量占用的空間)。
public void myMethod() {
//Milestone 1
List<Keyword> keywords = callSomeFunction();
keywords = null;
.
.
.
.
//Milestone 2
.
.
.
// Milestone 3 - Exit here
}
簡短的答案:垃圾收集器將永遠不會收集當前正在使用的空間。 因此,在您的示例中,只要keywords
在范圍內,它將不會收集其引用的內容。 但是,當您將其分配為null時, 如果沒有其他人引用它們 , 則它曾經引用的對象可能有資格進行收集。 這並不意味着這些對象將被收集,僅可能發生。
長答案是:首先,您必須了解Java虛擬機有多種實現。 Java 8虛擬機規范中沒有要求JVM甚至進行垃圾回收。
也就是說,垃圾回收是JVM中的常見功能。 Java語言規范8在第1章中進行了規定:
Java編程語言...包括自動存儲管理,通常使用垃圾回收器,以避免顯式釋放的安全性問題(如C的免費版或C ++的刪除版)。
JavaDoc for Java 8記錄了System.gc()
方法,如下所示:
運行垃圾收集器。
調用gc方法表明,Java虛擬機將花費更多精力來回收未使用的對象,以使它們當前占用的內存可用於快速重用。 當控件從方法調用返回時,Java虛擬機將盡最大努力從所有丟棄的對象中回收空間。
然后繼續說System.gc()
等同於Runtime.getRuntime().gc()
。 該方法的JavaDoc說:
運行垃圾收集器。 調用此方法表明,Java虛擬機將花費更多精力來回收未使用的對象,以使它們當前占用的內存可用於快速重用。 當控制從方法調用返回時,虛擬機將盡最大努力回收所有丟棄的對象。
gc代表“垃圾收集器”。 即使未顯式調用gc方法,虛擬機也會根據需要在單獨的線程中自動執行此回收過程。
因此,這里有一些要點:
Java垃圾收集器在后台運行,並且基本上可以在任何時間啟動。 當程序請求新的內存時,它更有可能運行,但是沒有確定的方式知道GC何時運行。
JVM將保存點添加到代碼中,以便可以在執行GC之前將所有線程帶入安全點。 這些保存點可以在任何字節代碼指令之間發生,但是JVM經常對其進行優化以減少開銷。
內存不足時(例如CMS),可以觸發GC,但是次要收集和並行收集僅在內存用完或直接觸發時才運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.