垃圾一般在发生引用传递时产生。一块堆内存可以被不同的栈内存所引用,每一块栈内存都会表示一个堆内存的地址信息,并且一块栈内存只能保存一个堆内存的地址信息,所以当一块栈内存已经保存了一个堆内存的地址信息,这个时候如果想要改变这个栈内存的引用指向时,就必须抛弃原来保存的地址信息,再保存新的堆内存的地址信息,而这个时候就发生了引用传递。
例如
public class Test {
public static void main(String[] args) {
Person p1=new Person();
Person p2=new Person();
p1.name="张三";
p2.name="李四";
p2=p1; //引用传递
p2.name="王五";
System.out.println(p1.name+" "+p2.name);
}
}
运行结果为
王五 王五
这里实例化了两个对象,p1和p2,并且都进行了赋值,但是因为发生了引用传递“p2=p1”,所以p2这个栈内存将丢弃原来保存的p2这个对象的地址信息,再保存p1这个对象的地址信息,这个时候p2这个堆内存没有任何东西指向它,就会变成垃圾空间,将由GC(Garbage Collection)垃圾收集器进行回收释放,所以接下来执行" p2.name="王五" ",修改的就是p1这个对象的值。虽然java提供了自动垃圾回收机制,但如果在写代码的时候如果产生了过多的垃圾也会对性能产生影响。