G1是什么
1.G1是jvm的一个垃圾回收器,其和以往的垃圾回收器有很大的不同,已经不采取物理分代了,只是在逻辑上存在分代的概念,之前的垃圾回收器都是一大块的内存,G1则是一个个的Region。一个Region可以是任何代。
2.G1是一种服务端应用垃圾收集器,目标是用在多核,大内存的机器上,它在大多数情况下可以实现指定的GC暂停时间,同时还能保持较高的吞吐量。
3.吞吐量相较于ps降低了百分之十-百分之十五,响应时间可以达到200ms。G1的停顿时间很短。
G1运行原理
采用了分而治之的思想,分为若干个Region,Region的大小从1M,2m,4M,8M,16M,32M,比原有的分代中多一个H区,为跨越好几个Region的一个大区,优先回收垃圾多的区域。
humongous object
超过单个Region的百分之五十/跨越多个Region都叫humongous object。
特点
1.并发收集
2.压缩空闲空间不会延长GC的暂停时间
3.更易预测GC暂停时间
4.适用不需要实现很高吞吐量的场景
GC的一个基本概念cardTable
1.分代模型中帮助垃圾回收,加快回收速度,在进行YGC的时候查找存活对象的时候,通过根对象找的对象已经在老年代了,然后老年代的对象又指向了年轻代,然后此时要遍历老年代的所有对象,效率太低。
2.解决方法就是jvm内部将内存区域分成一个个的card,具体对象都存在一个个的card中,在整个程序演化过程中,一个老年代card指向了年轻代,将存在指向的标记为Dirty,这样在进行YGC的时候只需要去扫描Dirty的card,大大提高了效率,cardTable采用bitMap对象实现的。
CSet=CollectionSet
1.一组可被回收的分区的集合
2.在CSet中存活的数据会在GC过程中被移动到另一个可用分区,
CSet中的分区可以来自Eden空间,survivor空间,或者老年代。
CSet会占用不到整个堆空间的1%大小。
3.简单来说:有哪些card需要回收,放在一个CSet中。
RSet=RememberedSet
1.在每一个Region都有一个表格(hashSet)记录了其他Region中的对象到本Region的引用。
2.它的价值在于垃圾回收的时候不需要扫描整个堆找到谁引用的了当前分区中的对象,只需要扫描RSet就可以。
3.问题在于在每个Region中都有个RSet会占用一部分空间。
G1动态调整新老年代比例
一般不需要手工指定,也不需要,G1会动态的根据当前要求的响应时间来调整新老年代的比例。
G1会不会有FGC?
当对象实在分配不下对象的时候就会产生FGC。
原因:回收的时候是将Region中存活的对象复制到另一个Region中,并且进行了压缩,再将原Region清理掉,但是此时因为进入老年代的对象太多,导致没有可复制存放的位置的时候就会产生FGC
G1产生FGC之后要怎么处理?
1.扩内存
2.提高CPU性能(加快回收速度)
3.降低MixedGC触发的阈值,让MixedGC提早发生。
MixedGC
1.XX:InitiatingHeapOccupacyPercent
通过这个参数来设置阈值(占用整体堆内存),当Old区超过这个值的时候,启动MixedGC
2.就相当于一个CMS
初始标记 STW
并发标记
重新标记 STW
筛选回收 STW(并行):筛选那些垃圾占用最多的Region.