千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

首页 视频教程 培训课程 师资团队 技术干货 常见问题 面试题 职场就业 零基础学Java 行业资讯
【热点话题】 Java技术干货 Java学习教程 Java学习笔记 Java面试题 Java培训问答 Java培训机构哪些好 Java职场就业
当前位置:Java培训  >  java学习笔记  >  怎么判断对象是否可以被回收

怎么判断对象是否可以被回收

来源:千锋教育
发布人:syq
时间: 2022-10-10 13:50:00 1665381000

  1. 引用计数算法

  1.1 判断对象的引用数量

  通过判断对象的引用数量来决定对象是否可以被回收;每个对象实例都有一个引用计数器,被引用+1,完成引用-1;任何引用计数为0的对象实例可以被当做垃圾回收;

怎么判断对象是否可以被回收

  1.2 优缺点

  优点:执行效率高,程序受影响较小;

  缺点:无法检测出循环引用的情况,导致内存泄漏;

  2. 可达性分析算法

  通过判断对象的引用链是否可达来决定对象是否可以被回收。 如果程序无法再引用该对象,那么这个对象肯定可以被回收,这个状态称为不可达。 那么不可达状态如何判断呢? 答案是GC roots,也就是根对象,如果一个对象无法到达根对象的路径,或者说从根对象无法引用到该对象,该对象就是不可达的。以下三种对象在JVM中被称为GC roots,来判断一个对象是否可以被回收。

  2.1 虚拟机栈的栈帧

  每个方法在执行的时候,JVM都会创建一个相应的栈帧(操作数栈、局部变量表、运行时常量池的引用),当方法执行完,该栈帧就从栈中弹出,这样一来,方法中临时创建的独享就不存在了,或者说没有任何GC roots指向这些临时对象,这些对象在下一次GC的时候便会被回收。

  2.2 方法区中的静态属性

  静态属性数据类属性,不属于任何实例,因此该属性自然会作为GC roots。这要这个class在,该引用指向的对象就一直存在,class也由被回收的时候。 那么class何时会被回收?

  - 堆中不存在该类的任何实例

  - 加载该类的classLoader已经被回收

  - 该类的java.lang.class对象没有在任何地方被引用,也就是说无法通过反射访问该类的信息

  2.3 本地方法栈引用的对象

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

最新文章NEW

相关推荐HOT

更多>>
开班信息
北京校区
  • 北京校区
  • 大连校区
  • 广州校区
  • 成都校区
  • 杭州校区
  • 长沙校区
  • 合肥校区
  • 南京校区
  • 上海校区
  • 深圳校区
  • 武汉校区
  • 郑州校区
  • 西安校区
  • 青岛校区
  • 重庆校区
  • 太原校区
  • 沈阳校区
  • 南昌校区
  • 哈尔滨校区

14天品质课程免费学

10年以上业内强师带你蜕变精英

提交领取