把 java 堆内存拆分成多个大小相同的 Region, 逻辑上区分年轻代和老年代;
G1的内存分配的过程和策略还是 垃圾回收的整个过程一样的,但是它的内存比例是动态的
特点:可以设置垃圾回收的预期停顿时间 -XX:MaxGCPauseMills
新生代gc如何优化?
G1 的年轻代是动态的, -XX:G1NewSizePercent=5 ~ -XX:G1MaxNewSizePercent=60
初始分配 5%的region给年轻代,eden满了之后 对比预设的停顿时间,如果此时回收预估耗时 远低于预设,则继续分配 region 给年轻代 , 避免频繁的进行minor gc;
会根据设定的gc停顿时间不断的给年轻代分配更多 region ,到一定程度才触发新生代gc,保证gc停顿时间在预设范围内
如果 -XX:MaxGCPauseMills 设置小了会造成 分配了没多少region就进行 gc,虽然gc时间很短,但是很频繁
如果设置大了, 年轻代分配很多 region 才进行gc,这个时候对象很多,可能一次性回收几百个 region, 虽然gc频率变低了,但是停顿时间变长了
Mixed GC 如何优化(减少发生)?
尽量避免对象过快的进入老年代
特别要注意避免 新生代gc后存活对象过多无法放入 survivor 区 和 动态年龄判断 这两种情况让很多对象进入老年代
关键还是 -XX:MaxGCPauseMills ,需要结合系统压测工具、gc日志、内存分析工具等来进行综合分析, 保证gc频率和停顿时间的平衡
G1 适用场景
非常适合大内存堆进程,停顿可控 多次回收
mixed gc回收老年代和年轻代的时候用的是复制算法 => 空间换时间