regionsize计算
在jdk18中,放开了g1的regionsize的32m的限制,最大可以设置到512m,我们接下来看看,新版是如何进行调整的。
size_t region_size = G1HeapRegionSize;
// G1HeapRegionSize = 0 means decide ergonomically.
if (region_size == 0) {
region_size = clamp(max_heap_size / HeapRegionBounds::target_number(),
HeapRegionBounds::min_size(),
HeapRegionBounds::max_ergonomics_size());
}
如果G1HeapRegionSize没设置的话,会通过ergonomics计算。
template<typename T>
inline T clamp(T value, T min, T max) {
assert(min <= max, "must be");
return MIN2(MAX2(value, min), max);
}
clamp是一个模板,主要作用是让value的值在min和max之间。
这里的值是通过max_heap_size直接除以HeapRegionBounds::target_number()得来的。
上面提到的几个值,我们都展开看看内容。
static const size_t MIN_REGION_SIZE = 1024 * 1024;
static const size_t MAX_ERGONOMICS_SIZE = 32 * 1024 * 1024;
static const size_t TARGET_REGION_NUMBER = 2048;
HeapRegionBounds::target_number()就是2048。HeapRegionBounds::min_size()是1m,HeapRegionBounds::max_ergonomics_size()是32m。
这里可以看出,如果是走的ergonomics逻辑,regionsize的值还是控制在1m和32m之间。
如果设置了G1HeapRegionSize就不会走上面的逻辑。
// is beneficial in most cases.
region_size = round_up_power_of_2(region_size);
// Now make sure that we don't go over or under our limits.
region_size = clamp(region_size, HeapRegionBounds::min_size(), HeapRegionBounds::max_size());
region_size向上取最接近的2的n次。
然后再进行设置。
static const size_t MAX_REGION_SIZE = 512 * 1024 * 1024;
这次就会用到MAX_REGION_SIZE,512m。
通过上面的源码,我们可以知道如果想突破32m的限制,得自己设置,用默认值的时候,还是会限制到32m之内。
之前看过g1源码的同学还发现,默认值的时候的计算方式不同了。
size_t average_heap_size = (initial_heap_size + max_heap_size) / 2;
region_size = MAX2(average_heap_size / TARGET_REGION_NUMBER, (uintx) MIN_REGION_SIZE);
int region_size_log = log2_long((jlong) region_size)
这是之前的的版本,是会考虑initial_heap_size和max_heap_size的。计算一个平均值,然后除以2048。现在的版本只考虑max_heap_size了。
这个是一个测试的改进优化。详细可以看JDK-8241670。
only considering max heap size when determining region size
rounding up the region size to the nearest power of 2 instead of rounding down
总体优化了上面2点,一个是使用max_heap_size计算,第二个是非2的n次的时候,之前是向下找,现在逻辑改成向上找。
基于这样的优化,后面g1设置xms已经不影响regionsize的计算了。
小结
- regionsize如果想超过32m,得主动通过参数G1HeapRegionSize设置。
- 默认情况下,regionsize的计算只和max_heap_size(xmx)相关。
共同学习,写下你的评论
评论加载中...
作者其他优质文章