java垃圾回收机制

来源:互联网 发布:淘宝巧克力知乎 编辑:程序博客网 时间:2024/06/03 20:27

不同的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一份返回值给调用的引用。

然后那个对象作为局部变量就会被符合回收条件。


总结:回收垃圾的线程是一个低优先级的系统级线程,只有在只有在内存空闲的时候他才会去执行垃圾回收机制,所以并不是所有垃圾都能立马回收,有些垃圾即便程序运行完以后可能还会存在的。

0 0