JVM快速调优手册之四: 堆内存分配的CMS公式解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM快速调优手册之四: 堆内存分配的CMS公式解析相关的知识,希望对你有一定的参考价值。

JVM 堆内存组成

Java堆由Perm区和Heap区组成,Heap区由Old区和New区(也叫Young区)组成,New区由Eden区、From区和To区(Survivor)组成。

技术图片

Eden区用于存放新生成的对象。Eden中的对象生命不会超过一次Minor GC。Survivor Space 有两个,存放每次垃圾回收后存活的对象,即图的S0和S1。Old Generation Old区,也称老生代,主要存放应用程序中生命周期长的存活对象

公式

将EDEN与From survivor中的存活对象存入To survivor区时,To survivor区的空间不足,再次晋升到old gen区,而old gen区内存也不够的情况下产生了promontion faild从而导致full gc.那可以推断出:

eden+from survivor < old gen区剩余内存时,不会出现promontion faild的情况。

即:

(Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction/100)>=(Xmn-Xmn/(SurvivorRatior+2))

进而推断出:

CMSInitiatingOccupancyFraction <= ((Xmx-Xmn)-(Xmn-Xmn/(SurvivorRatior+2)))/(Xmx-Xmn)*100

参数 含义
Xmx-Xmn Old区大小
CMSInitiatingOccupancyFraction/100 Old区百分之多少时,cms开始gc
1-CMSInitiatingOccupancyFraction/100 Old区开始gc回收时剩余空间百分比
(Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction/100) Old区开始gc回收时剩余空间大小
(Xmn-Xmn/(SurvivorRatior+2)) eden+from survivor区的大小

参数

参数 含义
-Xmx java heap最大值。建议均设为物理内存的80%。不可超过物理内存
-Xmn java heap最小值,一般设置为Xmx的3、4分之一,等同于-XX:NewSize 和 -XX:MaxNewSize ,其实为young区大小
-XX CMSInitiatingOccupancyFraction=70 :使用cms作为垃圾回收使用70%后开始CMS收集
-XX SurvivorRatio=2: 生还者池的大小,默认是2

以上是关于JVM快速调优手册之四: 堆内存分配的CMS公式解析的主要内容,如果未能解决你的问题,请参考以下文章

JVM快速调优手册之一: 内存结构(堆内存和非堆内存)

JVM快速调优手册之五: ParNew收集器+CMS收集器的产品案例分析(响应时间优先)

堆内存动态分配情况和jvm调优方向

JVM内存分配调优

JVM调优—GC调优

《JVM调优实战-理论篇》