JVM垃圾回收算法的理解
2022/3/19 14:28:20
本文主要是介绍JVM垃圾回收算法的理解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
GC判断死亡对象的算法:
- 引用计数法
- 可达性分析算法
JVM常用的垃圾回收算法有以下几种:
1. 标记清除算法(年老代) 2. 标记复制算法(年轻代) 3. 标记整理算法(年老代) 4. 分代收集算法
判断对象死亡
引用计数法
在对象中添加一个引用计数器,每当一个地方引用它的时候计数器加1;引用失效的时候计数器减1。当计数器为0时候就被回收。但是存在循环引用问题,如果一个对象对另外一个对象有依赖,造成多个对象循环依赖,依赖成环,那么如果要回收A对象,就必须得释放其他引用。然而其他引用是依赖于A的,所以最后谁也无法释放。
可达性分析算法
通过GC Roots的对象作为起始点,从这些节点遍历所有引用链,如果某个对象没有GC Roots直接或间接连接,这个对象就可以被回收。
JVM常用的垃圾回收算法
标记清除
分为标记和清除两个阶段:标记出所有死亡的对象,然后把所有死亡的对象进行清除操作。
缺点是造成内存碎片,后来的大对象无法存储。造成内存使用率降低。
标记复制
分为标记复制两个阶段。首先标记存活对象,完成后算法把存活对象都复制到一块新的内存空间里去,然后把原来的内存空间情况。
缺点是这个算法需要很大的内存空间,因为要整体复制。
标记整理
分为标记-整理-清除阶段。首先标记存活的对象,将其整理到一边,最后把存活边界外的内存空间都清除一遍。
好处是不会产生内存碎片,但是由于整理阶段移动对象,所以需要更新对象的引用。
分代收集算法
分代收集算法将不同内存区域划分,然后对不同性质的内存区域采取不同的以上的GC算法,使优点变大,缺点削弱。
一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),在堆区之外还有一个代就是永久代(Permanet Generation)。
在不同年代使用不同的算法,从而使用最合适的算法。
年轻代分为Eden和survivor区(from和to两块),且Eden : from : to==8:1:1
- 新产生的对象优先分配在Eden区,当Eden区满了放不下了,其中存活的对象会被复制到from区。
- 之后对象继续被分配在Eden里,当Eden再次满了,这时就会把Eden区和from区存活下来的对象复制到to区里。(如果to区也放不下,则存活下来的对象全部进入老年代。)之后回收掉Eden和from区的所有内存。
- 向上面这样对象会被复制很多次,默认复制了15此,就会进入老年代。当老年代满了或者存放不下即将要进入老年代存活对象的时候,就会发生一次Full G。
这篇关于JVM垃圾回收算法的理解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南