垃圾回收
概念
创建对象占据内存,如果程序执行流程已经无法再使用某个对象,该对象就只是徒耗内存的垃圾。
对于不再有用的对象,JVM有垃圾收集机制(Garbage Collection, GC),收集到的垃圾对象所占据的内存空间,会被垃圾收集器释放。也就是说执行流程中,无法通过变量参考的对象,就会被GC认定的垃圾对象回收。
举例:
假设一个类:
public class Some {
Some next;
}
若是从程序进入点开始,有段程序代码如下撰写:
Some some1 = new Some();
Some some2 = new Some();
Some some1 = some2;
执行到第二行时,主线程可以通过参考名称所参考到对象。
执行到第三行时,将some2参考的对象给some1如下图:
原先some1参考的对象不再被任何名称参考,这个对象就是内存中的垃圾了,GC会自动找出这些垃圾并予以回收。
变化
Some some = new Some();
some.next = new Some();
some = null;
在执行第二行时候如下:
由于开始通过some可以参考至中间的对象,而some.next可以参考至最右边的对象,目前没有必要回收任何对象。执行完第三行后。如下图:
由于从主流程开始,无法通过some 参考至中间对象,也就无法再通过中间对象的next
参考至右边对象,所以两个对象都是垃圾。同样的道理,如下两个举例。
Some[] somes = {new Some(), new Some(), new Some};
somes = null;
Some some = new Some();
some.next = new Some();
some.next.next = new Some();
some.next.next.next = some;
some = null;
参考–《javaJDK7学习笔记》 6.2.6
GC 在进行回收对象前,会调用对象的finalize()方法,这是Object 上就定义的方法。
如果在对象被回收前,有些事情想做,可以重新定义finalize()方法,不过要注意的是,
何时启动GC,要视所采用的GC 算法而定,也就是finalize()被调用的时机是无法确定
的。在Effective Java 书中也建议,避免使用finalize()方法。