Java入门之了解JVM(29)
没错,当一个对象被定义为不可达的时候,这个对象唯一的救命稻草就是finalize()方法,例如可用通过重写Object的finalize()方法,在其内将其自身(this)赋值给其他存活的变量,既可逃出生天;
因为,当对象被GC定义为不可达过后,这时GC会进行第1次标记,随后根据这个对象的 finalize()是否被重写 或 finalize()是否已经被调用过 这两点进行判定;如果finalize()没有被重写,又或者finalize()虽然已经重写但在之前已经被执行过一次了,那么这时GC就不会再次执行finalize();换句话来说就是,对象自我拯救的机会只有一次
但若被第1次标记为不可达的对象实重写了finalize(),且之前没有被执行过,这是GC会将其放置到一个叫“F-Queue”的队列中,随后会启动一条Finalizer线程来去一一调用队列中对象的finalize();
这里需要打醒十二分注意,虚拟机是并不会保证每个对象的finalize()都顺利执行完的,原因是虚拟机需要保证Finalizer线程执行过程中不会进入死循环或某个finalize()需要花费长时间来执行的情况,所以就算重写finalize()方法也不要依赖其能够完成关闭资源的操作,因为可能不被执行或者是执行不完成的情况
推荐阅读
- 唐僧|tap评分高达9.1,《黑色沙漠》手游终于要来了,你了解了吗?
- viper|最佳外援是VIPER,新任FMVP坐不住了?本土选手机制了解一下
- lpl|LPL为何处理不了猫咪,自身了解太浅,根本不重视S11!
- 传奇|我们玩传奇3不仅仅是游戏,更是情怀和回忆,这款手游你了解吗?
- t1|vivo T1究竟值不值得购买?看了这些后你可能有更深了解
- 使命召唤18|王者荣耀 想要轻松上分英雄克制关系了解一下 公孙离克制上官婉儿
- 暗黑破坏神2|《暗黑破坏神2》七种职业!那个才是最适合新手的入门职业!
- s6|金铲铲之战:测试服内容抢先看,5分钟带你了解S6赛季的变化
- 电影|“王者宇宙”全面开启,三分钟了解官方后续动作,你想要的全都有
- 米哈游|米游社三周年,米哈游游戏的必备软件,你了解多少?