thinking in java 中关于java 垃圾回收器的学识
下面是网上找的 :
首先,finalize方法并不推荐普通编程的时候使用。
也就是说,别指着finalize方法释放资源,这是不安全的。当然,finalize方法肯定会在对象内存被释放之前调用。除了这个之外,还有以下几点需要注意的:
1)应该是只有一个类覆盖了Object类的finalize方法后,这个方法才会被调用。否则这个方法不会被调用(这是我的猜测,因为这样可以简化垃圾回收的过程,为什么看下面)
2)当一个对象满足被回收的条件后(不准确的说也就是没有任何引用指向它),当Java进行垃圾回收的时候,如果这个对象的类没有覆盖finalize方法,那么这个对象的内存将直接被释放。否则Java将调用finalize方法,并且不释放其占用的内存。
这时候使用有了变化,最简单的情况是:
3)下次垃圾回收的时候将已经调用过finalize方法的这个对象占用的内存释放,但是不会再次调用finalize方法。
比较复杂的情况是:
4)finalize方法可以让对象复活。就是说,在finalize方法中,如果又让某个可用的引用指向这个对象(比如加到一个队列中),那么这个对象就复活了,不会被下次垃圾回收而释放。
4)finalize方法只会调用一次。当这个复活对象再次满足垃圾回收的条件后,这时候Java不会再次调用finalize方法。就是说,一个复活后的对象,在垃圾回收之前其finalize方法不会再次被调用。这就是一个潜在的漏洞,也是为什么finalize方法不值得推荐的理由。
一个对象如果复活了,那么很可能会没有释放相应的资源,但是当这个对象再次没用的时候,其finalize方法将不会被再次调用。当然,用户可以确定说在finalize方法中不会造成对象复活,但是谁能保证在编写代码的时候时刻谨记这点呢?不要越雷池半步的诀窍就是不要靠近雷池。所以finalize方法不推荐使用。
finalize的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存.
finalize()方法并不是立刻就会执行的,执行的时间完全由系统来决定。所以很有可能的情况是已经创建了20000个对象,才开始其中的某一个对象的清除工作(这可能和时间或者系统内容的占用有关)
关于垃圾回收器的分类 http://blog.****.net/jamex/archive/2009/12/30/5106603.aspx
垃圾回收器的讨论 :http://topic.****.net/u/20090723/22/d8c9ca4b-9926-4604-ab4c-dd5fd4b5aa74.html
垃圾回收器的总结 http://hi.baidu.com/andy_tj/blog/item/0fa9c4df53a43e104954037f.html