垃圾回收器相关概念

1.GC分类与性能指标

11.吞吐量:运行用户代码的时间占总运行时间的比例
   用户代码时间/(用户代码时间+垃圾收集时间)
2.垃圾收集开销:吞吐量的补数,垃圾收集所用时间与总运行时间的比例。
33.暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间
  暂停时间优先,意味着尽可能让单次stw时间最短;
4.收集频率:相对于应用程序的执行,收集操作发生的频率
55.内存占用,Java堆区所占内存大小。
6.一个对象从诞生到被回收所经历的时间;

2.不同的垃圾回收器概述

3.Serial回收器:串行回收

4.ParNew回收器:并行回收

5.Parallel回收器:吞吐量优先JDK8默认

-XX:+UseParallelGC        手动指定年轻代
-XX:+UseParallelOldGC   手动指定老年代
-XX:ParallelGCThreads 设置年轻代并行收集器的线程数。一般的,最好与CPU数量相等;

6.CMS回收器:低延迟

7.G1回收器:区域化分代式

JDK8之后:
原因在于应用程序所应对的业务越来越庞大、复杂、用户越来越多,没有GC就不能保证应用程序正常进行;
为了适应现在不断扩大的内存和不断增加的处理器数量
官方给定G1设定的目标时延迟可控的情况下获得尽可能高的吞吐量,所以才担当起”全功能收集器“的重任与期望;
G1回收器的特点:
并行与并发
1.并行性:G1在回收期间,可以有多个GC线程同时工作,有效利用多核计算能力
2.并发性:G1拥有与应用程序交替执行的能力,部分工作可以和应用程序同时执行,因此,一般来说,不会再整个回收阶段发生阻塞应用程序的情况。
分代收集:
1.从分代上看,G1依然属于分代型垃圾回收器,它会区分年轻代和老年代,年轻代依然有Eden区和Survivor区。但从堆区的结构上看,它不要求整个Eden区,年轻代或者老年代都是连续的,也不再坚持固定大小和固定数量。
2.将堆空间分为若干个区域,这些区域中包含了逻辑上的年轻代和老年代。
3.和之前的各类回收器不同,它同时兼顾年轻代和老年代。对比其他回收器,或者工作再年轻代,或者工作再老年代;
空间整合:
1.CMS:”标记-清除“算法、内存碎片、若干次GC后进行一次碎片整理
2.G2将内存划分为一个个的region.内存的回收是以region作为基本单位。
Region之间的赋值算法,但整体上可以看作是标记-压缩算法,两种算法都可以避免内存碎片。这种特性有利于程序的长时间运行,分配大对象时不会因为无法找到连续的内存空间而提前出发下一次GC。尤其时Java堆非常大的时候,G1的优势更加明显。
可预测的停顿的时间模型:
这是G1相对于CMS的另一大优势,G1除了追求地停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定再一个长度为M毫秒的时间片段内,消耗再垃圾收集上的时间不超过N秒。
1.由于分区的原因,G1可以只读取部分区域进行内存回收,这样缩小了回收的范围,因此对于全局停顿情况的发生也能得到较好的控制;
2.G1跟踪各个Region里面的垃圾堆积的价值大小,再后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region。保证了G1收集器再有限的时间内可以获取尽可能高的收集效率。
3.相比于CMS GC,G1未必能做到CMS再最好情况下的延时停顿,但是最差情况要好很多。
G1常用参数设置
1.-XX:+UseG1GC      手动指定使用G1收集器执行内存回收任务
2.-XX:+G1HeapRegionSize   设置Region的大小。至时2的幂,范围1-32MB之间。默认是堆的1/2000
3.-XX:MaxGCPauseMills   设置期望达到的最大GC停顿时间指标,默认是200ms
4.-XX:ParallelGCThread   设置STW工作线程数的值,最多设置为8
5.-XX:ConcGCThreads  设置并发标记的线程数,将n设置为并发垃圾回收线程数的1/4左右。
6.-XX:InitiatingHeapOccupancyPercent 设置触发并发GC周期的Java堆占用率阈值,超过此值,就触发GC,默认是45.
G1的设计原则就是简化JVM性能调优,并发人员只需要简单三步完成调优:
1.开启G1垃圾收集器
2.设置堆的最大内存
3.设置最大的停顿时间
使用场景:
1.面对服务端应用,针对具有大内存,多处理器的机器。
2.最主要的应用是需要低GC延迟,并具有大堆的应用程序提供解决方案;
比如:再堆大小约6GB或更大时,可预测的暂停时间可以低于0.5秒;
3.用来替换CMS收集器
再下面的情况下,使用G1可能比CMS好
   超过50%d java堆被活动数据占用;
   对象分配频率或年代提升频率变化很大;
   GC停顿时间过长
   
G1中提供了三种垃圾回收环节
   1.YoungGC
   2.老年代并发标记过程 Concurrent Marking 
   3.MixGC 
   4.需要避免FullGc:针对GC的评估失败提供了一种失败保护机制,即强力回收 出现需要优化

8.G1回收器垃圾回收过程:Remembered Set

1.一个对象被不同区域引用的问题
2.一个Region不可能是孤立的,一个Region中的对象可能被其他任意Region中对象引用,判断对象存活时,是否需要扫描整个Java堆才能保证准确?
3.再其他的分代收集器,也存在这样的问题
4.回收新生代也不得不同时扫描老年代?
5.这样的话会降低Minor GC的效率:
解决方法:
1.无论G1还是其他分代收集器,JVM都是使用Remembered Set来避免全局扫描。
2.每个Region都有一个对应的Remembered set;
3.每次Rference类型数据写操作时,都会产生一个Write Barrier暂时中断操作;
4.然后检查将要写入的引用指向的对象是否和该Reference类型数据再不同的Region
5.如果不同,通过CardTable把相关引用消息记录到引用指向对象的所在Region对应的Remembered Set中;
6.当进行垃圾收集时,再GC跟节点的枚举范围加入Remembered Set;就可以保证不进行全局扫描,也不会有遗漏。

9.垃圾回收器总结

10.GC日志分析

参数列表
-XX:+PrintGC 输出日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如2013-05-04-XX:+PrintHeapAtGc   再进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log   日志文件的输出路劲

11.垃圾回收器的新发展

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值