为方便开发和调优首先要准备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




Logo

更多推荐