说明:JDK7和JDK8的Region划分实现略有不同(差异非常小,且只有-Xmx和-Xms的值不一样才有区别),本篇文章讲解的是JDK8中Region的划分实现;如果要了解JDK7的Region划分实现,请参考JDK7 headpRegion.cpp

源码分析

G1 Region划分的实现源码在headpRegion.cpp中,摘取部分核心源码如下:

源码解读:

MIN_REGION_SIZE:允许的最小的REGION_SIZE,即1M,不可能比1M还小;

MAX_REGION_SIZE:允许的最大的REGION_SIZE,即32M,不可能比32M更大;限制最大REGION_SIZE是为了考虑GC时的清理效果;

TARGET_REGION_NUMBER:JVM对堆期望划分的REGION数量,而不是实际划分的REGION数量;

计算演示

1、 验证下面这段源码,即如果配置了XX:G1HeapRegionSize,那么以配置为准;否则以计算为准:

这是JDK7和JDK8关于REGION_SIZE计算唯一的区别,事实上当Xmx和Xms的值不一样时,JVM不太好自动计算region_size,JDK7的注释进一步的解释了,且建议某些-Xms/-Xmx组合情况下,用户自己设置REGION_SIZE

计算为准

假设配置JVM参数-Xmx6144m -Xms2048m,那么计算过程如下:

average_heap_size=(6144m+2048m)/2=4096m

region_size=max(4096m/2048, 1m)=2m

region_size_log=21(因为2^21=2*1024*1024<=2m)

region_size=2^21=2m(保证region_size的值为2^n)

region_size=2m(因为MIN_REGION_SIZE<=2m<=MAX_REGION_SIZE)

配置为准

假设配置JVM参数-Xmx1024m -Xms1024m -XX:G1HeapRegionSize=4m,那么计算过程如下:

region_size=4m

region_size_log=22(因为2^22<=4m)

region_size=2^22=4m

region_size=4m(因为MIN_REGION_SIZE<=1m<=MAX_REGION_SIZE)

2、 验证下面这段源码,即region_size的值一定是2^n:

假设配置JVM参数-Xmx3072m -Xms3072m,那么计算过程如下:

average_heap_size=(3072m+3072m)/2=3072m

region_size=max(3072m/2048, 1m)=1.5*1024*1024

region_size_log=20(因为2^20<1.5*1024*1024<2^21)

region_size=2^20=1m(保证region_size的值为2^n)

region_size=1m(因为MIN_REGION_SIZE<=1m<=MAX_REGION_SIZE)

3、 验证下面这段源码,即region_size的值一定是在[MIN_REGION_SIZE, MAX_REGION_SIZE]这个范围:

假设配置JVM参数-Xmx1024m -Xms1024m -XX:G1HeapRegionSize=64m,那么计算过程如下:

region_size=64m

region_size_log=26(因为2^26<=64m)

region_size=2^26=64m

region_size=32m(因为region_size必须在[MIN_REGION_SIZE, MAX_REGION_SIZE]之间)

REGION_SIZE总结

通过上面的分析可知G1垃圾回收时JVM分配REGION的SIZE有如下要求:

1、如果配置了-XX:G1HeapRegionSize,那么先以配置的值为准;否则以计算为准;

2、根据第一步计算得到的REGION_SIZE,取不能大于它的最大的2^n的值为第二步计算得到的REGION_SIZE的值

3、把第二步计算得到的REGION_SIZE和MIN_REGION_SIZE比较,如果比MIN_REGION_SIZE还小,那么MIN_REGION_SIZE就是最终的region_size;否则再把REGION_SIZE和MAX_REGION_SIZE比较,如果比MAX_REGION_SIZE还大,那么MAX_REGION_SIZE就是最终的region_size;如果REGION_SIZE在[MIN_REGION_SIZE, MAX_REGION_SIZE]之间,那么REGIOIN_SIZE就是最终的region_size;

验证方式

通过下面这段源码配置JVM参数即可验证JDK8 G1中REGION_SIZE的计算方式:

JVM参数:java -XX:+UseG1GC -verbose:gc {HEAP_OPTS} -XX:+PrintHeapAtGC StringTest,其中{HEAP_OPTS}由上面计算演示过程中提供的JVM参数取代即可,例如:java -XX:+UseG1GC -verbose:gc -Xmx6144m -Xms2048m -XX:+PrintHeapAtGC StringTest,GC日志如下,从GC日志中可以看出region size为2048k:

作者:阿飞的博客

来源:https://www.jianshu.com/p/abafbb965fff

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Java极客技术学习」https://www.javajike.com

java g1 配置_G1之REGION SIZE相关推荐

  1. G1垃圾回收器REGION SIZE说明

    说明:JDK7和JDK8的Region划分实现略有不同(差异非常小,且只有-Xmx和-Xms的值不一样才有区别),本篇文章讲解的是JDK8中Region的划分实现:如果要了解JDK7的Region划分 ...

  2. java g1的并行_「g1」JVM G1详解 - seo实验室

    g1 当我们调优java程序时,通常的目标有两个: 响应能力 或者 吞吐量 响应能力 响应能力指一个程序或者系统对请求的是否能够及时响应. 比如: 一个桌面UI能多快的响应一个事件: 一个网站能够多快 ...

  3. java G1垃圾收集器

    Garbage-First(后文简称G1)收集器是当今收集器技术发展的最前沿成果,在Sun公司给出的JDK RoadMap里面,它被视作JDK 7的HotSpot VM 的一项重要进化特征.从JDK ...

  4. 可能是最全面的 Java G1学习笔记

    转载自 可能是最全面的 Java G1学习笔记 引子 最近遇到很多朋友过来咨询G1调优的问题,我自己去年有专门学过一次G1,但是当时只是看了个皮毛,因此自己也有不少问题.总体来讲,对于G1我有几个疑惑 ...

  5. java g1 gc ref proc_深入理解垃圾收集器的G1及日志分析

    尽管Hotspot 最新的垃圾回收器G1是在2006年推出的.但是G1从推行至今的市场反响来看,但现在足以证明这款垃圾收集器是经得起考验的,从java9开始,就默认为G1垃圾收集器.G1是一款面向服务 ...

  6. java neo4j配置_Neo4j教程 - 3 详解 Neo4j 核心配置

    Neo4j的配置文件位于/conf/neo4j.conf文件内,关于每个配置,neo4j都有其对应的英文解释,这里不对里面的内容进行一一解释,仅挑选一些核心重要的内容进行说明. 1. 数据安装目录 d ...

  7. java ftp定时上传_ftp自动删除,ftp自动删除文件、定时上传文件的方式及java环境配置...

    IIS7服务器管理工具具备所有服务器管理工具的功能,比如批量管理.同时它还有很多的自主研发功能.比如同步操作.到期提醒.数据安全和定期执行.当然适用的系统也有Windows和liunx操作系统.还支持 ...

  8. Java框架JSON-RPC项目demo代码实战 + JAVA WEB配置虚拟目录(转自21天java web开发)

    Java框架JSON-RPC项目demo代码实战 备注  JAVA WEB配置虚拟目录(转自21天java web开发) https://blog.csdn.net/wjxbj/article/det ...

  9. idea配置jfinal_intellij idea安装与配置(Java开发配置篇)

    一.maven配置 在configure->settings的搜索框中输入maven,然后入下图所示,修改maven主目录.maven配置文件.maven本地仓库地址 二.SVN设置 在搜索框中 ...

最新文章

  1. android monkey原理_Monkey与Appium的使用
  2. 电脑课装b专用代码_FANUC伺服电机代码表(完整版)
  3. 爬虫 spider09——爬取指定数据,去重复,并存储到mysql
  4. nodejs安装express框架
  5. 2019-03-18-算法-进化(删除链表的倒数第N个节点)
  6. Matlab各种最值问题
  7. amd 安装 linux驱动怎么安装教程,请教,怎么在ubuntu里安装amd显卡驱动
  8. IP地址的分类——a,b,c 类是如何划分的
  9. 【java机器学习】支持向量机之拉格朗日乘子法解释
  10. 信息安全技术网络安全等级保护定级指南_行业标准 |报业网络安全等级保护定级参考指南V2.0发布,明确保护对象、定级要求...
  11. 飞鸽传书 的内置的计算机处理
  12. amd服务器有什么优势,服务器市场才是AMD真正想要发挥作用的地方
  13. 自如回应南京租客事件:未对该房源进行过装修 配置的家具符合规定
  14. 几行Python代码打造自己的磁盘垃圾文件清理器
  15. 随想录(以师带徒的原则)
  16. Exchange Server 2016 之三:邮箱角色部署
  17. 股票群的骗术 ,几乎99%的QQ群
  18. 【opencv】 报错:C2065 “CV_COVAR_ROWS”、“CV_COVAR_NORMAL”、“CV_COVAR_SCALE”: 未声明的标识符、
  19. linux 运行魂斗罗,如何在linux/freebsd下玩模拟器游戏_linux教程
  20. Python的函数使用

热门文章

  1. 【GPS】进入adb shell用garden_app查看已搜到卫星
  2. linux mplayer rpm,CentOS 6.5 安装 Mplayer!
  3. (转)Unity 3D中的无限大地形的生成和调度
  4. 为什么推荐 Java 开发人员都学习并使用 Kotlin?
  5. react无缝滚动_react 实现一个无限循环的轮播器 附github地址
  6. 赶鸭子的c语言编程,[c语言]赶鸭子上架之QT中delete[]指针出现触发断点的原因是啥???帮忙看下...
  7. iOS 仿 UC 浏览器个人中心 (下拉实现果冻效果)
  8. 我工作三年了,该懂并发了!
  9. 苍之涛 俄罗斯方块教程
  10. 鸿蒙系统的软件怎么下载,鸿蒙系统app软件下载-鸿蒙系统官方最新版-幻想游戏网...