每日一篇JVM 之 生存还是死亡
作者:互联网
1.生存还是死亡
通过可达性分析算法标记的不可达对象,也不是“非死不可”的。他是一个被标记的“缓刑”阶段,如果真正宣告一个对象死亡最少需要经历两次标记。当对象在进行可达性分析发现并没有与GC Roots相链接的引用链,那么他会被标记一次,随后进行一次筛选,筛选条件就是当前对象有没有重写finalize方法。如果该对象没有重写finalize方法或者虚拟机已经调用过这个方法则该对象会被视为“没有必要执行”。
当这个对象重写了finalize方法,则该对象会被放置在一个名为F-Queue的队列中,并是由虚拟机自动创建的、地调度优先级Finalizer线程去执行他们的finalize方法。这里所说的“执行”只是让他开始运行,并无法保证会等待它运行结束。原因就是可能finalize方法中会存在死循环,导致F-Queue队列一直处于等待阶段从而产生内存回收子系统崩溃。(java官方不建议使用因为try-finally或者其他方式可以做到更好)
2.分代收集理论
1.弱分代假说:绝大多数对象都是朝生夕灭的
2.强分代假说:熬过越多次的垃圾收集过程的对象就越难被消灭
3.跨代引用假说:跨代引用相对于同代引用来说全占极少数。
举个例子:存在互相引用关系的两个对象应该倾向于同时生存或者同时死亡,如果新生代中有个对象存在跨代引用,由于老年代对象难以消亡则该新生代对象在垃圾收集同时可以得以存活。
3.标记-复制算法
算法思想:将可用的内存划分为两块等同大小的内存区域。每次只使用其中一块,当被使用的那一块满了之后,将存活的对象复制到另一块未被使用的内存区域中去,再把已使用的内存空间清理一次(缺陷:如果都是存活的对象则多了一次复制操作)。
4.标记-清除算法
算法思想:如它的名字一样:标记,清除两步。首先标记出所有需要回收的对象,在标记完成后,同意回收掉所有被标记的对象,也可以反过来,标记不需要回收的对象,标记完成后回收掉所有没有被标记的对象。
5.标记-整理算法
思想:其标记过程与标记-清除算法一样,但后续步骤不是直接堆可回收对象进行清理,而且让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。
今日分享到此就结束了 。。。。。我只是一个爱吹比的选手
标签:一篇,finalize,标记,对象,生存,算法,内存,JVM,引用 来源: https://blog.csdn.net/qq_42552888/article/details/120759346