其他分享
首页 > 其他分享> > JVM Garbage First(G1) 垃圾收集器 性能调优与实践

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,G1,收集器,Region,Survivor,Eden,XX,GC,内存
来源: https://www.cnblogs.com/XMXS/p/15100347.html