什么时候有资格进行垃圾回收的对象?

Java垃圾收集器会跟踪活动对象,并标记不再需要的对象以进行垃圾收集。它使开发人员无需考虑内存分配/分配问题。

当用Java程序创建的对象不再可访问或使用时,可以进行垃圾回收。

以下是Java对象可能无法访问/未使用的一些情况。

  • 方法内部的对象-在Java中,方法存储在堆栈存储器中。调用方法时,JVM会将其提取到堆栈中并执行它。执行后,它会从堆栈中弹出,然后所有的变量都将被丢弃。

因此,在执行方法后在方法中使用创建对象时,该对象将变得不可访问。

示例

public class Sample {
   String name;
   Sample(String name){
      this.name = name;
   }
   public static void sampleMethod(){
      Sample obj1 = new Sample("myObject2");
      Sample obj = new Sample("myObject1");
   }
   protected void finalize() throws Throwable {
      System.out.println(this.name + " successfully garbage collected");
   }
   public static void main(String args[]){
      sampleMethod();
      System.gc();
   }
}

输出结果

myObject1 successfully garbage collected
myObject2 successfully garbage collected
  • 重新分配-将值(另一个对象)重新分配给现有引用变量时,原始对象最终将无法访问。

示例

public class Sample {
   String name;
   Sample(String name){
      this.name = name;
   }
   protected void finalize() throws Throwable {
      System.out.println(this.name + " successfully garbage collected");
   }
   public static void main(String args[]){
      Sample obj = new Sample("myObject1");
      obj = new Sample("myObject2");
      System.gc();
   }
}

输出结果

myObject1 successfully garbage collected
  • 分配空值-将空值分配给对象的引用时,该值不再可访问。

示例

public class Sample {
   String name;
   Sample(String name){
      this.name = name;
   }
   protected void finalize() throws Throwable {
      System.out.println(this.name + " successfully garbage collected");
   }
   public static void main(String args[]){
      Sample obj = new Sample("myObject1");
      obj = null;
      System.gc();
   }
}

输出结果

myObject1 successfully garbage collected
  • 匿名对象-实际上,匿名对象的引用不会存储在任何地方,因此,在第一次执行后,您无法再次调用它,因此它是不可访问的。

示例

public class Sample {
   String name;
   Sample(String name){
      this.name = name;
   }
   public void sampleMethod(){
      System.out.println("This is a sample method");
   }
   protected void finalize() throws Throwable {
      System.out.println(this.name + " successfully garbage collected");
   }
   public static void main(String args[]){
      new Sample("object1").sampleMethod();
      System.gc();
   }
}

输出结果

This is a sample method
object1 successfully garbage collected