簡體   English   中英

這會導致java中的內存泄漏嗎?

[英]Will this cause memory leak in java?

這是一個面試問題,但我不太確定正確的答案。 假設我們有一些類,如:

public class A {
    public Object link;
    public A() {
        link = null;
    }
}

然后我們創建兩個實例:

A a1 = new A();
A a2 = new A();
a1.link = a2;
a2.link = a1;

然后我們發布參考文獻:

a1 = null;
a2 = null;

然后問題是:因為JVM會使用GC機制。 它將如何處理這種情況? 它會在運行時立即刪除這兩個實例,還是僅僅簽署了內存空間並讓它們獨自存在? 如果我有100萬個這樣的實例形成一個循環但沒有外部引用怎么辦? 清潔會使GC線程掛起嗎?

對象本身可以根據需要使用盡可能多的鏈接(您提到的一百萬個周期)來引用彼此。 如果沒有“路由”返回到某個線程,則無論它們連接多少個符合垃圾的節點,這些對象都有資格進行垃圾回收。

現在這並不意味着他們會被收集,只是他們有資格。 因此,如果您的垃圾收集器決定不處理它們,那么我認為這可能被視為內存泄漏。 你不能保證他們會消失。

循環引用可能導致內存泄漏,以實現某些垃圾收集策略(如引用計數)的天真實現。 (這並不是說引用計數是天真的,但是糟糕的實現可能會遇到問題。)

然而,這個問題對於實施GC的人來說是眾所周知的,並且可以避免。 此外,大多數現代JVM使用通常不會遇到此類問題的分代垃圾收集器。

根據代碼的當前邏輯,a1具有指向a2的成員變量,而a2具有指向a1的ha成員變量。 當你執行a1 = null時,a1有資格獲得GCed。 與a2的情況相同。 現在,當GC運行時,它會嘗試查看從root開始可以訪問的所有對象,即使這兩個相互引用,它們也會在從root開始的鏈中無法訪問(隔離的情況),因此它們會收集垃圾而不會出現任何問題。

暫無
暫無

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

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