龙空技术网

Java面试之JVM GC算法

WinVaz 122

前言:

眼前姐妹们对“c语言复杂算法”大致比较珍视,你们都想要学习一些“c语言复杂算法”的相关知识。那么小编在网上收集了一些对于“c语言复杂算法””的相关知识,希望咱们能喜欢,朋友们一起来了解一下吧!

首先,Java垃圾回收是由虚拟机自动执行。在JVM中有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的。只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。

其次,从如何判定对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)两大类,这两类也常被称作“直接垃圾收集”和“间接垃圾收集”。而当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”的理论进行设计,所以多款常用的垃圾收集器的一致设计原则:收集器将Java堆(Heap)划分出不同的区域, 然后将回收对象依据其年龄(即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储,垃圾收集器才可以每次回收其中一个或者某些部分的区域。因而才有了“Minor GC”“Major GC”“Full GC”这样的回收类型的划分。

Minor GC(也称为Young GC)指的是对新生代进行垃圾收集的过程,当新生代的内存空间不足时,会触发Minor GC。

Major GC(也称为Old GC)指的是对老年代进行垃圾收集的过程。当老年代的空间不足和对元空间进行垃圾收集时,会触发Major GC。

Full GC则指的是对整个堆进行垃圾收集的过程。Full GC的触发条件比较复杂,通常包括以下几种情况:

1.老年代空间不足。

2.元空间不足。

3.CMS GC时出现promotion failed,concurrent mode failure。

4.Minor GC晋升到老年代的平均大小大于老年代的剩余空间。

5.调用System.gc()。

6.使用RMI来进行RPC或管理的JDK应用,每小时执行一次Full GC。

由于当前虚拟机的垃圾收集器大多数都遵循了"分代收集"的理论进行设计。根据每代的特点选择合适的垃圾收集算法。

比如绝大多数对象都是朝生夕灭的新生代采用复制算法,其次是熬过越多次垃圾收集过程的对象就越难以消亡的老年代采用标记-清除或标记-整理算法。这种算法可以更好地满足不同对象的特点,提高垃圾收集效率。

1.标记-清除算法

分为"标记"和"清除"两个阶段,首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象。

这种算法的缺点是会产生比较多的内存碎片,系统运行时间长了以后,无法再大量分配连续的内存空间,会导致更加频繁的GC。

2.标记-复制算法

简称为复制算法。为了解决标记-清除算法面对大量可回收对象时的效率问题。

它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。

当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉

这种算法的优点是可以避免内存碎片问题,但是实际使用的内存空间只有一半,比较浪费内存空间。

3.标记-整理算法

是针对老年代对象的存亡特征提出的一种算法。其中的标记过程仍然与"标记-清除"一样,

但后续步骤不是直接对可回收对象进行清理。而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。

这种算法的优点是可以避免内存碎片问题,但是需要移动存活对象,而且这种对象移动操作必须全程暂停用户应用程序才能进行,所以耗费时间较长。

标签: #c语言复杂算法