JVM垃圾收集器

JVM垃圾收集器

1:Serial(串行)收集器/Serial Old收集器
(1)是一个单线程的收集器,在垃圾收集时,会Stop-the-World
(2)优点是简单,对于单个CPU,由于没有多线程的交互开销,可能更高效,是默认的Client模式下的新生代收集器
(3)使用-XX:+UseSerialGC来开启;会使用:Serial Old的收集器组合
(4)新生代使用复制算法,老年代使用标记-整理算法
总结:单线程的STW模式

2:ParNew收集器
(1)ParNew收集器就是Serial收集器的多线程版本
(2)新生代并行,老年代串行;新生代复制算法,老年代标记-整理算法
(3)控制参数:
-XX:UseParNewGC ParNew收集器,会使用ParNew + Serial Old来组合
-XX:ParallelGCThreads 限制线程数量,最好与CPU数量一致
(4)使用多线程进行垃圾回收,在垃圾收集时,会Stop-the-World
(5)在并发能力好的CPU(核数多)环境里,它停顿的时间要比串行收集器短;但对于单CPU或并发能力较弱的CPU,由于多线程交互开销,可能比串行回收器更差
(6)是Server模式下首选的新生代收集器,且能和CMS收集器配合使用
总结:Serial收集器的多线程版本

3:Parallel收集器
新生代Parallel Scavenge收集器/Parallel Old收集器
是一种应用于新生代的、使用复制算法的、并行的收集器,跟ParNew很类似,但更关注吞吐量(CPU吞吐量就是运行应用代码的时间/总运行时间,这种收集器能最高效的利用CPU,适合运行后台应用)。
(1)使用-XX:UseParalleGC来开启新生代Parallel Scavenge收集器
(2)使用-XX:ParallelOldGC来开启老年代使用Parallel Old收集器,使用Parallel Scavenge + Parallel Old的收集器组合
(3)-XX:GCTimeRatio:指定运行代码的时间占总时间的比例,默认99,即1%的时间用来进行垃圾收集
(4)-XX:MaxGCPauseMillis:设置GC的最大停顿时间
(5)新生代使用复制算法,老年代使用标记-整理算法
吞吐量 = 运行用户代码时间/(运行用户代码时间 + 垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾回收花掉1分钟,那吞吐量就是99%。
总结:关注吞吐量的多线程parNew进化版

4:CMS收集器(常用)
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用都集中在互联网或B/S系统的服务器上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来更好的体验。
控制参数:
-XX:+UseConcMarkSweepGC 使用CMS收集器
-XX:+UseCMSCompactAtFullCollection Full GC后,进行一次碎片整理;整理过程是独占的,会引起停顿时间变长
-XX:+UseCMSFullGCsBeforeCompaction 设置进行几次Full GC后,进行一次碎片整理
-XX:ParallelCMSThreads 设定CMS的线程数量(一般情况约等于可用CPU数量)
(1)运作过程分为4个步骤:
初始标记(CMS initial mark)只标记GC Roots能直接关联到的对象
并发标记(CMS concurrent mark)进行GC Roots Tracing的过程
重新标记(CMS remark)修正并发标记期间,因程序运行导致标记发生变化的那一部分对象
并发清除(CMS concurrent sweep)并发回收垃圾对象
(2)在初始标记和重新标记两个阶段还是会发生Stop-the-World
(3)使用标记清除算法,也是一个使用多线程并发收集器的垃圾收集器
(4)最后重置线程,指的是清空跟收集相关的数据并重置,为下一步收集做准备
(5)优点:并发收集、低停顿;缺点:产生大量空间碎片、并发阶段会降低吞吐量

5:G1收集器
G1收集器的特点:
(1)空间整合,G1收集器采用标记整理算法,不会产生内存空间碎片。分配大对象时不会因无法找到连续空间而提前触发下一次GC
(2)可预测停顿

G1与CMS不同:
(1)分代:CMS中,堆被分为PerGen,YoungGen,OldGen;而YoungGen又分为两个survivor区域。G1中,堆被平均分成几个区域(region),每个区域中,也保留了新老代的概念,但收集器是以整个区域为单位收集。
(2)算法:CMS的“标记-清理”算法,G1使用“标记-整理”算法,保证不产生多余的碎片。
(3)停顿时间可控:为了缩短停顿时间,G1建立可预测停顿模型,在用户设置的停顿时间范围内,G1会选择适当的区域进行收集,确保停顿时间不超过用户指定时间。

G1收集步骤:
(1)标记阶段,首先初始标记(initial-Mark),这个阶段是停顿的(Stop-the-World),并且会触发一次普通的Minor GC
(2)Root Region Scanning,程序运行过程中会回收survivor区(存活到老年代),这一过程必须在Young GC之前完成
(3)Concurrent Marking,在整个堆中进行并发标记(和应用程序并发执行),此过程可能会被Young GC中断。在并发标记阶段, 若发现区域对象中的所有对象都是垃圾,这个区域会被立即回收,同时,并发标记过程中,会计算每个区域的对象活性(区域中存活对象的比例)。

6:JVM参数列表
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

-Xmx3550m:最大堆内存为3550M。
-Xms3550m:初始堆内存为3550m。
此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g:设置年轻代大小为2G。
整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xss128k:设置每个线程的堆栈大小。
JDK5.0以后每个线程堆栈大小为1M,在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在 3000~5000左右。
-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。
设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
-XX:MaxPermSize=16m:设置持久代大小为16m。
-XX:MaxTenuringThreshold=15:设置垃圾最大年龄。
如果设置为0的话,则年轻代对象不经过Survivor区,直 接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象 再年轻代的存活时间,增加在年轻代即被回收的概论。

收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器

垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename

并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值