更新时间:2020-09-30 15:27:39 来源:极悦 浏览1303次
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。而JVM(Java Virtual Machine)则是Java虚拟机,是一种用于计算设备的规范。JVM垃圾收集算法是JVM和算法的完美结合,本文,让我们一起来探究这些神奇的JVM垃圾收集算法。
1.标记-清除算法
标记-清除算法分为两个阶段:
· 标记阶段:标记可以被回收的对象;
· 清除阶段:回收被标记的对象内存;
标记-清除算法时最基础的算法,因为后面提到的垃圾回收算法都是基于此算法的基础上面改造的,标记-清除算法的执行过程如下:
标记-清除算法主要有两个缺点:一是标记和清除的效率都不高;二是如上图所示,在标记清除可回收的对象空间后,会产生大量不连续的内存碎片,碎片太多可能会导致后续没有足够的内存分配给较大的对象,从而导致触发新一轮的垃圾收集动作。
2.复制算法
为了解决标记-清除算法带来的内存碎片的问题,于是提出了复制算法。复制算法把内存空间划分为大小相等的两块,每次只使用其中的一块,然后再把另一块内存空间清理掉:
复制算法存在着复制效率低的不足,并且如果不想浪费 50% 空间内存,则需要提供额外的空间担保,以应对被使用的内存中所有的对象都 100% 存活的极端情况。
3.标记-整理算法
复制算法一般不使用在老年代,因为在老年代中,大部分的对象的存活率比较高,选择复制算法就会导致过多的复制操作,导致效率变低。同时也不采用标记-清除算法,因为会产生过多的内存碎片,导致容易触发新的一轮垃圾回收动作。于是出现了一种标记-整理算法(标记-压缩算法)。标记-整理算法与标记-清除算法不同的是,在标记完内存中的对象以后,把存活下来的对象压缩到内存的一端,使得他们紧凑地排序在一起,然后对存活对象边界外的对象进行回收。
4.分代收集算法
分代收集算法会结合不同的多种垃圾算法来处理不同的空间,因此在学习分代收集算法之前首先需要了解 Java 堆的空间划分。Java 堆被划分为新生代(Young Generation)和老年代(Tenured Generation),而新生代又被细分为 Eden 空间、From Survivor 空间和 To Survivor 空间。因为在 Java 堆里面,大部分对象都是"朝生夕灭",只有少数的对象的生命周期比较长,甚至有的对象的生命周期和虚拟机的生命周期一样长,对不同对象地生命周期采用不同的垃圾收集算法,这就是分代收集的概念。
以上就是对JVM垃圾收集算法的完整介绍,想必也足以让大家领略到JVM垃圾收集算法的魅力所在,当然,这只是JVM垃圾收集算法的一个很小的体现方式,在本站的Java数据结构与算法实战教程中还有更多神奇的算法等你来一探究竟!
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习