Linux下Tomcat开启查看GC⽇志和调优总结
⼀、开启GC⽇志
1、在Tomcat 的安装路径下,到bin/catalina.sh 加上下⾯的配置,具体参数,⾃⼰配置:
[root@CentOS7 tomcat]# vim bin/catalina.sh
JAVA_OPTS='-Xms1024m -Xmx2048m -XX:PermSize=64M -XX:MaxNewSize=128m -XX:MaxPermSize=64m -XX:ParallelGCThreads=8 -XX:+UseConcMar kSweepGC -Xloggc:/usr/local/tomcat/logs/tomcat_gc.log'
2、重启tomcat
[root@centos7 ~]# systemctl restart tomcat
3、查看GC⽇志
[root@centos7 ~]# cat /usr/local/tomcat/logs/tomcat_gc.log
⼆、GC⽇志分析
1、windows 安装java 环境
(1) 官⽹下载JDK
下载,必须点击同意协议
(2)安装JDK1.8版本
设置⾃⼰的安装路径,取消公共JRE
(3)设置3个环境变量
① 到⾃⼰安装jdk的bin路径,我的安装路径是 C:\Program Files (x86)\Java\jdk1.8.0_181
② 在⾼级系统设置—>环境变量—>新建
新建2个环境变量JAVA_HOME、CLASSPATH:
修改⼀个变量:Path
(4)安装完毕,测试
在cmd中输⼊ java、javac、java -version三个命令会有不同的效果
2、运⾏gchisto,分析gc⽇志
(1)运⾏gchisto
解包后,打开cmd命令⾏,执⾏下边的命令,注意:⾃⼰解包后gchisto的路径java -jar D:\gchisto-master\release\GCHisto-java8.jar
(2)打开后效果
(3)分析Tomcat 的gc ⽇志
将linux 下的tomcat ⽇志 导⼊到windows 上的gchisto中,查看效果
三、选项参数详解
1、堆⼤⼩设置
① -Xmx3550m -Xms3550m -Xmn2g -Xss128k
  -Xmx3550m:设置JVM最⼤可⽤内存为3550M。
  -Xms3550m:设置JVM初始内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后J
VM重新分配内存。
  -Xmn2g:设置年轻代⼤⼩为2G。整个堆⼤⼩=年轻代⼤⼩ + 年⽼代⼤⼩ + 持久代⼤⼩。持久代⼀般固定⼤⼩为64m,所以增⼤年轻代后,将会减⼩年⽼代⼤⼩。此值对系统性能影响较⼤,Sun官⽅推荐配置为整个堆的3/8。
  -Xss128k: 设置每个线程的堆栈⼤⼩。JDK5.0以后每个线程堆栈⼤⼩为1M,以前每个线程堆栈⼤⼩为256K。更具应⽤的线程所需内存⼤⼩进⾏调整。在相同物理内存下,减⼩这个值能⽣成更多的线程。但是操作系统对⼀个进程内的线程数还是有限制的,不能⽆限⽣成,经验值在3000~5000左右。
② -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年⽼代的⽐值(除去持久代)。设置为4,则年轻代与年⽼代所占⽐值为1:4,年轻代占整个堆栈的1/5
  -XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的⼤⼩⽐值。设置为4,则两个Survivor区与⼀个Eden区的⽐值为2:4,⼀个Survivor区占整个年轻代的1/6
  -XX:PermSize:设置永久代(perm gen)初始值。默认值为物理内存的1/64。
  -XX:MaxPermSize:设置持久代最⼤值。物理内存的1/4。
  -XX:MaxTenuringThreshold=0:设置垃圾最⼤年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进⼊年⽼代。对于年⽼代⽐较多的应⽤,可以提⾼效率。如果将此值设置为⼀个较⼤值,则年轻代对象会在Survivor区进⾏多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
2、回收器选择
(1)吞吐量优先的并⾏收集器
① -XX:+UseParallelGC -XX:ParallelGCThreads=20
  -XX:+UseParallelGC:选择垃圾收集器为并⾏收集器。此配置仅对年轻代有效。即上述配置下,年轻代使⽤并发收集,⽽年⽼代仍旧使⽤串⾏收集。
  -XX:ParallelGCThreads=20:配置并⾏收集器的线程数,即:同时多少个线程⼀起进⾏垃圾回收。此值最好配置与处理器数⽬相等。 
② -XX:+UseParallelOldGC
  -XX:+UseParallelOldGC:配置年⽼代垃圾收集⽅式为并⾏收集。JDK6.0⽀持对年⽼代并⾏收集。
③ -XX:MaxGCPauseMillis=100
  -XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果⽆法满⾜此时间,JVM会⾃动调整年轻代⼤⼩,以满⾜此值。
④ -XX:+UseAdaptiveSizePolicy
  -XX:+UseAdaptiveSizePolicy:设置此选项后,并⾏收集器会⾃动选择年轻代区⼤⼩和相应的Survivor区⽐例,以达到⽬标系统规定的最低相应时间或者收集频率等,此值建议使⽤并⾏收集器时,⼀直打开。
(2)响应时间优先的并发收集器
① -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
  -XX:+UseConcMarkSweepGC:设置年⽼代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代⼤⼩最好⽤-Xmn设置。
  -XX:+UseParNewGC:设置年轻代为并⾏收集。可与CMS收集同时使⽤。JDK5.0以上,JVM会根据系统配置⾃⾏设置,所以⽆需再设置此值。
② -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
  -XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进⾏压缩、整理,所以运⾏⼀段时间以后会产⽣"碎⽚",使得运⾏效率降低。此值设置运⾏多少次GC以后对内存空间进⾏压缩、整理。
  -XX:+UseCMSCompactAtFullCollection:打开对年⽼代的压缩。可能会影响性能,但是可以消除碎⽚
3、辅助信息
JVM提供了⼤量命令⾏参数,打印信息,供调试使⽤。主要有以下⼀些:
① -XX:+PrintGC
  输出形式:
  输出形式:
  [GC 118250K->113543K(130112K), 0.0094143 secs]
  [Full GC 121376K->10414K(130112K), 0.0650971 secs]
② -XX:+PrintGCDetails
  输出形式:
  [GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
  [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
③ -XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可与上⾯两个混合使⽤
  输出形式:
  11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]
④ -XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执⾏时间。可与上⾯混合使⽤
  输出形式:
  Application time: 0.5291524 seconds
⑤ -XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间。可与上⾯混合使⽤
  输出形式:
  Total time for which application threads were stopped: 0.0468229 seconds
⑥ -XX:PrintHeapAtGC:打印GC前后的详细堆栈信息
  输出形式:
  34.702: [GC {Heap before gc invocations=7:
  def new generation total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0x227d0000)
  eden space 49152K, 99% used [0x1ebd0000, 0x21bce430, 0x21bd0000)
  from space 6144K, 55% used [0x221d0000, 0x22527e10, 0x227d0000)
  to space 6144K, 0% used [0x21bd0000, 0x21bd0000, 0x221d0000)
  tenured generation total 69632K, used 2696K [0x227d0000, 0x26bd0000, 0x26bd0000)
  the space 69632K, 3% used [0x227d0000, 0x22a720f8, 0x22a72200, 0x26bd0000)
  compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)
  the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)
  ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)
  rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)
  34.735: [DefNew: 52568K->3433K(55296K), 0.0072126 secs] 55264K->6615K(124928K)Heap after gc invocations=8:
  def new generation total 55296K, used 3433K [0x1ebd0000, 0x227d0000, 0x227d0000)
  eden space 49152K, 0% used [0x1ebd0000, 0x1ebd0000, 0x21bd0000)
  from space 6144K, 55% used [0x21bd0000, 0x21f2a5e8, 0x221d0000)
  to space 6144K, 0% used [0x221d0000, 0x221d0000, 0x227d0000)
linux安装jdk环境变量  tenured generation total 69632K, used 3182K [0x227d0000, 0x26bd0000, 0x26bd0000)
  the space 69632K, 4% used [0x227d0000, 0x22aeb958, 0x22aeba00, 0x26bd0000)
  compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)
  the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)
  ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)
  rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)
  }
  , 0.0757599 secs]
⑦ -Xloggc:filename:与上⾯⼏个配合使⽤,把相关⽇志信息记录到⽂件以便分析。
四、常见配置汇总

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。