调优思路
JVM是Java Virtual Machine(Java虚拟机)的缩写,Java代码在不同平台上运行时不需要重新编译,Java语言使用JVM屏蔽了与具体平台相关的硬件指令差异,使得Java语言编译程序只需生成在JVM上运行的字节码,实现在多种平台上不加修改地运行。JVM包括即时编译(JIT)、内存管理(垃圾回收GC技术)和Runtime技术,其中GC调优是性能调优中应用最为广泛。本章调优思路主要针对GC展开说明:
首先优选尽可能高的JDK版本,高版本有更新的特性和优化,对Java程序性能有好处;
其次根据实际业务场景和硬件资源给JVM选择合理的堆空间;
最后要选择合理的GC算法。
同时,Java自带很多工具,对程序运行的检测和性能分析都很有帮助,利用这些工具可以辅助Java性能调优。
主要优化参数
优化项
优化项简介
默认值
生效范围
鲲鹏916
鲲鹏920
-Xmx
设置JVM最大可用堆内存大小。
根据系统资源计算默认值
Java进程重启生效 YY
-Xms
设置初始堆大小,一般和Xmx保持一致。
根据系统资源计算默认值
Java进程重启生效 YY
-Xmn
设置年轻代堆大小。
根据系统资源计算默认值
Java进程重启生效 YY
-Xss
设置每个线程的堆大小。
JDK 1.5以后每个线程堆栈大小默认为1MB,1.5以前为256KB。
Java进程重启生效 YY
二、
介绍
jstat是JDK自带的一个JVM统计监控工具,利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括堆大小和应用程序GC状况的监控。
安装方式
完整安装JDK后自带jstat工具,无需单独安装,一般位于Java的bin目录下。
使用方式
jstat是个非常强大的命令,可选项多,可以详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程pid和所选参数。
命令格式:jstat [参数]
一级参数主要功能如下:
参数
说明
jstat -class
显示加载class的数量,及所占空间等信息。
jstat -compiler
显示虚拟机实时编译的数量等信息。
jstat -gc
显示GC的信息,查看GC的次数及时间。
jstat -gccapacity
显示虚拟机内存中三代对象的使用和占用大小。
jstat -gcutil
显示GC的统计信息。
jstat -gcnew
显示年轻代对象的信息。
jstat -gcnewcapacity
显示年轻代对象信息及其内存占用情况。
jstat -gcold
显示老年代对象的信息。
jstat -gcpermcapacity
显示永久代对象的信息及其占用量。
jstat -printcompilation
显示当前虚拟机的执行信息。
GC优化中,利用jstat -gc 较多,其输出参数及含义如下:
参数
说明
S0C
年轻代中第一个survivor区的容量(字节)
S1C
年轻代中第二个survivor区的容量(字节)
S0U
年轻代中第一个survivor区目前已使用空间(字节)
S1U
年轻代中第二个survivor区目前已使用空间(字节)
EC
年轻代中Eden区的容量 (字节)
EU
年轻代中Eden区目前已使用空间(字节)
OC
老年代的容量(字节)
OU
老年代目前已使用空间(字节)
PC
Perm(永久代)的容量(字节)
PU
Perm(永久代)目前已使用空间(字节)
YGC
从应用程序启动到采样时年轻代中gc次数
YGCT
从应用程序启动到采样时年轻代中gc所用时间(s)
FGC
从应用程序启动到采样时老年代(全gc)gc次数
FGCT
从应用程序启动到采样时老年代(全gc)gc所用时间(s)
GCT
从应用程序启动到采样时gc用的总时间(s)
输出格式:
jstat -gc 2342
sh-4.4# jstat -gc 159 1000
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
6144.0 13824.0 6128.8 0.0 702464.0 590176.1 497664.0 468611.6 139032.0 131745.2 15664.0 14404.5 151478 1673.004 1057 34
三、
介绍
jmap是JDK自带的堆信息查看和调试工具,可以将堆信息导出到文件分析,可以查看堆空间分配等信息,是Java性能调优常用工具之一。
安装方式
完整安装JDK后自带jmap工具,无需单独安装,一般位于Java的bin目录下。
使用方式
命令格式:jmap [参数]
常用参数如下:
参数
说明
举例
-dump:[live,]format=b,file=/you/path/filename.hprof
输出JVM的堆对象内容到指定文件。推荐以.hprof后缀命名文件,可以用MAT工具直接分析。 live选项是可选的,如果选live,那么只输出活的对象到文件。
jmap -dump:format=b,file=/opt/log/java12123.hprof 12123
-finalizerinfo
输出正等候回收的对象的信息。
jmap -finalizerinfo 12123
-heap
输出当前Java进程堆的概要统计信息,如GC算法,heap的配置空间等。
jmap -heap 12123
-histo[:live]
输出当前class的实例数目、内存占用、类全名信息。
jmap -histo:live 12123 | head -n 20
-permstat
打印classload和jvm heap中perm代的信息,包含每个classloader的名字、活泼性、地址、父classloader和加载的class数量等信息。
jmap -permstat 12123
jmap -heap 举例说明:
using parallel threads in the new generation. ##新生代采用的是并行线程处理方式
using thread-local object allocation.
Concurrent Mark-Sweep GC ##同步并行垃圾回收
Heap Configuration: ##堆配置情况
MinHeapFreeRatio = 40 ##最小堆使用比例
MaxHeapFreeRatio = 70 ##最大堆可用比例
MaxHeapSize = 2147483648 (2048.0MB) ##最大堆空间大小
NewSize = 268435456 (256.0MB) ##新生代分配大小
MaxNewSize = 268435456 (256.0MB) ##最大新生代可分配大小
OldSize = 5439488 (5.1875MB) ##老年代大小
NewRatio = 2 ##新生代比例
SurvivorRatio = 8 ##新生代与survivor的比例
PermSize = 134217728 (128.0MB) ##perm区大小
MaxPermSize = 134217728 (128.0MB) ##最大可分配perm区大小
Heap Usage: ##堆使用情况
New Generation (Eden + 1 Survivor Space): ##新生代(Eden区 + survivor空间)
capacity = 241631232 (230.4375MB) ##Eden区容量
used = 77776272 (74.17323303222656MB) ##已经使用大小
free = 163854960 (156.26426696777344MB) ##剩余容量
32.188004570534986% used ##使用比例
Eden Space: ##Eden区
capacity = 214827008 (204.875MB) ##Eden区容量
used = 74442288 (70.99369812011719MB) ##Eden区使用
free = 140384720 (133.8813018798828MB) ##Eden区当前剩余容量
34.65220164496263% used ##Eden区使用情况
From Space: ##survivor1区
capacity = 26804224 (25.5625MB) ##survivor1区容量
used = 3333984 (3.179534912109375MB) ##survivor1区已使用情况
free = 23470240 (22.382965087890625MB) ##survivor1区剩余容量
12.43827838477995% used ##survivor1区使用比例
To Space: ##survivor2 区
capacity = 26804224 (25.5625MB) ##survivor2区容量
used = 0 (0.0MB) ##survivor2区已使用情况
free = 26804224 (25.5625MB) ##survivor2区剩余容量
0.0% used ## survivor2区使用比例
concurrent mark-sweep generation: ##老年代使用情况
capacity = 1879048192 (1792.0MB) ##老年代容量
used = 30847928 (29.41887664794922MB) ##老年代已使用容量
free = 1848200264 (1762.5811233520508MB) ##老年代剩余容量
1.6416783843721663% used ##老年代使用比例
Perm Generation: ##perm区使用情况
capacity = 134217728 (128.0MB) ##perm区容量
used = 47303016 (45.111671447753906MB) ##perm区已使用容量
free = 86914712 (82.8883285522461MB) ##perm区剩余容量
35.24349331855774% used ##perm区使用比例