面试题:如果某个对象想在 GC 中生存 1 次怎么办
来源:互联网 发布:阿里巴巴国际站优化 编辑:程序博客网 时间:2024/05/22 11:35
想在对象生命周期中至少被GC一次后存活,最简单的方法是重写Object的finalize()。
Finalize调用流程:GC时,当对象变成(GC Roots)不可达时,若该对象覆盖(重写)了finalize方法并且未执行过finalze方法,则将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法;否则直接将其回收。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。
system.gc()并不是你调用就马上执行的, 而是根据虚拟机的各种算法来来计算出执行垃圾回收的时间,另外,程序自动结束时不会执行垃圾回收的。其次:对象被回收时,要经过两次标记,第一次标记,如果finalize未被重写,或者finalize被调用过,那么垃圾回收并不会去执行finalize,否则会执行finalize方法;第二次标记,如果对象不能在finalize中成功拯救自己,那真的就要被回收了
实例如下:
public class FinalizeEscapseGC {
public static FinalizeEscapseGC gcObject = null;
public static FinalizeEscapseGC fe = null;
public void isAlive() {
System.out.println("I am still Alive");
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("finalize method excute");
FinalizeEscapseGC.gcObject = this;
}
public static void main(String[] args) throws InterruptedException {
gcObject = new FinalizeEscapseGC();
gcObject = null;
System.gc();//因为finalize方法被重写了,并且还没有被调用,所以此时会调用finalize方法
Thread.sleep(500);
if (gcObject != null) {
gcObject.isAlive();
} else {
System.out.println("gcObject is dead");
}
gcObject = null;
System.gc();//此时因为finalize方法已经被调用了,所以不会再调用;该对象会被直接回收
Thread.sleep(500);
if (gcObject != null) {
gcObject.isAlive();
} else {
System.out.println("gcObject is dead");
}
}
}
结果如下:
finalize method excute//第一次gc时调用finalize方法
I am still Alive//调用finalize后,对象被救活
gcObject is dead//第二次调用gc不再执行finalize方法,直接回收
参考:http://blog.csdn.net/pi9nc/article/details/12374049?ticket=ST-4318-fEtHskuxbsTfIdXD7vKc-passport.csdn.net
- 面试题:如果某个对象想在 GC 中生存 1 次怎么办
- 如果想在 GC 中生存 1 次怎么办
- [经典面试题][百度]数组A中任意两个相邻元素大小相差1,在其中查找某个数。
- [经典面试题]如果与同事发生分歧,你应该怎么办?
- salesforce中,如果获取某个对象的权限
- 在codebehind中调用WebService中的函数,如果找不到怎么办?
- 如果在表格中想要显示一个页面,该怎么办?
- GC(垃圾处理机制)面试题
- 有关GC的面试题
- GC(垃圾处理机制)面试题
- 【面试题】-数组A中任意两个相邻元素大小相差1,找出某个数在数组A中的位置。(所有位置 )
- 数组中只出现1次的两个数字(百度面试题) .
- 数组中只出现1次的两个数字(百度面试题)
- 数组中只出现1次的两个数字(百度面试题) .
- 数组中只出现1次的两个数字(百度面试题)
- 【算法】数组中只出现1次的两个数字(百度面试题)
- 数组中只出现1次的两个数字(百度面试题)
- 数组中只出现1次的两个数字(百度面试题)
- jQuery 找dt.next(div).html()的解决方法
- VS2015 编译 libcurl
- 狒料:133…腾讯云定制版Skylake CPU
- 模型无法使用,或打开后显示为一个红色的'x'?
- numpy.where()
- 面试题:如果某个对象想在 GC 中生存 1 次怎么办
- springMVC返回json数据乱码问题及@RequestMapping 详解
- Mapreduce多表关联与词频统计程序运行结果输出到Hbase的两个途径
- 编码器驱动程序
- uploadify插件-支持IE8以下
- Android 性能优化典范笔记
- 欢迎使用CSDN-markdown编辑器
- 狒解AI:百度云ABC一体机是个什么gui?
- python3 报错