介绍
分区(Heap Region, HR)或称为堆分区, 是G1堆和操作系统交互的最小管理单位
设置方式
- 通过G1HeapRegionSize指定,默认值0
- 如果G1HeapRegionSize=0,那么G1启发式地推断HR大小
如何推断
初始值: -Xms(-XX:InitialHeapSize), 默认0
最大值: -Xmx(-XX:MaxHeapSize), 默认96M
期望的分区个数: TARGET_REGION_NUMBER, 默认2048个
# heapRegionBounds.hpp
static const size_t MIN_REGION_SIZE = 1024 * 1024;
static const size_t MAX_REGION_SIZE = 32 * 1024 * 1024;
static const size_t TARGET_REGION_NUMBER = 2048;
HR的大小影响分配和回收的效率,HR过大则回收消费的时间长,HR过小则导致对象内存分配较慢且内存利用率较低。
HR大小上下限定义在heapRegionBounds中,最小1MB,最大32MB。HR的size必须是2的幂次,即仅可为1MB、2MB、4MB、8MB、16MB、32MB。
计算初试值和最大值的平均值,再除以TARGET_REGION_NUMBER,跟MIN_REGION_SIZE一起取较大的那个
化成2的幂次,如果小于MIN_REGION_SIZE则取MIN_REGION_SIZE,大于MAX_REGION_SIZE则取MAX_REGION_SIZE
这样计算出了分区大小
再用初始值➗分区大小,得到最小分区个数
用MaxHeapSize➗分区大小,得到最大分区个数,分区个数在这个区间内动态调整
InitialHeapSize和MaxHeapSize的自动设置
在服务器和容器中都好使
jdk8版本大于等于191
总内存: 主机或容器的总内存
-XX:InitialRAMPercentage*
设置InitialHeapSize占总内存的百分比, 默认值1.5625
-XX:MinRAMPercentage
总内存小于200M时,设置MaxHeapSize占总内存的百分比, 默认值50
-XX:MaxRAMPercentage
总内存大于200M时,设置MaxHeapSize占总内存的百分比, 默认值25