JVM Garbage First(G1) 垃圾收集器 性能调优与实践

GC(垃圾收集)瞬时和累计详情
FullGC次数
YoungGC次数
FullGC耗时
YoungGC耗时
堆内存详情
堆内存总和
堆内存老年代字节数
堆内存年轻代Survivor区字节数
堆内存年轻代Eden区字节数
非堆内存
非堆内存提交字节数
非堆内存初始字节数
非堆内存最大字节数
元空间
元空间字节数
直接缓冲区
DirectBuffer总大小(字节)
DirectBuffer使用大小(字节)

 

JVM线程数
线程总数量
死锁线程数量
新建线程数量
阻塞线程数量
可运行线程数量
终结线程数量
限时等待线程数量
等待中线程数量

 

 

 

 

 

 

 

 

-Xms100M和-XX:InitialHeapSize=100M都是设置堆的初始化大小值为100M

-Xmx100M和-XX:MaxHeapSize=100M都是设置堆的最大值为100M

 

Heap Size动态调整相关参数

设置Xmx和Xms不一样的时候,就表示堆里的新生代和老生代的可用内存都是存在不断变化的
MinHeapFreeRatio和MaxHeapFreeRatio都是一个百分比,所以范围是0~100

MinHeapFreeRatio和MaxHeapFreeRatio在不同的GC算法里,它作用的范围不一样,比如G1作用于整个Heap,而SerialGC/Paralle GC/CMS GC作用在老生代

 

-Xminf0.4等价于 -XX:MinHeapFreeRatio=40 默认0.4

-Xmaxf0.7等价于 -XX:MaxHeapFreeRatio=70 默认0.7

 

MinHeapDeltaBytes表示当我们要扩容或者缩容的时候,决定是否要做或者尝试扩容的时候最小扩多少

-XX:MinHeapDeltaBytes=512m 默认为(512m)

 

New Size相关参数

NewSize:新生代有效内存的初始化大小,也是有效内存的最小值;

MaxNewSize:新生代有效内存的最大值

Xmn:等价于同时设置了NewSize和MaxNewSize,并且值都相等

例如 -Xmn128M,等同于-XX:NewSize=128M -XX:MaxNewSize=128M

NewRatio:本意表示当前老生代可用内存/当前新生代可用内存的比值,默认是2;如果新生代被回收后,其有效内存进行调整的话,会根据此老生代的有效内存和NewRatio条件计算出新生代有效内存的变化值来进行扩容或者缩容。

G1 GC下不建议设置新生代这些参数,尽量自适应,GC效率会更高,这也是官方推荐的

 

Eden/Survivor Size 相关参数

新生代由Eden和两块Survivor组成,这两块Survivor通常一个叫做From Space,一个叫做To Space,并且两个大小一致,每次GC发生的时候会将Eden和From Space里的对象往To Space里拷贝,或者晋升到Old。GC完成之后正常情况下是Eden为空的,并且会对换下的From Space和To Space的位置,对换完之后的To Space又为空了。

SurvivorRatio:表示Eden/一个Survivor的比例,默认是8,最小值1

CMS GC下如果MaxTenuringThreshold(多少次GC晋升到老年代中)设置为0,相当于每次GC都直接晋升到老年代,如果SurvivorRatio没有设置的话,会将默认值设置为1024

InitialSurvivorRatio:表示新生代初始可用内存/survivor的比例,默认情况下为8,那表示From和To各自占整个新生代的1/8,而Eden占3/4,并且只在启动的时候有用

MinSurvivorRatio:表示在GC之后,如果需要重新计算survivor的值,survivor的新值不能低于根据它计算出来的值。

 

1.InitialSurvivorRatio不能比3小,至少是3,否则会被JVM自动调整为3,MinSurvivorRatio也是一样的

2.如果我们JVM参数里设置过SurvivorRatio,但是没有设置IntitalSurvivorRatio,那么IntitalSurvivorRatio的值会被默认设置为SurvivorRatio+2,MinSurvivorRatio也是一样

Perm Size相关参数

Perm非堆内存

PermSize表示Perm内存初始值大小,也是最小值,

MaxPermSize表示Perm内存的最大值,

也就是说Perm空间的可用内存大小会在permSize和MaxPermSize之间动态变化

如果PermSize比MaxPermSize大,那么会将MaxPermSize设置为PermSize,

PermSize按照64K对齐,而MaxPermSize按照2M对齐

class对象默认情况下是存在Heap里,如果我们设置了 -XX:+UnlockDiagnosticVMOptions -XX:+JavaObjectsInPerm这两个参数,那将分配在Perm里

 

 

 

 

1.G1原理简述

Garbage-First(G1):与CMD相比,G1是一种内存整理过程的、有线手机存货对象最少的区域的、面向年轻代和老年代的、物理空间不必连续的垃圾收集器。

 

Region:整个堆空间被尽可能地划分为约2048个Region(单个Region大小为1~32MB),每个Region都可以使Eden/Survivor/Old区的任意一个。

 

Remembered Sets(RSets):每个Region对应一个RSet,用来跟踪指向该区域的对象引用,避免全堆扫描

 

Collection Sets(CSets):CSets是一次GC中将被回收的Region集合,GC时所有CSet区域中的存货对象都会被移动到新的区域。

 

Humongous Object: 超过Region大小一半的对象称为巨型对象,会在创建时直接被分配到Old Region中。

 

 

 

 

 

2.工作模式 

Young GC:

Young区由一系列不连续的Region组成,因此可以很容易在GC过程中扩/缩容

Young GC会将存活对象转移到Survivor和老年代

Young GC会计算Eden区和Survivor区在下次回收之前所需的空间,然后动态调整新生代

 

上一篇:Garbage First收集器


下一篇:[ToneTuneToolkit][000]Template