垃圾收集与对象生命拯救(读书笔记)
来源:互联网 发布:虚拟服务器软件下载 编辑:程序博客网 时间:2024/06/14 09:25
Java是根据根搜索算法来判断对象是否存活的。基本思路是:通过一系列名为“GC Roots”的对象作为起点,向下搜索锁走过的路径(称为引用链),当一个对象与GC Roots之间的连接是断开的,也就是对象与GC Roots之间是不可达的时候,该对象就是“不可用”的,注意只是不可用的而不是该对象已经死了。这时候该对象只是暂时处于死刑的“缓刑”阶段。既然是缓刑,就可以补救回来。
其实要真正地宣告一个对象是否死亡至少要经历两次标记过程
A. 处于“缓刑”状态的对象,会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖此方法或者finalize()的方法已经被虚拟机调用过,在这两种情况都是为“没有必要执行”finalize()方法
B. Finalize()方法是对象逃离死亡命运的最后一次机会,稍后GC会对对象进行第二次小规模的标记,如果对象要在该方法中拯救自己------只需要重新与GC Roots引用链上的任何一个对象建立关联即可。譬如把自己(this关键字)赋值给某个类的变量或对象的成员变量,那在第二次标记时它就会被移除出“即将回收”的集合,如果这个时候该对象还没有逃脱,那么该对象就真的里死亡不远了
代码说明如下/* * To change this template, choose Tools | Templates * and open the template in the editor. */package x;/** * * @author Arthur */public class FinalizeEscapeGc { private int count = 0; private static FinalizeEscapeGc fec = new FinalizeEscapeGc(); public FinalizeEscapeGc() { } public static void main(String[] args) throws InterruptedException { //对象第一次成功拯救自己 fec = null; System.gc(); ////显然输出为null System.out.println(fec); //因为finalize优先级很低,暂停一秒,以等待它 Thread.sleep(1000); //打印x.FinalizeEscapeGc@c17164,说明成功拯救 System.out.println(fec); //第二次次拯救失败 fec = null; //显然输出为null System.out.println(fec); System.gc(); //因为finalize优先级很低,暂停一秒,以等待它 Thread.sleep(1000); //输出为null System.out.println(fec); } @Override public void finalize() throws Throwable { super.finalize(); System.out.println("执行finalize方法"); fec = this; } public int getCount() { return count; }}
注意finalize方法是被GC收集器触发,如果注释掉System.gc()注释掉的话,是不会执行finalize方法的
- 垃圾收集与对象生命拯救(读书笔记)
- 垃圾收集器与内存分配策略——对象的生命、垃圾收集算法
- 垃圾收集与对象引用
- JAVA对象引用与垃圾收集
- 对象存活判断与垃圾收集算法
- 深入理解java虚拟机读书笔记(三)垃圾收集器与内存分配策略
- JVM读书笔记(二):垃圾收集器与内存分配策略
- 【读书笔记】JVM垃圾收集与内存分配策略
- JAVA 对象的创建与毁灭 构造函数与垃圾收集器(GC)
- 垃圾收集算法与垃圾收集器
- 第4章类与对象-垃圾收集(小车运行)
- 垃圾收集器与内存分配策略——(一)对象已死吗?
- Java对象创建与垃圾收集器实现
- JVM高级特性与实践(三):垃圾收集算法 与 垃圾收集器实现
- JVM高级特性与实践(三):垃圾收集算法 与 垃圾收集器实现
- JVM高级特性与实践(三):垃圾收集算法 与 垃圾收集器实现
- JVM高级特性与实践(三):垃圾收集算法 与 垃圾收集器实现
- 读书笔记-->Java虚拟机垃圾收集算法
- 根据年月计算当月天数的SQL函数
- 内核对象和进程基础
- asterisk realtime sip数据库实时添加sip peers
- AutoCompleteTextView输入汉字拼音首字母实现过滤提示(支持多音字)
- 利用java反射调用类的的私有方法
- 垃圾收集与对象生命拯救(读书笔记)
- json-c-0.9 在linux上编译使用
- 《iOS5 programming cookbook》学习笔记5 Concurrency
- elipse颜色设置
- 如果是GBK编码的返回该字符串的utf8编码格式 如果该字符串是UTF-8编码的直接返回
- AIDL 2 之 传递复杂数据的AIDL服务
- 运用数据分析论坛签名和外链在百度新算法中的效果
- 游标介绍(附例题)
- http://www.mozilla.org/en-US/