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