【面试题精讲】JVM-详细说说引用计数法的缺点-循环依赖

简介: 【面试题精讲】JVM-详细说说引用计数法的缺点-循环依赖

1. 什么是引用计数法?

引用计数法是一种垃圾回收算法,它通过计算每个对象被引用的次数来确定是否可以回收该对象。每当有一个引用指向该对象时,对象的引用计数就加 1;当引用断开时,对象的引用计数就减 1。当引用计数为 0 时,说明该对象没有被引用,可以被回收。

2. 为什么需要引用计数法?

引用计数法主要用于自动管理内存,以避免内存泄漏和空指针异常。通过跟踪对象的引用计数,系统可以自动判断对象是否需要被回收,释放不再使用的内存资源。

3. 引用计数法的实现原理?

引用计数法的实现原理相对简单,在每个对象的头部添加一个引用计数器。当引用链中新增了一个引用指向该对象时,引用计数器加 1;当引用链中的引用被断开时,引用计数器减 1。当引用计数器为 0 时,即表示该对象没有被引用,可以被回收。

4. 循环依赖是引用计数法的一个缺点

循环依赖是指两个或多个对象之间形成了一个闭环的引用链,它们相互引用对方。在引用计数法中,循环依赖会导致一种情况称为" 引用计数无法归零",即这些循环引用的对象的引用计数永远不会变为 0,导致这些对象无法被回收,造成了内存泄漏。

例如,假设有两个对象 A 和 B,A 引用 B,B 引用 A,形成了循环依赖。当没有其他引用指向 A 和 B 时,它们的引用计数都应该为 0,但由于循环依赖的存在,它们的引用计数无法归零,无法被回收。

5. 引用计数法的使用注意事项

  • 循环依赖的问题:在设计程序时应尽量避免出现循环依赖的情况,否则可能导致引用计数无法归零,造成内存泄漏。
  • 高额开销:引用计数法需要维护每个对象的引用计数器,这会增加额外的开销。而且频繁的增加和减少引用计数也会带来一定的性能影响。
  • 频繁的更新:引用计数法需要在每个引用发生变化时更新引用计数,这会增加对象的操作频率和系统资源的消耗。

6. 总结

引用计数法是一种简单的垃圾回收算法,通过计算对象的引用计数来判断是否可以回收该对象。然而,它存在循环依赖的问题,导致引用计数无法归零,造成内存泄漏。在使用引用计数法时,需要注意避免循环依赖的情况,并考虑额外开销和频繁更新的问题。


写在最后

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。[3]

学习建议

这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。

重点内容说三遍

不要死记硬背,每天复习,有个相关概念就行

不要死记硬背,每天复习,有个相关概念就行

不要死记硬背,每天复习,有个相关概念就行

关于价格

现在是限时优惠,随着参与人数的增加,价格会不断调整。

关注公众号并加我微信,备注 兑换码,就可以半价购买。

关于更新

文章会持续更新。每个月至少更新 100 篇 ✍️(˶ˆ꒳ˆ˵),于 2023 年 9 月 26 日正式发布。

关于我

欢迎关注我的博客 https://blog.zysicyj.top

如果你想加入交流群讨论技术,请加我微信,备注【交流群】,微信号是【sheng_chenyuanjie】。

不想付费?

你也可以关注我的微信公众号或者博客,所有的面试题都可以免费看到。


相关文章
|
3月前
|
算法 Java
jvm性能调优 - 15JVM的老年代垃圾回收器CMS的缺点
jvm性能调优 - 15JVM的老年代垃圾回收器CMS的缺点
58 0
|
2月前
|
存储 缓存 Java
明知面试要问spring循环依赖,很多人还是搞不懂!
Spring中的循环依赖一直是Spring中一个很重要的话题,一方面是因为源码中为了解决循环依赖做了很多处理,另外一方面是因为面试的时候,如果问到Spring中比较高阶的问题,那么循环依赖必定逃不掉。如果你回答得好,那么这就是你的必杀技,反正,那就是面试官的必杀技,这也是取这个标题的原因,当然,本文的目的是为了让你在之后的所有面试中能多一个必杀技,专门用来绝杀面试官!
33 0
|
15天前
|
缓存 算法 Java
这些年背过的面试题——JVM篇
本文是技术人面试系列JVM篇,面试中关于JVM都需要了解哪些基础?一文带你详细了解,欢迎收藏!
|
1月前
|
存储 监控 算法
JVM 高级面试题及答案整理,最新面试题
JVM 高级面试题及答案整理,最新面试题
70 0
|
5月前
|
Arthas 监控 算法
JVM调优篇:探索Java性能优化的必备种子面试题
本文将带你深入了解JVM调优的重要性、常见问题以及一些实用的调优工具和方法,助你在面试的过程中轻松应对
133 0
JVM调优篇:探索Java性能优化的必备种子面试题
|
2月前
|
机器学习/深度学习 人工智能 安全
常见人力面试题辅助文章(爱好、崇拜者、座右铭、缺点)
常见人力面试题辅助文章(爱好、崇拜者、座右铭、缺点)
31 1
|
3月前
|
设计模式 缓存 Java
面试题:Spring如何解决循环依赖?
面试题:Spring如何解决循环依赖?
24 0
|
3月前
|
机器学习/深度学习 运维 前端开发
【面试题】 面试官:你觉得你最大的缺点是什么?
【面试题】 面试官:你觉得你最大的缺点是什么?
|
3月前
|
缓存 Java Spring
面试题 : Spring循环依赖问题及其解决方案
面试题 : Spring循环依赖问题及其解决方案
|
4月前
|
设计模式 缓存 算法
史上最全Java面试题:数据结构+算法+JVM+线程+finalize+GC
基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制