对象能否已死?看看JVM是怎样判断的
来源:Android架构     阅读:469
源码超市
发布于 2019-06-11 06:10
查看主页

Java虚拟机中有着垃圾回收机制,自动帮我们回收对象,不需要自己手动实现垃圾回收。那么JVM中的垃圾收集器是如何判断对象能否需要回收的呢?这将是本篇文章的主要内容。

一、引用计数法

给对象增加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能被再使用的。

主流的JVM里面没有选用引用计数算法来管理内存,其中最主要的起因是它很难处理对象间的互循环引用的问题。

二、可达性分析算法

通过少量列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时(就是从GC Roots 到这个对象是不可达),则证实此对象是不可用的。所以它们会被判定为可回收对象(例如图B中的对象既是不可达的)。

在可达性分析算法中,要真正宣告一个对象死亡,至少要经历两次标记过程:

1.假如对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次挑选,挑选的条件是此对象能否有必要执行finalize()方法。当对象没有 覆盖finalize()方法,或者者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。

2.假如这个对象被判定为有必要执行finalize()方法,那么这个对象将会放置在一个叫做F-Queue队列之中,并在稍后由一个由虚拟机自动建立的、低优先级的Finalizer线程去执行它。finalize()方法是对象逃脱死亡命运的最后一次机会,稍候GC将对F-Queue中的对象进行第二次小规模的标记,假如对象要在finalie()中成功拯救自己——只需重新与引用链上的任何一个对象建立关联就可,譬如把自己(this关键字)赋值给某个类变量或者者对象的成员变量,那在第二次标记时它将会被移除出“即将回收”的集合;假如对象这时候还没有逃脱,那基本上它就真的被回收了。

三、判断对象能否存活与“引用”有关

在JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)四种,这四种引用强度依次逐步减弱。

强引用:就是指在程序代码之中普遍存在的,相似“Object obj = new Object()”这类的引用,只需强引用还存在,垃圾收集器永远不会回收掉被引用的对象。

软引用:用来形容少量还有用但并非必需的对象。在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。

弱引用:客户形容非必需对象的。被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存能否足够,都会回收掉只被弱引用关联的对象。

虚引用:一个对象能否有虚引用存在,完全不会对其生存时间构成影响,也无法通过虚引用来获得一个对象实例。为一个对象设置虚引用的唯一目的就是能在这个对象被收集器回收时刻得到一个系统通知。

自己是从事了七年开发的Android工程师,不少人私下问我,2019年Android进阶该怎样学,方法有没有?

没错,年初我花了一个多月的时间整理出来的学习资料,希望能帮助那些想进阶提升Android开发,却又不知道怎样进阶学习的朋友。【包括高级UI、性能优化、架构师课程、NDK、Kotlin、混合式开发(ReactNative+Weex)、Flutter等架构技术资料】,希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

资料获取方式:加入Android架构交流QQ群聊:513088520 ,进群即领取资料!!!

点击链接加入群聊【Android移动架构总群】:加入群聊

资料大全
免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境 服务器应用
相关推荐
这十个Python项目学会,轻轻松松把面试官按在地上摩擦
vue在线预览pdf
腾讯面试:增量更新为什么减少更新代价,增量更新原理
128GB存储够用?iPhone 17e藏着苹果最狠的刀法!
LVS在大规模网络环境中的应用
首页
搜索
订单
购物车
我的