JVM中垃圾收集算法

1.标记-清除算法

最基础的垃圾收集算法,见名知意,该算法分为标记和清除两个阶段。
①首先标记所有需要回收的对象
②标记后,统一回收所有被标记的对象
缺点:
效率问题:标记、清除两个过程效率都不高
空间问题:标记清除之后,产生大量的不连续的内存碎片,空间碎片太多导致以后程序在运行过程中,需要分配较大对象时,无法找到足够的连续的内存,而不得不提前触发另一次垃圾收集动作
JVM中垃圾收集算法_第1张图片

2.复制算法

将可用内存按照容量大小,等分为两块,每次只使用其中一块。当一块内存用完后,就把仍然存活的对象复制到另一块上,并把上一块内存一次性清理掉。这样的话,每次都是对整个半区进行内存回收,内存分配也就不用考虑内存碎片的问题了。
目的:为了解决效率问题。
缺点:将内存缩小为原来的一半
JVM中垃圾收集算法_第2张图片现代商业虚拟机都采用此算法回收新生代,但并未1:1等分内存,而是把内存划分为1块较大的Eden空间和2块较小的Survivor空间,每次使用1块Eden和1块Survivor。HotSpot虚拟机默认的Eden和Survivor的比例为8:1。

3.标记-整理算法

复制收集算法在对象存活率较高时,需要大量复制工作,费时费工。于是就有了标记-整理算法。过程和“标记-清除算法”一样,但是后续并非直接对可回收对象进行清理,而是让所有的存活的对象都向一端移动,然后直接清理掉边界以外的内存。
JVM中垃圾收集算法_第3张图片

4.分代收集算法

一般把Java堆分为新生代和老年代,这样可以根据各个年代的特点,采用适当的收集算法。
新生代:每次垃圾收集时发现都有大批对象死去,只有少量存活,复制算法是不二选择。
老年代:对象存活率高,没有额外的空间对它进行分配担保,就要选取标记-清除标记-整理算法

你可能感兴趣的:(Java虚拟机)