2017-07-20 105 views
0

我最近被問到關於JAVA垃圾回收問題。它就像 - 如果我有三個變量(比如說),a,b,c,如下所示。 然後按照什麼順序收集垃圾。關於Java垃圾回收的採訪

class Test{ 

static String a; 

private String b; 

Test(String a, String b) 

{ 
    this.a=a; 
    this.b=b; 
} 

void disp(){ 

    System.out.println(a+" "+ b); 
} 

public static void main(String[] args){ 

    String c="Not you Again"; 
    Test t= new Test("Hello","World"); 

    t.disp(); 
    System.out.println("Value of c = "+c); 
} 

} 

我知道垃圾收集基礎知識,例如楊根,中東根&彼爾姆Gen和對象是如何在他們當中,收集的。但是垃圾收集變量是我不熟悉的東西。 請幫忙!

+0

**變量**不是垃圾回收。 **對象**被垃圾收集。由於所有三個變量都是原始類型「int」(它不是一個對象),所以這個問題沒有多大意義。 – Jesper

+0

@SarveshGupta一個'int'不是一個對象。它不能被垃圾收集。 – Moira

+0

這是怎麼回事:'this.a = a;'是對的? – Edwin

回答

0

通過Test.at.bc引用的值永遠不會被垃圾收集,因爲他們都還在作用域時main結束運行。也就是說,虛擬機退出時不會收集垃圾。

至於Test構造函數中的參數ab,它們可能會被垃圾收集,但這不太可能。這個特定的程序將會很快完成,垃圾收集器甚至無法啓動。

+0

第二段是無稽之談。 Test'構造函數的參數是局部變量,變量根本不會被垃圾收集。 * Objects *得到垃圾回收,並且由構造函數參數引用的對象仍然被其他變量引用,正如你的第一段已經說過的那樣,它仍然在範圍之內。你的答案在引用「* Test.a','tb'或'c' ......」引用的值時開始如此之好,然後就有了這個矛盾的第二段說到*參數*的集合,它們不是值,但引用。 – Holger

+0

@Holger我認爲在第二段中的含義是明確的 - 這些參數引用的對象可能(但可能不會)收集垃圾。 –

+0

好吧,在這種情況下,它是錯誤的,因爲這些對象就像所說的那樣是相同的對象,您在第一段中正確地指出這些對象是不可收集的。這就是說,像「參數......可能被垃圾回收」這樣的無意義的事情,因爲參數不能被收集,只有對象可以,而這些特定的對象可能不被收集。 – Holger

1

所有這三個字符串變量都會在VM虛擬機歡迎時進行垃圾收集,如果它真的讓人討厭,並且沒有人能控制它。任何聲稱他們知道什麼時候或甚至這些字符串是否會被垃圾收集的人都在撒謊。

+0

我說有點相同,但他說,靜態和私人限定符不會影響收集。 –

+0

由於靜態成員存儲在perm gen區域,它們不會是最後收集的。請幫助! –

+0

@Sarvesh Gupta:簡單來說,這是廢話。正如在[第一個評論](https://stackoverflow.com/questions/45207618/interview-on-garbage-collection-in-java#comment77381302_45207618)中所說的,變量不是垃圾收集,對象是。由於一個對象可以被任意數量的不同類型的變量引用,因此變量的類型完全不相關。當你將一個引用存儲在一個'static'變量中時,對象的內存位置不會突然改變。在Java 8中,甚至沒有燙髮區。 – Holger

0

垃圾收集器永遠不會運行在這個特定的例子。 垃圾收集器僅在沒有活動線程活動時運行,在此示例中沒有死線程,因此垃圾收集器將永遠不會運行。 垃圾收集器僅由JVM激活,我們無法控制它,儘管我們可以提出請求來運行它,JVM可以忽略此請求。