G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器,旨在提升应用响应速度,减少GC停顿时间。G1将Java堆划分为多个大小相等的独立区域(Region),一般Region大小等于堆大小除以2048,例如堆大小为4096M,则Region大小为2M。G1保留了年轻代和老年代的概念,但它们不再是物理隔阂,而是(可以不连续)Region的集合。默认年轻代对堆内存的占比是5%,系统运行中JVM会根据需要动态调整年轻代的Region数量,但新生代的占比不会超过60%,可通过“-XX:G1MaxNewSizePercent”调整。
年轻代中的Eden和Survivor区域的默认比例保持8:1:1不变。一个Region可能在进行垃圾回收后,从年轻代转变为老年代,其区域功能可动态变化。G1垃圾收集器对对象转移至老年代的原则与以往相同,但对大对象的处理有所不同。G1有专门分配大对象的Region称为Humongous区,以避免大对象直接进入老年代导致的空间浪费。
在G1中,大对象的判定规则是一个对象超过了一个Region大小的50%。如果对象过大,可能会横跨多个Region存放。Humongous区专门用于存放短期巨型对象,避免其直接进入老年代,以节约老年代空间,降低GC开销。Full GC不仅收集年轻代和老年代,也一并回收Humongous区。
回收算法主要采用复制算法,将一个region中的存活对象复制到另一个region中,这几乎不会有太多的内存碎片。G1垃圾收集器的特征和GC步骤包括:
使用复制算法进行回收,减少内存碎片的产生。
指定GC工作线程数量(-XX:ParallelGCThreads)。
指定分区大小(-XX:G1HeapRegionSize,范围1MB~32MB,且必须是2的N次幂),默认将整堆划分为2048个分区。
设定目标暂停时间(-XX:MaxGCPauseMillis,默认200ms)。
配置新生代内存初始空间(-XX:G1NewSizePercent,默认整堆5%)。
设置新生代内存最大空间(-XX:G1MaxNewSizePercent)。
配置Survivor区域的填充容量(-XX:TargetSurvivorRatio,默认50%),当Survivor区域的一批对象总和超过50%时,会将年龄大于一定值的对象放入老年代。
设置最大年龄阈值(-XX:MaxTenuringThreshold,默认15)。
老年代占用空间达到整堆内存阈值(-XX:InitiatingHeapOccupancyPercent,默认45%)时,执行新生代和老年代的混合收集(MixedGC)。
控制region中的存活对象回收(-XX:G1MixedGCLiveThresholdPercent,默认85%)。
在一次回收过程中指定做几次筛选回收(-XX:G1MixedGCCountTarget,默认8次),通过多次筛选回收降低系统停顿时间。
空闲出来的Region数量达到堆内存的5%(-XX:G1HeapWastePercent,默认5%)时,停止混合回收。
G1垃圾收集器适用于对系统响应速度要求较高且内存较大的场景。优化建议核心在于调整`-XX:MaxGCPauseMills`参数,以平衡年轻代GC频率和存活对象进入老年代的效率,避免频繁触发Mixed GC。
本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。