JVM:垃圾回收器

说明:如果两个收集器之间存在连线说明他们之间可以搭配使用。在这里插入图片描述

一、Serial(新生代)

这是一个单线程收集器。意味着它只会使用一个 CPU 或一条收集线程去完成收集工作,并且在进行垃圾回收时必须暂停其它所有的工作线程直到收集结束。

  • 特点:单线程收集;标记-复制算法
  • 缺点:单线程
  • 场景:client模式下默认新生代收集器;单核机器

二、ParNew(新生代)

可以认为是 Serial 收集器的多线程版本。

  • 特点:多线程并行收集器;标记-复制算法
  • 缺点:在单CPU场景效果不突出
  • 场景:用户交互;配合CMS垃圾收集器使用

三、Parallel Scavenge(新生代JDK8默认)

这是一款新生代收集器,使用复制算法实现,同样也是并行的多线程收集器,JDK8默认使用的收集器。

  • 特点:目标在于达到可控吞吐量(吞吐量=用户代码运行时间/(用户代码运行时间+垃圾回收时间));标记-整理算法
  • 场景:高效利用CPU,后台运算且不需要太多交互
  • 相关参数:
    • -XX:MaxGCPauseMillis设置最大垃圾收集停顿时间;
    • -XX:GCTimeRation设置吞吐量大小
    • -XX:UseAdaptiveSizePolicy设置虚拟机自动调节优化吞吐量、最大停顿时间
    • -XX:SurvivorRatio设置Eden与Survivor的比率
    • -XX:PretenureSizeThreshold设置普升老年代对象大小
    • -Xmx最大堆大小
    • -Xms设置最小堆大小
    • -XX:NewSize指定JVM启动时分配的新生代内存
    • -Xmn(-XX:MaxNewSize)指定JVM启动时分配的新生代最大内存
    • -XX:NewRatio:指定老年代/新生代的堆内存比例。在hotspot虚拟机中,堆内存 = 新生代 + 老年代。如果-XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆内存的1/5。在设置了-XX:MaxNewSize的情况下,-XX:NewRatio的值会被忽略,老年代的内存=堆内存 - 新生代内存。老年代的最大内存 = 堆内存 - 新生代 最大内存。
    • -XX:OldSize:设置JVM启动分配的老年代内存大小,类似于新生代内存的初始大小-XX:NewSize。
      比如:堆的最大值为128m,则新生代(eden,s1,s2)共128*1/5=25.6,老年代为128*4/5=102;from=to=25.6*1/10=2.5,eden = 25.6*8/10=20.56;

四、CMS(老年代)

是一种以获取最短收集停顿时间为目标的收集器。

  • 特点:最短回收停顿时间;标记-清除算法
  • 缺点:
    1、对CPU资源敏感;
    2、无法回收浮动垃圾;
    3、标记-清除算法会产生内存碎片,可以通过参数开启内存碎片的合并整理;
  • 步骤:
    1、初始标记(CMS initial mark):标记 GC Roots 能直接关联到的对象
    2、并发标记(CMS concurrent mark):进行 GC Roots Tracing
    3、重新标记(CMS remark):修正并发标记期间的变动部分
    4、并发清除(CMS concurrent sweep)

五、Serial Old (老年代)

Serial 的老年代版本

  • 特点:Serial的老年代版本,单线程;标记-整理算法
  • 缺点:
  • 场景:1.5前与Parallel Scavenge配合使用;作为CMS的后备预案

六、Parallel Old(老年代JDK8默认)

Parallel Scavenge的老年代版本

  • 特点:标记-整理算法、多线程
  • 场景:为了代替Serial Old与Parallel Scavenge配合使用

七、G1

面向服务端的收集器
特点:将整个Java堆划分为多个大小相等的独立区域Region,跟踪各个Region里面的垃圾堆积的价值大小,在后台维护一个优先队列,每次根据允许的收集时间,优先回收价值最大的Region
步骤:
1、初始标记(Initial Marking),标记GC Roots直接关联的对象
2、并发标记:对堆中对象进行可达性分析,找出存活对象,耗时长、与用户进程并发工作
3、最终标记:修正并发标记期间用户进程继续运行而产生变化de标记
4、筛选标记:对各个Region的回收价值排序,然后根据期望的GC停顿时间制定回收计划

八、查看与设置JVM垃圾回收器

  • 查看使用的垃圾收集器:
    在命令行使用以下命令:java -XX:+PrintCommandLineFlags -version
# java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=265930560 -XX:MaxHeapSize=4254888960 
-XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops 
-XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

设置垃圾收集器:

  • -XX:+UseSerialGC:串联收集器
  • “-XX:+UseConcMarkSweepGC”:指定使用CMS后,会默认使用ParNew作为新生代收集器;
  • “-XX:+UseParNewGC”:强制指定使用ParNew;
  • “-XX:ParallelGCThreads”:指定垃圾收集的线程数量,ParNew默认开启的收集线程与CPU的数量相同;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书香水墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值