HR的大小影响分配和回收的效率,HR过大则回收消费的时间长,HR过小则导致对象内存分配较慢且内存利用率较低。
HR大小上下限定义在heapRegionBounds中,最小1MB,最大32MB。HR的size必须是2的幂次,即仅可为1MB、2MB、4MB、8MB、16MB、32MB。
JVM参数-XX:G1HeapRegionSize可以指定HR size,如果未指定,JVM根据实际情况动态决定。
HR数量默认为2048。
计算HR size的逻辑主要在setup_heap_region_size函数中
计算初始堆内存和最大堆内存的平均值average_heap_size
取HR size下限(1MB)和average_heap_size / 2048的最大值,赋值给region_size
region_size按2的幂次对齐
根据region_size计算卡表的大小
新生代大小的计算逻辑主要在g1YoungGenSizer中
根据JVM参数-XX:G1NewSizePercent和-XX:G1MaxNewSizePercent计算新生代最小和最大的HR数量
4. 总结
HR是G1堆内存管理的核心模型,标记、回收、晋升、疏散、卡表、RSet等G1关键逻辑都围绕HR进行。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
空间分配
当开发者使用JAVA语言实例化一个对象时,排除JIT的标量替换等优化手段,该对象会在JAVA Heap上分配存储空间。
分配空间时,为了提高JVM的运行效率,应当尽量减少临界区范围,避免全局锁。G1的通常的应用场景中,会存在大量的Mutator同时执行,为减少锁冲突,引入了TLAB(线程本地分配缓冲区 Thread Local Allocation Buffer)机制。
G1支持基于T