Java面试题——JVM(6)

题目6:GC垃圾回收算法和垃圾收集器的关系?分别是什么

文章目录

  • 题目6:GC垃圾回收算法和垃圾收集器的关系?分别是什么
    • GC垃圾回收算法
    • GC垃圾收集器
      • 新生代
        • 串行垃圾收集器Serial
        • 并行垃圾收集器Parnew
        • 并行回收GC(Parallel Scavenge)
      • 老年代
        • 串行GC(Serial old)
        • 并行GC(Parallel old)
        • 并发垃圾收集器Cms
            • 过程
            • 优缺点
        • G1

GC垃圾回收算法

1、分代算法
2、复制
3、标记-清除算法
4、标记-整理算法

每个算法的具体内容可以参考这个网址
GC算法是内存回收的方法论,垃圾收集器是算法落地实现。
目前没有完美的收集器出现,只能针对具体应用最合适的收集器,即分代收集

GC垃圾收集器

新生代

串行垃圾收集器Serial

串行垃圾收集器:为单线程环境设计且只使用一个线程进行垃圾回收,会暂停所有的用户线程,所以不适合服务环境。
STW:stop the world:把用户所有的线程都停掉,进程gc操作,然后再运行。
Java面试题——JVM(6)_第1张图片
对应JVM参数:-XX:+UseSerialGC
开启后会使用:Serial(Young区用)+Serial Old(Old区用)的收集器组合
新生代和老年代都会使用串行回收收集器,新生代使用复制算法,老年代使用标记整理算法。

并行垃圾收集器Parnew

并行垃圾收集器:多个垃圾收集线程并行工作,此时用户线程是暂停的,用于科学计算、大数据处理等弱交互场景。也会STW直到收集结束。
Java面试题——JVM(6)_第2张图片
常用的是和老年代的CMS GC工作,其余行为和Serial收集器完全一样,是很多java虚拟机运行在Server模式下新生代的默认垃圾收集器。
常见对应JVM参数:-XX:+UseParNewGC
启用Parnew收集器,只影响新生代的收集,不影响老年代。开启参数后,会使用ParNew(Young区用)+Serial Old(Old区用)的收集器组合。新生代使用复制算法,老年代使用标记整理算法。
-----------------------------------------------会出现以下提示信息:------------------------------------------------------------------
在这里插入图片描述
未来会不再使用Serial Old(Old区用),所以不推荐使用。

并行回收GC(Parallel Scavenge)

Parallel Scavenge收集器类似与ParNew也是一个新生代垃圾收集器,使用复制算法,也是一个并行的多线程的垃圾收集器,俗称吞吐量优先收集器。一句话:串行收集器在新生代和老年代的并行化
重点关注:
可控制的吞吐量。高吞吐量意味着高效使用CPU,而不是垃圾收集。
自适应调节策略:虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间(-XX:MaxGCPauseMillis)或最大的吞吐量。
Java面试题——JVM(6)_第3张图片
常见对应JVM参数:-XX:+UseParallelGC或-XX:+UseParallelOldGC 可相互激活
开启参数后,会使用Parallel(Young区用)+Parallel Old(Old区用)的收集器组合。新生代使用复制算法,老年代使用标记整理算法。

-XX:ParallelGCThreads=数字N ,表示启动多少个GC线程
cpu>8 N=5/8
cpu<8 N=实际数目

老年代

串行GC(Serial old)

Serial的老年代版本,单线程,标记-整理算法。
不太使用了

并行GC(Parallel old)

JDK1.6之后使用。
JVM参数:-XX:+UseParallelOldGC

并发垃圾收集器Cms

并发垃圾收集器:用户线程和垃圾收集线程同时执行(不一定是并行,可能是交替执行),不需要停顿用户线程,互联网公司多用它,适用对相应时间有要求的场景。
Java面试题——JVM(6)_第4张图片
~----是一种以获取最短回收停顿时间为目标的收集器,适合应用在互联网站或者 B/S 系统的服务器上,这个类应用尤其重视服务器的响应速度,希望系统停顿时间最短。
~----CMS 非常适合堆内存大、CPU 核数多的服务器端应用,也是 G1 出现之前大型应用首选收集器。
~----并发停顿比较少,并发指的是与用户线程一起执行。

参数:==-XX:+UseConcMarkSweepGC ==开启该参数后会自动将:-XX:+UseParNewGC 打开
开启参数后,使用ParNew(Young区用)+CMS(Old区用)+Serial Old(Old区用)的收集器组合,Serial Old将作为CMS出错的后备收集器

过程

1、初始标记(initail mark):只是标记一下 GC Roots 能直接关联的对象,速度很快,需要暂停所有的工作线程
2、并发标记(concurrent mark 和用户线程一起):进行 GC Roots 的跟踪过程,和用户线程一起工作,不需要暂停工作线程。
3、重新标记(remark):为了修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,仍然需要暂停所有的工作线程。
4、并发清除(concurrent sweep 和用户线程一起):清除 GC 不可达对象,和用户线程一起工作,不需要暂停工作线程,基于标记结果,直接清除。由于耗时最长的并发标记和并发清除过程中,垃圾收集线程和用户线程可以一起并发工作,所以总体来看 CMS 收集器的内存回收和用户线程是一起并发地执行。

优缺点

~~优点:并发收集停顿低
~~缺点:并发执行对 CPU 资源压力大,采用的标记清除算法会导致大量碎片

G1

G1垃圾收集器将堆内存分割成不同的区域然后并发的对其进行垃圾回收。

G1垃圾收集器

Java面试题——JVM常见面试题目录

你可能感兴趣的:(面试-JVM)