簡體   English   中英

從樹中刪除節點時出現java內存問題

[英]java memory issues when removing nodes from a tree

所以我了解到,如果你在中間移除一個節點,在單個鏈表中,列表的其余部分也將被垃圾收集,因為當它后面的每個節點被解除引用時會產生連鎖反應。

我的問題是一個樹,每個節點都有對它的子節點的引用以及對父節點的引用。 如果我刪除中間的節點(非葉節點)會導致內存泄漏,因為它會引用它的子節點並且它們會引用它? 所以如果我想刪除一個子樹,我必須從下到上刪除它中的所有節點?

您應該閱讀有關可達性的概念。 它在javadocs中定義, 包java.lang.ref的描述中

一旦某個對象無法被任何線程強烈訪問,它就有資格進行垃圾回收。

線程T可以強烈訪問的對象是:

  • 在T的調用堆棧中由局部變量引用的對象,
  • 任何類的靜態字段引用的對象,和
  • 強可達對象引用的對象(強)

如果從您描述的樹中刪除節點(只需將父節點上的引用移到子節點上),並且在您刪除的節點下沒有剩余的對樹部分的引用,那么這些對象就不能很容易訪問。 即使它們形成某種循環,JVM也足夠聰明,可以確定這些對象不是很容易訪問的(也就是說,它們相互引用,但任何代碼都無法訪問它們)。 因此,他們有資格進行垃圾收集。

您可以刪除起始節點並刪除其父節點中對該節點的引用。

要刪除子樹,您只需在其父級中刪除對它的引用。 只要不對其或其子女進行其他引用,它就會被垃圾收集。

暫無
暫無

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

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