JVM:垃圾回收算法和垃圾收集器

旧城等待, 2023-06-23 06:57 122阅读 0赞

文章目录

  • 垃圾回收算法
    • 标记清除法
    • 复制算法
    • 标记-整理法
    • 分代收集
  • 垃圾收集器
    • Serial收集器
    • ParNew收集器
    • Parallel收集器
    • CMS收集器
    • G1收集器
  • 常用参数配置

垃圾回收算法

标记清除法

首先标记出需要回收的对象,在标记完成后统一回收掉所有被标记的对象。

  1. 效率低
  2. 回收后会产生大量内存碎片(不连续的内存空间);之后需要分配较大对象(如数组)时无法找到足够的连续内存而不得不提前触发另一次垃圾回收。
    在这里插入图片描述

复制算法

将内存空间平分为两部分,每次只使用其中一块。每次回收时,将存活对象复制到另外一块区域,然后清理原先那一块已使用的内存空间一次性清除掉。

  1. 可用内存空间缩小为一半;
  2. 当大量对象是存活对象时,需要复制的对象太多,效率低。
    在这里插入图片描述

标记-整理法

也叫标记压缩法。
将存活对象整体向一侧移动,然后将存活对象边界以外的对象全部清理掉。
在这里插入图片描述

分代收集

将Java堆分为年轻代和年老代,然后在各自的区域使用各自合适的算法:
年轻代:大量垃圾对象,少量存活对象,适用复制算法
年老代:大量存活对象,少量垃圾对象,适用标记-整理法或标记清除法。

垃圾收集器

在这里插入图片描述
垃圾收集器的作用:

  1. 在java堆,为新创建的对象分配空间;
  2. 在java堆中,回收没用的对象占用的空间。

性能指标:

  1. 最大停顿时长:垃圾回收导致应用停顿时间的最大值
  2. 吞吐率:垃圾回收总时长与应用运行时长的比例。

判断对象是否存活

  1. 引用计数法:当引用计数为0时,则认为是可回收。无法解决循环引用问题;
  2. 可达性分析:从GC Roots开始向下搜索,搜索所走过的路径称为引用链。(其实就是一层接一层的对象引用)
    当一个对象到GC Roots没有任何引用链相连时,则认为该对象是不可用的不可达对象。

Minor GC:年轻代的垃圾回收
Major GC:老年代的垃圾回收,经常伴随至少一次的Minor GC

Serial收集器

串行回收,最古老的、最稳定以及效率高。
新生代使用复制算法,老年代使用标记-压缩法。使用过程会造成stop the world(服务暂停)
参数控制:-XX:+UseSerialGC 串行收集器
在这里插入图片描述
在这里插入图片描述

ParNew收集器

Serial的多线程版本。唯一的区别:新生代并行,年老代串行。
参数控制:-XX:UseParNewGC
-XX:ParallelGCThreads 限制线程数量
在这里插入图片描述
在这里插入图片描述

Parallel收集器

类似ParNew收集器,但更关注吞吐量,虚拟机会动态调整参数以提供最合适的停顿时间或最大的吞吐量;也可以通过参数控制GC的时间不大于多少毫秒或比例。
在这里插入图片描述

CMS收集器

Concurrent Mark Sweep收集器是一种以获取最短回收停顿时间为目标的收集器。
基于标记清除法实现的,分为以下4个步骤:
a. 初设标记
b. 并发标记
c. 重新标记
d. 并发清除
参数控制:-XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection FULL GC后,进行一次碎片整理;整理过程是独占的,会造成停顿时间变长
-XX:+CMSFullGCsBeforeCompaction 设置几次FULL GC之后进行一次碎片整理
-XX:ParallelCMSThreads 设置CMS的线程数量(一般约等于可用CPU数)
在这里插入图片描述

G1收集器

G1与其他收集器在内存分布上有着很大的差别:G1将整个java堆分为多个大小相等的独立区域(Region),每个区域可能是E、S或O的一种,虽然也保留了年轻代和年老代的划分,但是在回收时是以Region为单位的。
G1的新生代收集与ParNew类似,当新生代占用达到一定的比例时,会触发垃圾回收。在回收过程中,剩余的空间仍然可以使用。
在这里插入图片描述

  1. G1采用标记-整理法
  2. 可预测停顿:G1回收的第4步,它是“选择一些内存块”,而不是整代内存来回收,这是G1跟其它GC非常不同的一点,其它GC每次回收都会回收整个Generation的内存(Eden, Old), 而回收内存所需的时间就取决于内存的大小,以及实际垃圾的多少,所以垃圾回收时间是不可控的;而G1每次并不会回收整代内存,到底回收多少内存就看用户配置的暂停时间,配置的时间短就少回收点,配置的时间长就多回收点;
  3. 把几块大内存块的回收问题,变成了几百块小内存的回收问题,使得回收算法可以高度并行化。

在这里插入图片描述
可进行搭配的垃圾收集器组合图

常用参数配置

-Xmx3550m:最大堆内存为3550M
-Xms3550:初设堆内存为3550M
-Xmn2g:设置年轻代大小为2G
整个堆=年轻代+年老代+持久代。Sun官方推荐配置整个堆的3/8
-Xss1m:设置每个线程的堆栈大小
-XX:NewRatio=4:设置年轻代与年老代的比例。设置为4,则年轻代:年老代=1:4
-XXSurvivorRatio=4:设置Eden与Survivor的比例
设置为4,则两个Survivor区与一个Eden的比值为2:4
-XX:MaxPermSize=16m:设置持久代大小为16m
-XX:MaxTenuringThreshold=15:设置垃圾最大年龄
在Survivor区进行多少次复制之后进入年老代。

欢迎关注同名公众号:“我就算饿死也不做程序员”。
交个朋友,一起交流,一起学习,一起进步。在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,122人围观)

还没有评论,来说两句吧...

相关阅读