首页 > 编程知识 正文

jvm垃圾回收机制面试,jvm的垃圾回收机制是什么

时间:2023-05-06 18:39:07 阅读:16426 作者:4627

1. JVM垃圾回收算法1.1标记去除算法最基础的垃圾回收算法分为两个阶段进行标记和去除。 标记阶段通过可达性分析算法标记所有生存对象,清除阶段批量回收所有未标记的对象,如图:所示

缺点:内存碎片严重,以后可能会出现大对象找不到可用空间的问题,其次,这两个阶段都没有效率

1.2标记复制算法为解决魅力煎饼-Sweep算法内存碎片缺陷而提出的算法。 根据内存容量将内存分成大小相等的两个块。

一次只使用一个内存空间分配对象。 发生GC时,首先用根到达性分析算法判断生存对象,将所有生存对象移动到另一个未使用的内存区域,最后对前一个该使用内存区域中的对象统一回收。 图:

优点:实现简单,内存效率高,不易碎片化

缺点:如果可用内存被压缩一半,且生存对象变多,复制算法的效率会大幅降低

1.3标签整理(压缩)算法将以上两种算法结合起来,为避免缺陷而提出。 标记阶段与吸引人的煎饼-Sweep算法相同,标记后将生存对象移动到内存边缘,而不是清理对象。 然后清除边缘边界之外的对象。 图:

2. JVM垃圾收集器2.1STW是停止时间世界的简称。 当JVM进行垃圾回收时,它会暂停用户线程,以正确标记对象的状态是垃圾还是非垃圾,从而有助于后续的垃圾回收。 如果没有STW机制,则同时运行用户线程和JVM垃圾回收线程,则以前由垃圾回收线程标记为非垃圾的对象将在由用户线程执行后再次被垃圾回收在这种情况下,JVM垃圾回收不能永远停止,因此必须暂停用户线程,清除标记为垃圾的对象组,然后让用户线程执行。

2.2垃圾收集器常见的垃圾收集器以CMS、G1、ZGC、G1使用最多。 在JDK1.8之前,JVM使用分代模型,而在1.8之后使用分区模型

2.2.1当用户线程运行到安全点时,JVM执行引擎将暂停用户线程并打开一个GC线程。 对年轻一代采用标签复制算法进行垃圾收集,对年轻一代采用标签整理算法进行垃圾收集。 缺点: GC是单线程的,效率低下

2.2.2 UseParNewGC

2.2.3 useparallelgc/useparalleloldgc淡糕使用ParallelOld GC代替Parallel Scavenge GC

2.2.4 UseConc魅力煎饼SweepGC使用-XX:UseConc魅力煎饼SweepGC,淡糕替代ParNew GC,老年代为CMS GC和Serial Old GC收集器的

CMS同时清除标志的过程:

初始标记

仅标记GC root直接引用的对象,而标记其他对象而不考虑并发标记

在这个阶段用户线程是可执行的,同时GC root重新标记所有可到达的对象(在产生垃圾的同时标记垃圾对象,不严格) )。

暂停用户线程,在同时标记的阶段弄错标记,再次标记并清理去除标记的对象

注:图为https://www.processon.com/view/5 dec 50d 7e 4b0e 2c 298 a6 bd60? fromnew=1 CMS之所以采用这样复杂的标签删除过程,是为了解决STW时间过长的问题

2.2.5 G1垃圾机分代收集思想:不管房间大小,这个房间里的垃圾都要清除

分区收集思想:不管你房间大小,我把房间分成多个小块,先打扫一个区域给你使用,然后继续打扫其他区域,用户不用等太久

其他参考:

33559 www.processon.com/view/5f7fdf 845653 bb06 eff 0a 16d? fromnew=1

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。