GC 日志分析
首先,如果需要查看 GC 日志,需要在 jvm 参数中加入如下参数
-XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:d:/GClogs/tomcat6-gc.log
GC 日志
2016-11-23T11:01:27.738+0800: 0.150: [GC [PSYoungGen: 331K->288K(5952K)] 331K->288K(19648K), 0.0006495 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2016-11-23T11:01:27.739+0800: 0.152: [Full GC (System) [PSYoungGen: 288K->0K(5952K)] [PSOldGen: 0K->164K(13696K)] 288K->164K(19648K) [PSPermGen: 3054K->3054K(21248K)], 0.0059625 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 2016-11-23T11:01:27.852+0800: 0.264: [GC [PSYoungGen: 103K->64K(5952K)] 267K->228K(19648K), 0.0066830 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 2016-11-23T11:01:27.859+0800: 0.271: [Full GC (System) [PSYoungGen: 64K->0K(5952K)] [PSOldGen: 164K->165K(13696K)] 228K->165K(19648K) [PSPermGen: 3060K->3060K(21248K)], 0.0052429 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
Young GC 日志
Full GC 日志分析
JVM 参数设置
jvm 参数对应堆内存设置
比例设置
JVM 相关参数说明
堆分配参数
-Xmn10M:设置新生代区域大小为10M -XX:NewSize=2M:设置新生代初始大小为2M -XX:MaxNewSize=2M:设置新生代最大值为2M (如果以上三个同时设置了,谁在后面谁生效。生产环境使用-Xmn即可,避免抖动) -Xms128M:设置java程序启动时堆内存128M(默认为物理内存1/64,且小于1G) -Xmx256M:设置最大堆内存256M,超出后会出现 OutOfMemoryError(默认为物理内存1/64,且小于1G) (生产环境 -Xms 与 -Xmx 最好一样,避免抖动) -Xss1M:设置线程栈的大小 1M(默认1M) -XX:ThreadStackSize,-Xss 设置在后面,以-Xss为准; -XX:ThreadStackSize设置在后面,主线程以 -Xss为准,其他线程以 -XX:ThreadStackSize为准 -XX:MinHeapFreeRatio=40:设置堆空间最小空闲比例(默认40)(当-Xmx与-Xms相等时,该配置无效) -XX:MaxHeapFreeRatio=70:设置堆空间最大空闲比例(默认70)(当-Xmx与-Xms相等时,该配置无效) -XX:NewRatio=2:设置年轻代与年老代的比例为2:1 -XX:SurvivorRatio=8:设置年轻代中eden区与survivor区的比例为8:1 -XX:MetaspaceSize=64M:设置元数据空间初始大小(取代-XX:PermSize) -XX:MaxMetaspaceSize=128M:设置元数据空间最大值(取代之前-XX:MaxPermSize) -XX:TargetSurvivorRatio=50:设置survivor区使用率。当survivor区达到50%时,将对象送入老年代 -XX:+UseTLAB:在年轻代空间中使用本地线程分配缓冲区(TLAB),默认开启 -XX:TLABSize=512k:设置TLAB大小为512k -XX:+UseCompressedOops:使用压缩指针,默认开启 -XX:MaxTenuringThreshold=15:对象进入老年代的年龄(Parallel是15,CMS是6)
垃圾回收器相关
-XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间(收集器工作时会调整其他参数大小,尽可能将停顿控制在指定时间内) -XX:+UseAdaptiveSizePolicy:打开自适应GC策略(该摸式下,各项参数都会被自动调整) -XX:+UseSerialGC:在年轻代和年老代使用串行回收器 -XX:+UseParallelGC:使用并行垃圾回收收集器,默认会同时启用 -XX:+UseParallelOldGC(默认使用该回收器) -XX:+UseParallelOldGC:开启老年代使用并行垃圾收集器,默认会同时启用 -XX:+UseParallelGC -XX:ParallelGCThreads=4:设置用于垃圾回收的线程数为4(默认与CPU数量相同) -XX:+UseConcMarkSweepGC:使用CMS收集器(年老代) -XX:CMSInitiatingOccupancyFraction=80:设置CMS收集器在年老代空间被使用多少后触发 -XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收 -XX:+UseCMSInitiatingOccupancyOnly:只在达到阈值的时候,才进行CMS回收 -XX:+UseG1GC:使用G1回收器 -XX:G1HeapRegionSize=16m:使用G1收集器时设置每个Region的大小(范围1M - 32M) -XX:MaxGCPauseMillis=500 :设置最大暂停时间(毫秒) -XX:+DisableExplicitGC:禁止显示GC的调用(即禁止开发者的 System.gc();)
GC日志
-XX:+PrintGCDetails:打印GC信息 -XX:+PrintGCTimeStamps :打印每次GC的时间戳(现在距离启动的时间长度) -XX:+PrintGCDateStamps :打印GC日期 -XX:+PrintHeapAtGC:每次GC时,打印堆信息 -Xloggc:/usr/local/tomcat/logs/gc.$$.log :GC日志存放的位置
堆快照
-XX:+HeapDumpOnOutOfMemoryError:出现内存溢出时存储堆信息,配合 -XX:HeapDumpPath 使用 -XX:HeapDumpPath=/usr/local/tomcat/logs/oom.%t.log:堆快照存储位置 -XX:+UseLargePages:使用大页 -XX:LargePageSizeInBytes=4m:指定大页的大小(必须为2的幂)