不同的JVM可能会采用不同的垃圾回收机制来处理。
但总体的来说我们在编程的时候最好要养成良好的变成习惯。
1.全局变量尽量少用,因为它是全局引用的所以不会被回收。
2.尽量少在循环中new对象,因为这样会耗费大量的地址空间。
那么下面我们来谈谈具体的垃圾回收机制是怎样,他会回收哪些他认为的垃圾。
一:空引用:
User user = new User();
user = null;
user相当于这个学生的学号,把学号放空了,你就再也找不到那个对应的学生,所以这种情况需要把该对象变为垃圾,符合垃圾回收条件,但什么回收还是要看系统的操作。
二:对象失去引用:
User user1 = new User();
User user2= new User();
user1 = user2;
这种情况好比user1和user2两个学号本来对应于两个学生,但现在第二个对象一个人拿了两个学号去对应他,导致第一个学生没学号对应。最后也找不到这个没学号的学生了,所以这种情况下的对象也需要回收。什么时候回收也要看系统什么时候执行,即使知道他可以被回收,但也不能强制系统去回收他。
如果如下面这样:
把user2 = null;
这个对象也不符合回收的条件,因为他还有user1指向了他,通俗讲讲就是还能用另一个号码对应找到这学生,所以不能被回收。
三:被调用完的方法里的对象(离开了作用域):
User user1 = new User();
user1 = class.math();
而math()方法中new 了一个对象并返回这个对象;
这时方法里new的对象符合回收条件。因为他return的时候系统会copy一份返回值给调用的引用。
然后那个对象作为局部变量就会被符合回收条件。
总结:回收垃圾的线程是一个低优先级的系统级线程,只有在只有在内存空闲的时候他才会去执行垃圾回收机制,所以并不是所有垃圾都能立马回收,有些垃圾即便程序运行完以后可能还会存在的。