2016-07-15 86 views
2

我知道原始類型的數組在Java中被隱式初始化爲0。 所以,如果我有一個代碼:當Java的垃圾收集器回收內存?

public class Foo{ 
    public static void main(String args[]){ 
     int[] arr = new int[50]; 
     for(int i = 0; i < 30; i++){ 
      arr[i] = i; 
     } 
     for(int i = 0; i < 30; i++){  // This Line 
      System.out.println(arr[i]); 
     } 
    } 
} 

我想知道,如果將arr [30] arr中[49]就已經被在其中有註釋的行通過回收垃圾收集器的內存?

+0

由於答案的狀態:它仍然被引用,所以:不。但即使不是,作爲開發人員,您無法影響垃圾收集器的運行時間。基本上,它在您的環境檢測到需要運行GC時運行。 – Stultuske

+2

您的程序太小,並且速度過快。垃圾收集器可能永遠不會在此程序的執行時間內運行。 – Robert

回答

12

我想知道從arr [30]到arr [49]的內存是否已經被垃圾回收器回收到了具有註釋的行?

不,絕對不是。該數組是單個對象。它可以到達,或者無法到達......在這種情況下,它仍然可以到達。

在更復雜的例子,如果這是一個String[],我不會期望通過內容arr[30]arr[49]引用的字符串,纔有資格進行垃圾回收,無論是。一個非常聰明的GC 可能能夠知道數組的哪些部分未被使用,並且不包括GC根中的那些部分,但我認爲我從未見過這種情況。 (它必須知道,沒有其他代碼曾經參考過這個數組,因爲一件事情,這似乎是一種不尋常的情況,因此可能不值得優化。)

2

不,他們不會被回收 - 因爲仍然有對他們的積極參考。

只要垃圾收集器注意到某些對象不再被使用,它就會將它們標記爲刪除。 (被引用的對象是一個仍然有指向它的指針)。

將它們標記爲刪除之後 - 稍後的垃圾回收循環將刪除實際的對象。這會在這些地方出現更多的自由空間。

刪除對象後 - 剩餘的已用空間被壓縮(因此所有的空白空間基本上都在一起)。