Object的finalize方法
一、一次标记
首先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方法相关推荐
- Object的finalize()方法的作用是否与C++的析构函数作用相同
Object的finalize()方法的作用是否与C++的析构函数作用相同 public class Finalization {private static Finalization finaliz ...
- finalize java,Java中Object对象finalize方法详细解析
简书:capo 转载请注明原创出处,谢谢! 前言: 今天我们来看看Object中一个经常被人遗忘的方法,finalize方法.老规矩,我们先看看Javadoc是怎样描述这个方法的 /** * Call ...
- C#中Finalize方法的问题
C#中Finalize方法的问题 ninputer在关于"值类型的Finalize不会被调用"中(http://blog.joycode.com/lijianzhong/archi ...
- java object finalize_Java Object finalize() 方法
Object finalize() 方法用于实例被垃圾回收器回收的时触发的操作. 当 GC (垃圾回收器) 确定不存在对该对象的有更多引用时,对象的垃圾回收器就会调用这个方法. 语法 protecte ...
- Java基础Object类的finalize方法
1.在Object类中的源代码: protected void finalize() throws Throwable { } GC:负责调用finalize()方法. 2.finalize()方法只 ...
- Object类九大方法之finalize方法
Object类九大方法之finalize方法 finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法. finalize的作用 ...
- Java Object类中的finalize()方法
finalize()方法只会被执行一次,用于在GC垃圾回收前来申辩对象到底要不要被回收,但再次GC时是不会调用此方法的,只会执行一次finalize
- 下面属于java的object_在JAVA中,下列哪些是Object类的方法()
1.clone方法 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常. 主要是JAVA里除了8种基本类型传 ...
- Java将弃用finalize()方法?
最近,OpenJDK邮件组core-libs-dev里出现了一封邮件,建议弃用Object类的finalize()方法. \\ 弃用Object类的方法将会是一件非常不寻常的事情.Java从 1.0开 ...
最新文章
- linux内核空间open,Linux内核源码分析 - open
- 关于全国大学生智能汽车竞赛 参赛队员信息的情况说明
- href 里面 链接前面加/与不加的区别?(绝对路径与相对路径)
- LeetCode N-ary Tree Level Order Traversal(bfs)
- Java-Web Response响应和Request请求
- VTK:可视化之CurvedReformation
- WORD文档中的表格:自定义方式的批处理,增删行列和内容
- CentOS6.4卸载自带的OpenJDK并安装jdk1.6.21
- 前端学习(2312):react之路由基础
- selenium2.0(WebDriver) API - 转载自:http://www.cnblogs.com/puresoul/p/3477918.html
- 科比生涯数据分析——利用随机森林进行分类
- printf左右对齐
- Python爬取文件的11种方式
- し: make jianjie的文本网页
- 3G与2G网络融合中组网策略(转)
- vue模仿网易云客户端
- 关于ios程序的后台运行
- 香蕉派 BPI-M5折腾记录(1)—— 开发板系统烧写
- CMA实验室盲样考核,如何控制质量?
- 数字图像处理-图像基础-复习总结