Java教程

jdk18 regionsize变动

本文主要是介绍jdk18 regionsize变动,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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的计算了。

小结

  1. regionsize如果想超过32m,得主动通过参数G1HeapRegionSize设置。
  2. 默认情况下,regionsize的计算只和max_heap_size(xmx)相关。
这篇关于jdk18 regionsize变动的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!