簡體   English   中英

我在Java中正確理解內存泄漏嗎

[英]Am I understanding Memory Leakage correctly in Java

對於此代碼片段:

Vector v = new Vector(10);
  for (int i = 1; i<100; i++)
     {Object o = new Object();
      v.add(o);
      o = null;
     }

因為對100個對象的所有引用都設置為null,所以不會泄漏,因此它們將由GC收集。

然而,

 Vector v = new Vector(10);
  for (int i = 1; i<100; i++)
     {Object o = new Object();
      v.add(o);
      }
   v= null;

因為我僅使對向量的引用為空,但仍保留了對100個對象的所有引用,所以會發生泄漏,因此在它們對系統無用時將不會收集GC。

請幫助檢查我是否正確理解了Java中的內存泄漏,在此先感謝您!

在第一個示例中, v仍然保留對100個對象的引用。 v超出范圍時,它將是垃圾回收的候選對象,當v被回收時,所有100個對象也可以被回收。
在第二個示例中-將v設置為null時,它將是垃圾收集的候選對象,當收集到它時,也可以收集所有100個對象。
因此,在兩種情況下都不應有任何泄漏。

通常,沒有真正的必要將局部變量設置為null,方法結束時,它將超出范圍並受GC約束。

對100對象的引用不會保留 'o'顯然在for循環的每次迭代時都超出范圍,僅在向量內部保留引用(在第一種情況下, o=null是毫無意義的)。 v設置為其他值(空)時,將不再引用該向量,因此可以對其進行垃圾回收。

這就是“引用計數”的含義; 這是剩余的有效引用數。 您無法像使用C中的指針那樣松開它們 。如果引用的范圍已消失(例如,因為它在函數中是局部的),則引用已消失。 您不必將其設置為null。

暫無
暫無

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

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