怎么判断对象是否可以被回收
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
相关推荐HOT
更多>>运行时异常和一般异常(受检异常)区别是什么?
RuntimeException异常和受检异常之间的区别:是否强制要求调用者必须处理此异常,如果强制要求调用者必须进行处理,那么就使用受检异常,否则就...详情>>
2022-11-17 11:35:00java编程入门先学什么
对于想学java编程但零基础的同学,初期刚入门肯定比较迷茫,但这再正常不过了。java编程是有一定门槛的,不可能伸手就来,初期学习一定要先打好...详情>>
2022-10-18 14:12:00介绍一下网关的作用
网关相当于一个网络服务架构的入口,所有网络请求必须通过网关转发到具体的服务。统一管理微服务请求,权限控制、负载均衡、路由转发、监控、安...详情>>
2022-10-11 16:25:19Jedis和redisson有哪些区别?
Jedis和Redisson都是Java中对Redis操作的封装。Redisson不仅封装了redis ,还封装了对更多数据结构的支持,以及锁等功能,相比于Jedis更加大。...详情>>
2022-10-10 13:58:00数据库的3大范式是什么?
每个属性都与主键有直接关系,而不是间接关系;如果有特殊情结,当然要特殊对待,数据库设计最重要的是看需求和性能,需求>性能>表结构。所以不...详情>>
2022-10-10 13:58:00Java培训问答更多>>
新Java行业疑惑解答:Java的内存管理是如何工作的?
新java script是什么?为什么要学java script
新java和大数据哪个好?未来哪个职业发展更好
新java培训班多久能学会?培训周期大概多久
新java script和java的区别有哪些?如何区分
新java script的数据类型主要有哪些?怎样学的更快
新c语言与java区别在哪里?去培训机构学哪个比较好
Java面试题库 更多>>
华为外包java面试题-Java实现单链表的逆序
Java程序员面试题
Java面试题及答案
什么是线程的上下文切换?
如何撤销已经推送(push)到远端仓库的提交(commit)信息?
你了解哪些加密算法?
- 北京校区
- 大连校区
- 广州校区
- 成都校区
- 杭州校区
- 长沙校区
- 合肥校区
- 南京校区
- 上海校区
- 深圳校区
- 武汉校区
- 郑州校区
- 西安校区
- 青岛校区
- 重庆校区
- 太原校区
- 沈阳校区
- 南昌校区
- 哈尔滨校区