jvm调优(1):调优环境工具及如何识别
为方便开发和调优首先要准备win+linux双系统,当然习惯了centos开发环境就不用这么啰嗦了如果是win+centos环境那么你需要工具PieTTY+WinSCP(可要可不要)+VMware Workstation Pro+centos(安装jdk和一个验证jar包)在环境准备好后,你需要了解jvm gc等理论资料,比如https://www.cnblogs.com/Mandylov
为方便开发和调优首先要准备win+linux双系统,当然习惯了centos开发环境就不用这么啰嗦了
如果是win+centos环境那么你需要工具PieTTY+WinSCP(可要可不要)+VMware Workstation Pro+centos(安装jdk和一个验证jar包)
在环境准备好后,你需要了解jvm gc等理论资料,比如https://www.cnblogs.com/Mandylover/p/5208055.html,https://www.cnblogs.com/wrong5566/p/6531832.html
但这远远不够,如果需要专业点,那么必要准备点书籍了解下,比如 深入理解java虚拟机
这里不讲理论,主要是实践,理论方面大家抽时间了解
我们先要了解几个jvm命令。比如jstat jps jstack jinfo jmap jcmd
我们要用jstat命令那么先要了解下jps
比如下面是找到jvm的进程pid,比如5858 就是我们一个应用的进程pid
关于jps命令的详细了解(http://blog.csdn.net/wisgood/article/details/38942449)
[root@k8s-node-1 ~]# jps -l
5858 ace-gate-eureka.jar
6735 sun.tools.jps.Jps
第二步,我们需要查看5858 gc运行情况
参数说明如下:
S0: 新生代中Survivor space 0区已使用空间的百分比
S1: 新生代中Survivor space 1区已使用空间的百分比
E: 新生代已使用空间的百分比
O: 老年代已使用空间的百分比
P: 永久带已使用空间的百分比
YGC: 从应用程序启动到当前,发生Yang GC 的次数
YGCT: 从应用程序启动到当前,Yang GC所用的时间【单位秒】
FGC: 从应用程序启动到当前,发生Full GC的次数
FGCT: 从应用程序启动到当前,Full GC所用的时间
GCT: 从应用程序启动到当前,用于垃圾回收的总时间【单位秒】
对照参数,我们来看问题出在那,如何调优?
再查看下jvm启动参数
jcmd pid VM.flags or jinfo -flagspid or jmap -heap pid
[root@k8s-node-1 ~]# jcmd 5858 VM.flags
5858:
-XX:CICompilerCount=3 -XX:InitialHeapSize=62914560-XX:MaxHeapSize=991952896 -XX:MaxNewSize=330301440 -XX:MinHeapDeltaBytes=524288-XX:NewSize=20971520 -XX:OldSize=41943040 -XX:+UseCompressedClassPointers-XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
参数解读
-XX:CICompilerCount=3 最大并行编译数
-XX:InitialHeapSize=62914560 初始化堆大小
-XX:MaxHeapSize=330301440 最大堆大小
-XX:MaxNewSize=524288 新生代最大大小
-XX:MinHeapDeltaBytes=524288
-XX:NewSize=20971520 设置年轻代的大小
-XX:OldSize=41943040
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:+UseFastUnorderedTimeStamps
-XX:+UseParallelGC 使用 Parallel收集器
------------------------------------------------------------------------------
[root@k8s-node-1 ~]# jinfo -flags 5858
Attaching to process ID 5858, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.131-b11
Non-default VM flags: -XX:CICompilerCount=3-XX:InitialHeapSize=62914560 -XX:MaxHeapSize=991952896 -XX:MaxNewSize=330301440-XX:MinHeapDeltaBytes=524288 -XX:NewSize=20971520 -XX:OldSize=41943040-XX:+UseCompressedClassPointers -XX:+UseCompressedOops-XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line:
------------------------------------------------------------------------------
[root@k8s-node-1~]# jmap -heap 5858
Attaching to process ID 5858, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.131-b11
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize =991952896 (946.0MB)
NewSize = 20971520 (20.0MB)
MaxNewSize =330301440 (315.0MB)
OldSize = 41943040 (40.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104(20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415MB
G1HeapRegionSize = 0 (0.0MB)
堆参数解释:
MinHeapFreeRatio 对应-Xms 初始堆大小 物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制
MaxHeapFreeRatio 对应-Xmx 最大堆大小 物理内存的1/4(<1GB) 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
MaxHeapSize
NewSize -XX:NewSize 设置年轻代大小(for 1.3/1.4)
MaxNewSize -XX:MaxNewSize 年轻代最大值(for 1.3/1.4)
NewRatio -XX:NewRatio 年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代) -XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。
SurvivorRatio -XX:SurvivorRatio Eden区与Survivor区的大小比值 设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
MetaspaceSize
CompressedClassSpaceSize
MaxMetaspaceSize
G1HeapRegionSize
Heap Usage:
PS Young Generation
Eden Space:
capacity =309329920 (295.0MB)
used = 178062072 (169.81322479248047MB)
free = 131267848 (125.18677520751953MB)
57.56380501440016% used
From Space:
capacity =10485760 (10.0MB)
used = 10454472 (9.970161437988281MB)
free = 31288 (0.02983856201171875MB)
99.70161437988281% used
To Space:
capacity =10485760 (10.0MB)
used = 0 (0.0MB)
free = 10485760 (10.0MB)
0.0% used
PS Old Generation
capacity =60293120 (57.5MB)
used = 29636592 (28.263656616210938MB)
free = 30656528 (29.236343383789062MB)
49.15418541949728% used
22294 interned Strings occupying 2846224 bytes.
You have new mail in /var/spool/mail/root
调优参考:
JVM调优(最关键参数为:-Xms -Xmx-Xmn -XX:SurvivorRatio -XX:MaxTenuringThreshold)
代大小调优:避免新生代大小设置过小、避免新生代大小设置过大、避免Survivor设置过小或过大、合理设置新生代存活周期。
-Xmn 调整新生代大小,新生代越大通常也意味着更多对象会在minor GC阶段被回收,但可能有可能造成旧生代大小,造成频繁触发Full GC,甚至是OutOfMemoryError。
-XX:SurvivorRatio调整Eden区与Survivor区的大小,Eden 区越大通常也意味着minorGC发生频率越低,但可能有可能造成Survivor区太小,导致对象minor GC后就直接进入旧生代,从而更频繁触发Full GC。
GC策略的调优:CMS GC多数动作是和应用并发进行的,确实可以减小GC动作给应用造成的暂停时间。对于Web应用非常需要一个对应用造成暂停时间短的GC,再加上Web应用的瓶颈都不在CPU上,在G1还不够成熟的情况下,CMS GC是不错的选择。
(如果系统不是CPU密集型,且从新生代进入旧生代的大部分对象是可以回收的,那么采用CMS GC可以更好地在旧生代满之前完成对象的回收,更大程度降低Full GC发生的可能)
在调整了内存管理方面的参数后应通过-XX:PrintGCDetails、-XX:+PrintGCTimeStamps、 -XX:+PrintGCApplicationStoppedTime以及jstat或visualvm等方式观察调整后的GC状况。
出内存管理以外的其他方面的调优参数:-XX:CompileThreshold、-XX:+UseFastAccessorMethods、-XX:+UseBaiasedLocking。
参考
https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
http://blog.csdn.net/yang_net/article/details/5830820
更多推荐
所有评论(0)