课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们上文中给大家简单介绍了java编程开发中对象的概念与引用等内容,而今天我们就再来了解一下,java编程垃圾标记方法与过程。
1、垃圾标记
上文中我们已经讲解了如何判断一个对象是否是垃圾,及采用的是引用计数法和可达性分析法。小伙伴肯定发现这两种算法是即判断对象是否为垃圾,同时标记了对象。
是的,更准确的说:如果一个对象不存在引用,那么这个对象就是垃圾。而引用计数算法中的计数器和可达性分析算法中的引用链都是标记对象的方式。
我们也在上面说过,由于引用计数算法存在循环引用问题,所以现有的主流标记算法是可达性分析算法。下面,我们将详细分析下可达性分析算法标记垃圾对象的过程。
在Java中,可以作为GCRoots的对象通常包含以下几种:
虚拟机栈中引用的对象
方法区中静态属性引用的对象
方法区中常量引用的对象
本地方法中(Native)引用的对象
在可达性分析算法中,即使存在不可达的对象,该对象也不一定是非死不可的,一个对象要真正的死亡,要经历两次标记的过程。
2、标记过程分析
当使用可达性分析算法分析对象时,若发现一些对象与GCRoot链不可达,那么该对象就会被一次标记,然后进行筛选,筛选的条件是判断该对象有没有必要执行finalize()方法(此方法每个对象默认都有),但如果对象没有重写finalize()方法或者对象的finalize方法已经被虚拟机调用过一次了,则都将视为“没有必要执行”,垃圾回收器可以直接回收。
如果该对象被判定为有必要执行finalize()方法,那么虚拟机会把这个对象放置在一个的队列中,然后由一个专门的Finalizer线程去执行这个对象的finalize()方法。如果此时存在某些对象重新与引用链上的任何一个对象建立了关联,那么在二次标记时它将被移这个队列。
希望这辈子,最让你无悔的事情就是来达内学习!学习向来不是件易事,但无论过程多么艰难,希望你依然热爱生活,热爱学习!永远记得,达内将与你一同前行!现在扫码,立即领取万元课程礼包,助力0基础快速入行,为你梳理行业必备技能,全方位了解岗位发展前景!
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。