G1最明显的特点就是可以预测STW的时间。 而G1为了达到这个效果,抛弃传统的分代内存,把他们变成了各个小内存块regoin,针对这些内存块regoin预测垃圾回收的性价比,然后选某些性价比最高的内存块regoin进行GC,以在预设的GC时间内完成GC。G1的应用场景可以是针对STW特别敏感的业务上,通信或者低延迟的响应,还有就是大内存机器。
一:如何减少老年代的GC。
从根本上分析,合理分配新生代的占比,保证supervisor区放得下动态年龄不会那么快的进入老年代,短期存活的对象避免进入老年代,不会因为同龄的存活对象占比很快达到supervisor区域的50%
二:使用G1垃圾回收器的时候,优势在什么地方?
1.对于新生代,和之前的理论差不多,主要目标是避免短期存活的对象进入老年代,做到预估系统每次GC后存活的对象确保supervisor能放得下。
2.避免高峰期间,新生代对象满足动态年龄判断的条件,导致短期存活的对象进入到老年代
3.大对象有大对象regoin,不占用老年代空间,基本上不需要考虑
4.调整Edon和Supervisor的占比,避免同龄的短期存活的对象的内存达到整个supervisor的总50%,导致短期存活的对象进入老年代
综上所述,为了避免老年代的内存达到45%触发GC,需要从根本上出发合理的分配新生代的内存,合理设置预设GC时间,避免短期存活的对象进入到老年代。
1.对于老年代可预测停顿时间,需要合理设置,并不是越小越好,如果过小,有可能多次回收效果不大,最终导致回收失败OOM执行FullGC,执行serial old。
2.G1HeapWastePercent这个参数【当回收的regoin占比达到整个堆内存的多少】,我觉得应该可以适当提高,避免玩意真的遇到了高峰期,短期存活对象进入老年代,但是回收的时候,进行了几次混合回收的时候,刚好达到了5%,但是在老年代的regoin中可能还是存在某些短期存活的对象没有被回收,过早的结束混合回收。
3.-XX:G1MixedGCLiveThresholdPercent【针对regoin中存活对象达到整个regoin的85%】这个参数,暂时不用管。降低这个参数可能会让regoin的回收效率更高。
三:如何使用G1垃圾回收的时候,应该值得优化的是什么地方?
尽量让短期存活的对象在新生代被回收掉,长期存活的对象尽早进入老年代。
合理设置新生代中Edon和surpervisor的内存占比,合理的设置MaxGCPauseMills大小。
四:什么时候可能会导致G1频繁的触发Mixed混合垃圾回收?
1.InitiatingHeapOccupancyPercent【老年代GC的阈值45%】设置的值太小。
2.新生代和老年代空间设置不合理,导致进入老年代的对象过多,频繁达到Mixed GC的条件。
五:如何尽量减少Mixed GC的频率?
主要触发MixedGC的条件:
1.InitiatingHeapOccupancyPercent的值过小,导致频繁达到MixedGC的阈值。
2.为了减少过多的存活的对象进入到老年代,尽量将短期存活的对象在新生代被回收,长期存活的对象尽早的进入到老年代,合理的分配新生代中Edon和suoervisor的占比,避免动态年龄判断将短期存活的对象进入到老年代,避免对象年龄多大,合理设置预设GC时间。
3.将老年代设置为较小的值留给更多的内存给新生代或者提高InitatingHeapOCCupancyPercent参数值都会降低MixedGC的频率,但是各自存在一定的风险。
3.1.提高InitatingHeapOCCupancyPercent的值同样也会存在一定的问题,会导致老年代中对象过度,在并发标记的过程中增加了计算和预估的负担,会增加cpu执行效率,占用更多的CPU资源,不适合CPU负载较高的计算型业务的系统。
3.2.如果将老年代设置为较小的值,如果有较多长期存活的对象的话就会导致FullGC或者直接OOM,直接执行Serial Old。
待续。。。。