一、概念
参考链接:
garbage-first
发展过程:
1.7 出现
1.8 推荐使用
1.9 默认使用
1、特点
1)分代收集(逻辑分代)
2)空间整合(整体上属于“标记-整理”算法,不会导致空间碎片)
3)可预测的停顿(比CMS更先进的地方在于能让使用者明确指定一个长度为M毫秒的时间片段内,消
耗在垃圾收集上的时间不得超过N毫秒)
4)所谓Garbage-Frist,其实就是优先回收垃圾最多的Region区域
2、Region
将整个Java堆划分为多个 大小相等的独立区域(Region)
个数:2048个
大小:固定一样,数值范围在1M~32M(必须是2的n次幂)
内存:至少 2G 才能启动,一般堆内存至少 6G 才能用到生产环境上
分代:Region集合(新生代和老年代不再是物理隔离)
设置大小:-XX:G1HeapRegionSize=M
如果对象太大,一个Region放不下[超过Region大小的50%],那么就会直接放到H中
二、算法
标记-整理
三、过程(步骤)
1、初始标记(Initial Marking)
标记以下GC Roots能够关联的对象,并且修改TAMS的值,需要暂 停用户线程
2、并发标记(Concurrent Marking)
从GC Roots进行可达性分析,找出存活的对象,与用户线程并发执行
3、最终标记(Final Marking)
修正在并发标记阶段因为用户程序的并发执行导致变动的数据,需暂停用户线程
4、筛选回收(Live Data Counting and Evacuation)
对各个Region的 回收价值和成本进行排序 ,根据用户所期望的GC停顿时间制定回收计划
四、优缺
优点:
1、可以降低停顿时间,通过设置让停顿时间更短
2、可以变相的解决空间碎片
五、注意
1、堆内存要多大才能启动G1?
答案:2G以上
原因:region共2048个,每个region大小1M~32M,所以最小2048M = 2G
2、如何选择合适的垃圾收集器?
答案:官网链接Available Collectors
除非您的应用程序有相当严格的暂停时间要求,否则首先运行应用程序并允许VM选择收集器。
如有必要,调整堆大小以提高性能。
如果性能仍然达不到您的目标,请使用以下准则作为选择收集器的起点。
场景1:内存小于100M
使用 -XX:+UseSerialGC 选择串行采集器
场景2:应用程序在单处理器上运行,并且没有停顿时间要求
1)让VM选择采集器
2)使用 -XX:+UseSerialGC 选择串行采集器
场景3:如果(a)峰值应用程序性能是第一优先级,并且(b)没有暂停时间要求,或者可以接受1秒或更长的暂停
1)让VM选择收集器
2)使用 -XX:+UseParallelGC 选择并行收集器。
场景4:如果响应时间比总吞吐量更重要,并且垃圾收集暂停必须保持在大约1秒以下
选择具有 -XX:+useConMarkSweepGC 或 -XX:+UseG1GC 的并发收集器。