**要宣布一个对象死亡至少要经历两次标记过程:如果通过可达性分析没有与GC?Roots相连接的引用链,会被第一次标记和进行一次筛选。筛选条件是此 对象是否有执行finalize()方法,当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过。虚拟机将这两种情况都视为“没有必要执行”。
如果一个对象有必要执行finalize()方法,会被放在F-Queue队列,并在稍后一个由虚拟机自己建立的、低优先级的Finalizer线程去执行它,虚拟机会触 发这个方法,但是不会等它执行完,否则如果一个对象在finalize()方法中执行缓慢,那么内存回收系统会崩溃。finalize()方法是对象最后一次逃脱死亡机 会。稍后GC将对F-Queue中的对象进行第二次小规模标记,如果对象在第二次标记前没能拯救自己就要被回收。拯救办法是只要与引用链上任何一个对象建 立关联即可。**
上面的内容来自书籍,如果按照上述,那么当对象的finalize()方法没有必要执行或没有覆盖,那不是只标记一次就可以吗?
问答
GC回收对象真的至少标记对象两次吗?
作者:admin 2021-05-09 我要评论
**要宣布一个对象死亡至少要经历两次标记过程:如果通过可达性分析没有与GC?Roots相连接的引用链,会被第一次标记和进行一次筛...
(在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)
版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除
精彩导读
热门资讯