一、一次标记

首先finalize方法是在垃圾回收时,用于确认该对象是否确认被回收的一个标记过程

确认一个对象真正被回收需要经历两次标记过程:

  • 可达性分析没有引用,这是第一次标记
    是否有必要执行finalize方法,如果对象没有重写finalize方法或者finalize方法已经被调用过了,那么finalize方法就是没有必要执行的,没有必要执行finalize方法的对象就会被直接回收。如果对象被判定为有必要执行finalize()方法,那么这个对象将会放置在一个叫做F-Queue的队列之中,并在稍后由一个由虚拟机创建、低优先级的finalizer线程去执行它。这里所谓的“执行”是指虚拟机会触发这个方法,但并不承诺会等待它运行结束,这样做的原因是,如果一个对象的finalize()执行缓慢,极端情况下死循环,那么就会导致F-Queue队列中其他对象永久处于等待,甚至导致整个内存回收系统崩溃。

  • finalize()方法是对象逃脱死亡命运的最后一次机会,稍后GC将对F-Queue中的对象进行第二次小规模的标记,如果对象要在finalize()成功拯救自己——只需要重新与引用链上的任何一个对象建立关联即可,譬如把this关键字赋值给某个类的变量或者对象的成员变量,那么第二次标记时它将会被移出“即将回收”的集合;如果对象这时还没有逃脱,那么它就真正被回收了

/*** Finalizer方法逃避GC* 但是只能逃避一次* create by chenxichao*/
public class FinalizerEscapeGc {public static FinalizerEscapeGc SAVE_HOOK = null;public void isAlive(){System.out.println("yes i am still alive  :)");}@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println("finalize method execute");FinalizerEscapeGc.SAVE_HOOK = this;}public static void main(String[] args) throws Exception{SAVE_HOOK = new FinalizerEscapeGc();//对象第一次成功拯救自己SAVE_HOOK = null;System.gc();//因为finalize方法的优先级很低,所以睡一下Thread.sleep(500);if(SAVE_HOOK != null){SAVE_HOOK.isAlive();}else{System.out.println("no i am dead");}//第二次自救失败SAVE_HOOK = null;System.gc();//因为finalize方法的优先级很低,所以睡一下Thread.sleep(500);if(SAVE_HOOK != null){SAVE_HOOK.isAlive();}else{System.out.println("no i am dead");}}
}

二、 总结

  • finalize方法不是一定会执行,只有在该方法被重写的时候才会执行 f
  • inalize方法只会被执行一次
  • 对象可以在finalize方法中获得自救,避免自己被垃圾回收,同样自救也只能一次
  • 不推荐Java程序员调用该方法,因为finalize方法代价很大

Object的finalize方法相关推荐

  1. Object的finalize()方法的作用是否与C++的析构函数作用相同

    Object的finalize()方法的作用是否与C++的析构函数作用相同 public class Finalization {private static Finalization finaliz ...

  2. finalize java,Java中Object对象finalize方法详细解析

    简书:capo 转载请注明原创出处,谢谢! 前言: 今天我们来看看Object中一个经常被人遗忘的方法,finalize方法.老规矩,我们先看看Javadoc是怎样描述这个方法的 /** * Call ...

  3. C#中Finalize方法的问题

    C#中Finalize方法的问题 ninputer在关于"值类型的Finalize不会被调用"中(http://blog.joycode.com/lijianzhong/archi ...

  4. java object finalize_Java Object finalize() 方法

    Object finalize() 方法用于实例被垃圾回收器回收的时触发的操作. 当 GC (垃圾回收器) 确定不存在对该对象的有更多引用时,对象的垃圾回收器就会调用这个方法. 语法 protecte ...

  5. Java基础Object类的finalize方法

    1.在Object类中的源代码: protected void finalize() throws Throwable { } GC:负责调用finalize()方法. 2.finalize()方法只 ...

  6. Object类九大方法之finalize方法

    Object类九大方法之finalize方法 finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法. finalize的作用 ...

  7. Java Object类中的finalize()方法

    finalize()方法只会被执行一次,用于在GC垃圾回收前来申辩对象到底要不要被回收,但再次GC时是不会调用此方法的,只会执行一次finalize

  8. 下面属于java的object_在JAVA中,下列哪些是Object类的方法()

    1.clone方法 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常. 主要是JAVA里除了8种基本类型传 ...

  9. Java将弃用finalize()方法?

    最近,OpenJDK邮件组core-libs-dev里出现了一封邮件,建议弃用Object类的finalize()方法. \\ 弃用Object类的方法将会是一件非常不寻常的事情.Java从 1.0开 ...

最新文章

  1. linux内核空间open,Linux内核源码分析 - open
  2. 关于全国大学生智能汽车竞赛 参赛队员信息的情况说明
  3. href 里面 链接前面加/与不加的区别?(绝对路径与相对路径)
  4. LeetCode N-ary Tree Level Order Traversal(bfs)
  5. Java-Web Response响应和Request请求
  6. VTK:可视化之CurvedReformation
  7. WORD文档中的表格:自定义方式的批处理,增删行列和内容
  8. CentOS6.4卸载自带的OpenJDK并安装jdk1.6.21
  9. 前端学习(2312):react之路由基础
  10. selenium2.0(WebDriver) API - 转载自:http://www.cnblogs.com/puresoul/p/3477918.html
  11. 科比生涯数据分析——利用随机森林进行分类
  12. printf左右对齐
  13. Python爬取文件的11种方式
  14. し: make jianjie的文本网页
  15. 3G与2G网络融合中组网策略(转)
  16. vue模仿网易云客户端
  17. 关于ios程序的后台运行
  18. 香蕉派 BPI-M5折腾记录(1)—— 开发板系统烧写
  19. CMA实验室盲样考核,如何控制质量?
  20. 数字图像处理-图像基础-复习总结

热门文章

  1. docker学习(一)ubuntu上安装docker
  2. 前端页面布局常见问题/已踩过的坑大杂烩
  3. 最长公共前缀(java实现)
  4. 说下网鼎杯第四场的双色块
  5. 【Luogu】P3950部落冲突(树链剖分)
  6. cmd命令大全 DOS窗口命令
  7. java数据结构之枚举
  8. Extjs4.2——Panel
  9. 【插件开发】—— 1 Eclipse插件开发导盲
  10. mysql:Failed to read auto-increment value from storage engine