`
xiaobaiso
  • 浏览: 21862 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

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.csdn.net/jamex/archive/2009/12/30/5106603.aspx

 

 

垃圾回收器的讨论 :http://topic.csdn.net/u/20090723/22/d8c9ca4b-9926-4604-ab4c-dd5fd4b5aa74.html

 

垃圾回收器的总结 http://hi.baidu.com/andy_tj/blog/item/0fa9c4df53a43e104954037f.html

分享到:
评论

相关推荐

    java 垃圾回收机制详细介绍

    275 课程的标准教材中,对有关垃圾收集器的内容只做了非常简单的介绍,而另外的一些关于Java技术的书籍,比如《Java 2 核心技术》(Core Java 2)、《Java编程思想》(Thinking in Java)、《精通Java 2》等等,...

    Thinking in Java简体中文(全)

    引言 1. 前提 2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 ...1.7.1 集合与继承器 ...1.11 Java和因特网 ...附录E 关于垃圾收集的一些话 附录F 推荐读物

    Thinking in Java 中文第四版+习题答案

    写在前面的话 引言 1. 前提 2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体 8. 源代码 9. 编码样式 10. Java版本 ...1.7.1 集合与继承器 ...附录E 关于垃圾收集的一些话 附录F 推荐读物

    Thinking in java4(中文高清版)-java的'圣经'

    5.3 缺省构造器 5.4 this关键字 5.4.1 在构造器中调用构造器 5.4.2 static的含义 5.5 清理:终结处理和垃圾回收 5.5.1 finalize()的用途何在 5.5.2 你必须实施清理 5.5.3 终结条件 5.5.4 垃圾回收器如何工作 5.6 ...

    JAVA_Thinking in Java

    16.3 模拟垃圾回收站 16.4 改进设计 16.4.1 “制作更多的对象” 16.4.2 用于原型创建的一个范式 16.5 抽象的应用 16.6 多重派遣 16.6.1 实现双重派遣 16.7 访问器范式 16.8 RTTI有害吗 16.9 总结 16.10 练习 第17章...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm ------------------------------------------------- 本教程由yyc,spirit整理 ------------------------------------------------- “Thinking in Java...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    “Thinking in Java”详细目录   写在前面的话 引言 1. 前提 2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 ...

    F:\02soft\download\JAVA基础.rar

    1.非常实用的JAVA基础学习文档。是首个以题目来对JAVA基础进行总结的文档,非常适合JAVA初学者进行学习。整本书共10个章节,每个章节约10个考点(知识点)。...4.关于参数传递、垃圾回收器、继承、线程等讲的非常的好

    用于存放java源码和Thinking of Java的资源.rar

    当处理完成之后,核心线程并不会回收。 在核心线程达到指定的数量之前,每一个请求都会在线程池中创建一个新的核心线程。 当核心线程全都被占用的时候,新来的请求会放入工作队列中。工作队列本质上是一个阻塞队列。...

    二十三种设计模式【PDF版】

    使用类再生的两个方式:组合(new)和继承(extends),这个已经在 thinking in java中提到过. 设计模式之 Proxy(代理) 以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 Facade(门面?) 可扩展的使用...

Global site tag (gtag.js) - Google Analytics