为了账号安全,请及时绑定邮箱和手机立即绑定

jdk18 regionsize变动

标签:
Java

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)相关。
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
1.6万
获赞与收藏
380

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消