重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
但凡问到 JVM(Java 虚拟机)通常有 99% 的概率一定会问: 在 JVM 中如何判断一个对象的生死状态?
站在用户的角度思考问题,与客户深入沟通,找到桥东网站设计与桥东网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站制作、成都网站设计、企业官网、英文网站、手机端网站、网站推广、域名注册、虚拟主机、企业邮箱。业务覆盖桥东地区。本文就来聊聊这个问题,判断对象的生死状态的算法有以下几个:
引用计算器判断对象是否存活的算法是这样的:给每一个对象设置一个引用计数器,每当有一个地方引用这个对象的时候,计数器就加1,与之相反,每当引用失效的时候就减1。
优点 :实现简单、性能高。
缺点 :增减处理频繁消耗cpu计算、计数器占用很多位浪费空间、最重要的缺点是无法解决循环引用的问题。
因为引用计数器算法很难解决循环引用的问题,所以主流的Java虚拟机都没有使用引用计数器算法来管理内存。
运行的结果:
开始:117 M
运行中:96 M
结束:119 M
从结果可以看出,虚拟机并没有因为相互引用就不回收它们,也侧面说明了虚拟机并不是使用引用计数器实现的。
在主流的语言的主流实现中,比如Java、C#、甚至是古老的Lisp都是使用的可达性分析算法来判断对象是否存活的。
这个算法的核心思路就是通过一些列的“GC Roots”对象作为起始点,从这些对象开始往下搜索,搜索所经过的路径称之为“ 引用链 ”。
当一个对象到GC Roots没有任何引用链相连的时候,证明此对象是可以被回收的。如下图所示: