JVM内存分区介绍

介绍

分区(Heap Region, HR)或称为堆分区, 是G1堆和操作系统交互的最小管理单位

设置方式

  1. 通过G1HeapRegionSize指定,默认值0
  2. 如果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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容