簡體   English   中英

GC何時開始收集垃圾?

[英]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方法,虛擬機也會根據需要在單獨的線程中自動執行此回收過程。

因此,這里有一些要點:

  1. 規范不需要垃圾收集
  2. 無論如何,這是JVM的常見部分
  3. 您無法對其進行任何實際控制,只能“建議” JVM進行一些垃圾收集
  4. 每當JVM希望垃圾回收發生時,垃圾回收通常都會在其自己的線程中發生,因此這完全是不可預測的

Java垃圾收集器在后台運行,並且基本上可以在任何時間啟動。 當程序請求新的內存時,它更有可能運行,但是沒有確定的方式知道GC何時運行。

JVM將保存點添加到代碼中,以便可以在執行GC之前將所有線程帶入安全點。 這些保存點可以在任何字節代碼指令之間發生,但是JVM經常對其進行優化以減少開銷。

內存不足時(例如CMS),可以觸發GC,但是次要收集和並行收集僅在內存用完或直接觸發時才運行。

暫無
暫無

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

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