JVM调优实战分析
一、查看服务器项目JVM参数以及参数分析
1、jps 命令 : 列出系统中所有的 Java 应用程序以及PID
如下图所示,26647就是我部署在服务器的一个小项目的 PID
2、jmap命令:查看堆的使用情况
如下所示,数据为未调整的默认值
[root@VM_49_159_centos ~]# jmap -heap 26647
Attaching to process ID 26647, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.162-b12
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration: (堆的结构配置)
MinHeapFreeRatio = 40 ( 空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制. )
MaxHeapFreeRatio = 70 ( 空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制. )
MaxHeapSize = 482344960 (460.0MB) (堆的最大值)
NewSize = 10485760 (10.0MB) (初始年轻代大小)
MaxNewSize = 160759808 (153.3125MB) (年轻代最大值)
OldSize = 20971520 (20.0MB) (初始年老代大小)
NewRatio = 2 (年老代 :年轻代 默认是 2:1)
SurvivorRatio = 8 ( Survivor区分为from和to两个部分,各占一半,年轻代另外一个区是Eden区,Eden:from 默认为8:1)
MetaspaceSize = 21807104 (20.796875MB) ( 表示metaspace首次使用不够而触发FGC的阈值 ,JDK8之后废除永久代,采用元空间)
CompressedClassSpaceSize = 1073741824 (1024.0MB) (压缩类空间,出现java.lang.OutOfMemoryError: Compressed class space可以调大该值)
MaxMetaspaceSize = 17592186044415 MB ( metaspace区域的最大值 )
G1HeapRegionSize = 0 (0.0MB) ( G1垃圾收集器 Garbage-First Garbage Collector 的region大小)
Heap Usage: (堆的使用率)
New Generation (Eden + 1 Survivor Space): 年轻代中 Eden区+From区
capacity = 11075584 (10.5625MB) 容量
used = 1421240 (1.3554000854492188MB) 已使用
free = 9654344 (9.207099914550781MB) 剩余
12.832190158099113% used 使用占比
Eden Space: 年轻代中 Eden区
capacity = 9895936 (9.4375MB)
used = 1410936 (1.3455734252929688MB)
free = 8485000 (8.091926574707031MB)
14.257731658733444% used
From Space: 年轻代中Sruvivor的From区
capacity = 1179648 (1.125MB)
used = 10304 (0.00982666015625MB)
free = 1169344 (1.11517333984375MB)
0.8734809027777778% used
To Space: 年轻代中Sruvivor的To区
capacity = 1179648 (1.125MB)
used = 0 (0.0MB)
free = 1179648 (1.125MB)
0.0% used
tenured generation: 年老代
capacity = 24395776 (23.265625MB)
used = 22119176 (21.09449005126953MB)
free = 2276600 (2.1711349487304688MB)
90.66805663406649% used
20026 interned Strings occupying 1919776 bytes.
二、堆内存的简单分析和年轻代分区及GC算法
1、堆内存的简单分析
由于JDK8之后真正废除了永久代,所以堆的主要组成就是 年轻代和年老代了
年轻代又分为 Eden和Survivor区,默认大小是 8:2 ,因为Survivor由两个同等大小的From区和To区组成
为什么Survivor区要分成两个同等大小的呢,这个就关系到年轻代的GC算法----“复制算法”了
2、复制算法简单描述
年轻代的GC算法主要采用复制算法,首先GC开始前,To区是空的。
然后GC开始时,无引用的对象会被回收(目前常用可达性分析算法判断是否存活),存活的会被复制到To区
From区的对象每经过一次MinorGC都会年龄增加一岁,达到阈值的会被复制到年老代中
(阈值可通过 -XX:MaxTenuringThreshold 设置)
没达到阈值的会被复制到To区,经过这次GC后,Eden区和From区就被清空了
接着From区和To区互换角色,继续等待下一次GC
未完待续.....
以上是 JVM调优实战分析 的全部内容, 来源链接: utcz.com/z/514848.html