java垃圾回收

来源:互联网 发布:淘宝店铺企业认证 编辑:程序博客网 时间:2024/05/18 03:25

垃圾回收

概念

创建对象占据内存,如果程序执行流程已经无法再使用某个对象,该对象就只是徒耗内存的垃圾。

对于不再有用的对象,JVM有垃圾收集机制(Garbage Collection, GC),收集到的垃圾对象所占据的内存空间,会被垃圾收集器释放。也就是说执行流程中,无法通过变量参考的对象,就会被GC认定的垃圾对象回收。

举例:

假设一个类:

public class Some {Some next;}

若是从程序进入点开始,有段程序代码如下撰写:

Some some1 = new Some();Some some2 = new Some();Some some1 = some2;

执行到第二行时,主线程可以通过参考名称所参考到对象。

image

执行到第三行时,将some2参考的对象给some1如下图:

image

原先some1参考的对象不再被任何名称参考,这个对象就是内存中的垃圾了,GC会自动找出这些垃圾并予以回收。

变化

Some some = new Some();some.next = new Some();some = null;

在执行第二行时候如下:
image

由于开始通过some可以参考至中间的对象,而some.next可以参考至最右边的对象,目前没有必要回收任何对象。执行完第三行后。如下图:

image

由于从主流程开始,无法通过some 参考至中间对象,也就无法再通过中间对象的next
参考至右边对象,所以两个对象都是垃圾。同样的道理,如下两个举例。

Some[] somes = {new Some(), new Some(), new Some};somes = null;

image

Some some = new Some();some.next = new Some();some.next.next = new Some();some.next.next.next = some;some = null;

image


参考–《javaJDK7学习笔记》 6.2.6

GC 在进行回收对象前,会调用对象的finalize()方法,这是Object 上就定义的方法。
如果在对象被回收前,有些事情想做,可以重新定义finalize()方法,不过要注意的是,
何时启动GC,要视所采用的GC 算法而定,也就是finalize()被调用的时机是无法确定
的。在Effective Java 书中也建议,避免使用finalize()方法。


finalize()方法待更新