jvm垃圾收集器(九)

一、并行垃圾收集器

1.Parallel Collector

-XX:+UseParallelGC 手动开启并行垃圾收集,Server模式默认开启

-XX:ParallelGCThreads=<N>  开启多少个线程并行收集垃圾

CPU>8 ,则N=5/8;(CPU为8,开启5个)

CPU<8,则N=CPU;

 

2.Parallel Collector Ergonomics

-XX:MaxGCPauseMillis=<N>响应时间

-XX:GCTimeRatio=<N> 吞吐量

-Xmx<N>最大最内存

可通过设置响应时间和吞吐量,让jvm自适应来调整堆的大小。

 

二、并发CMS

1.并发收集,低停顿,低延迟,老年代收集器

2.过程

CMS initail mark :初始标记Root,STW。需要暂停应用程序

CMS concurrent mark:并发标记,根节点往后的标记,不需要暂停应用程序

CMS concurrent preclean :并发预清理

CMS remark:重新标记,STW。

CMS concurent sweep:并发清理

CMS concurrent reset:并发重置

3.CMS缺点

cpu敏感,因为在执行垃圾收集的过程中也会执行应用程序,

浮动垃圾,因为在垃圾回收的时候,应用程序也在运行,会进行空间分配的

空间碎片,因为采用的算法是标记清除算法,所以会产生空间碎片。

4.参数

-XX:ConcGCThreads :并发的GC线程数

-XX:+UseCMSCompactAtFullCollection :fullGC之后进行空间压缩

-XX:CMSFullGCsBeforeCompaction:发生多少次fullGC之后做一次压缩

-XX:CMSInitiatingOccupancyFraction:存活对象占old区空间率多少的时候进行一次fullGC

-XX:+UseCMSInitiatingOccupancyOnly:表示触发FUllGC的条件是否是可动态调节的

-XX:+CMSScavengeBeforeRemark:在做fullGC之前是否执行一次mimorGC

-XX:+CMSClassUnloadingEnabled:是否启用回收Perm区(在jdk7之前)

5.iCMS

适用于单核或者双核(jdk8之后不再使用)

 

三、并发G1(jdk7开始使用,jdk8之后慢慢成熟)

1.新生代和老年代收集器,(jdk9默认的收集器)

2.物理上内存是不分区的,(old区和young区只是逻辑上的分区)

3.Region(堆内存中的一个单位内存)

4.STAB:Snapshot-At-The-Beginning,它是通过Root Tracing得到的,GC开始时候存活对象的快照,后面的垃圾回收就是根据这个做判断的。

5.Rset:记录了其他Region中对象引用本对象的关系,属于point-into结构(哪个对象引用了我)

6.YoungGC

 首先新对象进入Eden区,

 存活对象拷贝到Survivor区

 当对象存活时间到达年龄阀值当时,对象晋升到old区。

7.MixedGC

  G1中不存在fullGC。

   回收所以的young区和部分old区。

8.global concurrent mark

  Initial marking phase:标记GC root ,STW

  Root region scanning phase:标记存活的region

  Concurrent marking phase:标记存活的对象

  Remark phase:重新标记,STW

 Cleanup phase:部分标记,STW

9.参数

InitiatingHeapOccupancyParcent

堆占有率达到这个数值则触发global concurrent marking,默认为45%

 

G1HeapWasteParcent

在全局标记结束之后,可以知道有多少内存会被回收,在每次YoungGC和再次发生MixedGC之前,会检查垃圾占比是否达到此参数,只有达到了,下次才会发生MixedGC。

 

G1MixedGCThresholdPercent

Old区的region被回收的时候存活对象的占比

 

G1MixedGCCountTarget

一次全局标记之后,最多执行MixedGC的次数

 

G1OldCSetRegionThresholdPercent

一次MixedGC在Old区最多能够回收多少个region

 

-XX:+UseG1GC :是否开启G1

 

-XX:G1HeapRegionSize=n,   region的大小,1~32M。最多为2048个region

 

-XX:ParallelGCThreads=n 并行垃圾收集的线程数,(需要停止应用程序)

 

-XX:ConcGCThreads=n 并发线程数=(1/4)*并行(比并发小,因为需要执行应用程序)

 

-XX:MaxGCPauseMillis=200 最大停顿时间

 

-XX:G1ReservePercent=10 保留内存,防治Young区中,Eden区S0区复制到S1区时内存不够,溢出

 

10.实践

年轻代大小:避免使用-Xmn、-XX:NewRatio等显示设置Young区的大小,会覆盖暂时时间目标

暂停时间目标:暂停时间不要太苛刻,其吞吐量目标是90%的应用程序时间和10%的垃圾回收时间,太苛刻会影响吞吐量

 

11.是否需要切换到G1

50%以上的堆被存活对象占用

对象分配和晋升的速度变化非常大

垃圾回收时间长,超过1秒

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值