一、finalize与GC                            

在GC第一次进行可达性分析时会将不可达而且该对象所属类重写finalize方法finalize方法重未被执行过的对象追加到F-Queue当中,然后JVM会自动开启一个低优先级的守护线程Finalizer执行F-Queue中元素的finalize方法。此时可通过finalize方法重新将不可达对象与引用链关联起来,那么在GC第二次进行可达性分析时,则可逃离被回收的名单。

class FinalizeEscapeGC{
public static FinalizeEscapeGC SAVE_HOOK = null;
public void isAlive(){
System.out.println("yes, i am still alive;");
} @override
protected void finalize() throws Throwable{
super.finalize();
System.out.println("finalize method executed!");
FinalizeEscapeGC.SAVE_HOOK = this;
} public static void main(String[] args) throws Throwable{
SAVE_HOOK = new FinalizeEscapeGC(); SAVE_HOOK = null;
System.gc();
Thread.sleep();
if (SAVE_HOOK == null) SAVE_HOOK.isAlive();
else System.out.println("no, i am dead :("); SAVE_HOOK = null;
System.gc();
Thread.sleep();
if (SAVE_HOOK == null) SAVE_HOOK.isAlive();
else System.out.println("no, i am dead :(");
}
}

第一次成功通过finalize方法成功逃脱回收名单,但第二次因为finalize方法之前已经被调用过,因此不会在执行finalize方法,所以注定被回收了。

注意:finalizer线程执行每个对象的finalize方法时是非阻塞的,因此并不保证GC进行第二次标记时finalize方法执行完成。

二、在finalize方法中释放资源?                   

说起finalize方法大家就会联想到析构函数,并希望像析构函数那样使用,然后什么资源释放收尾等工作都放在finalize方法中。其实这只是让C/C++程序员更容易转向Java阵营的妥协而已,大家最好还是忘记有这一个方法吧,通过try-catch-finally释放资源更有效。

尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/4269086.html  ^_^肥仔John

最新文章

  1. JavaScript dom 动态创建标记
  2. 使用 PowerShell 自动化 CloudServices 发布
  3. spring security使用数据库资源
  4. bootstrap响应式布局简单实例
  5. Enhanced RCP: How views can communicate – The e4 way | Tomsondev Blog
  6. 注解方式传LIST@RequestBody
  7. Java 一个字符串在另外一个字符串出现次数
  8. cookie 和 session 基本使用 以及 封装
  9. Python第二十一天 fileinput模块
  10. UML之结尾篇
  11. centos7下报错: import requests ImportError: No module named requests
  12. PyCharm使用秘籍
  13. 【Java每日一题】20170322
  14. app自动化测试之实战应用(百度app简单测试)
  15. Kaggle项目实战一:Titanic: Machine Learning from Disaster
  16. hessian 在spring中的使用 (bean 如 Dao无法注入的问题)
  17. 黄聪:超实用的PHPExcel[导入][导出]实现方法总结
  18. 数据压缩之经典——哈夫曼编码(Huffman)
  19. 【转】老左常用国内/国外VPS推荐
  20. C++ 各种继承

热门文章

  1. 关于提高webview里下载apk安装包成功率的研究
  2. MongoDB for C#基础入门
  3. 基于jquery的图片轮播 (IE8以上)
  4. [你必须知道的NOSQL系列]专题二:Redis快速入门
  5. google map javascript api v3 例子
  6. java 多线程(synchronized)
  7. Java多线程6:synchronized锁定类方法、volatile关键字及其他
  8. jQuery读取和设定KindEditor的值
  9. Java框架搭建-Maven、Mybatis、Spring MVC整合搭建
  10. IOS UIView 01-View开始深入 绘制像素到屏幕上