JVM配置相关参数



一份tomcat启动参数的样例

在公司经常看到jvm参数调优等一系列参数,于是乎看了这一份启动参数,对这些参数产生了兴趣,这些究竟能对tomcat做什么,使得jvm获得更好的性能。下面是一份启动样例:

/home/jdk1.8.0/bin/java
 -Djava.util.logging.config.file=/home/xxx/conf/logging.properties 
 -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 
 -Djdk.tls.ephemeralDHKeySize=2048 
 -Xmn384m 
 -Xms1024m 
 -Xmx1024m 
 -XX:PermSize=128m 
 -XX:MaxPermSize=256m 
 -XX:+UseParNewGC 
 -XX:+UseConcMarkSweepGC 
 -XX:CMSFullGCsBeforeCompaction=0 
 -XX:+CMSClassUnloadingEnabled 
 -XX:+CMSParallelRemarkEnabled 
 -XX:+CMSScavengeBeforeRemark 
 -XX:CMSInitiatingOccupancyFraction=60 
 -XX:+UseCMSCompactAtFullCollection 
 -XX:+DisableExplicitGC 
 -XX:+PrintGCTimeStamps 
 -XX:+PrintGCDateStamps 
 -XX:+PrintGCDetails 
 -verbose:gc 
 -Xdebug 
 -Xloggc:/home/xxx/logs/gc.log 
 -Djava.endorsed.dirs=/home/tomcat8/endorsed 
 -classpath /home/tomcat7/bin/bootstrap.jar:/home/tomcat7/bin/tomcat-juli.jar 
 -Dcatalina.base=/home/xxx
 -Dcatalina.home=/home/tomcat8 
 -Djava.io.tmpdir=/home/project/xxx/temp org.apache.catalina.startup.Bootstrap start

JVM参数粗解

jvm各个参数意义

  • -xmn 年轻代大小。注意此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小. 增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8

  • -xms 初始堆大小。

  • -Xmx1024m 最大堆大小。

  • -Djava.util.logging.config.file java日志使用的配置

  • -Djava.util.logging.manager java日志管理使用tomcat中的ClassLoaderLogManager

  • -XX:PermSize 设置持久代(perm gen)初始值

  • -XX:MaxPermSize 设置持久代最大值

  • -XX:+UseParNewGC 设置年轻代为并行收集

  • -XX:+UseConcMarkSweepGC 使用CMS内存收集器

  • -XX:CMSFullGCsBeforeCompaction=0 多少次后进行内存压缩。由于并发收集器不对内存空间进行压缩,整理,所以运行一段时间以后会产生”碎片”,使得运行效率降低.此值设置运行多少次GC以后对内存空间进行压缩,整理.

  • -XX:+CMSClassUnloadingEnabled 并发对PermGen进行收集,只有对于cms垃圾回收器有用,对于G1回收器则只能通过fullgc

  • -XX:+CMSParallelRemarkEnabled 降低标记停顿,使用并行标记

  • -XX:+CMSScavengeBeforeRemark

  • -XX:CMSInitiatingOccupancyFraction=60 使用CMS作为垃圾回收,使用60%后开始CMS收集

  • -XX:+UseCMSCompactAtFullCollection 在FULL GC的时候,对年老代的压缩

  • -XX:+DisableExplicitGC 关闭System.gc()

  • -XX:+PrintGCTimeStamps 打印GC时间戳

  • -XX:+PrintGCDateStamps

  • -XX:+PrintGCDetails 打印GC详细的信息,如:2016-12-06T13:34:25.784+0800: 12208.859: [GC (Allocation Failure) 2016-12-06T13:34:25.784+0800: 12208.859: [ParNew: 316329K->1662K(353920K), 0.0139227 secs] 663846K->349184K(1009280K), 0.0141961 secs] [Times: user=0.04 sys=0.00, real=0.02 secs]

  • -verbose:gc 表示输出虚拟机中GC的详细情况

  • -Xloggc:/home/xxx/logs/gc.log gc输出日志文件

网上还有很多类似的参数,jvm调优的本质是根据自己的业务场景合理的分配和回收内存,每个产品的业务可能不一致,因此根据产品业务设置合理的jvm参数是必要的, 合理的内存分配与回收可以很高的提高应用的性能。

网上关于参数的描述还有有很多,以下来自http://www.mamicode.com/info-detail-1028149.html

java JVM的垃圾回收器选择:

  • -XX:+UseSerialGC:设置串行收集器

  • -XX:+UseParallelGC:设置并行收集器

  • -XX:+UseParalledlOldGC:设置并行年老代收集器

  • -XX:+UseConcMarkSweepGC:设置并发收集器

垃圾回收统计信息

  • -XX:+PrintGC

  • -XX:+PrintGCDetails

  • -XX:+PrintGCTimeStamps

  • -Xloggc:filename

并行收集器设置

  • -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。

  • -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间

  • -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

并发收集器设置

  • -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。

  • -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

堆设置

  • -Xms:初始堆大小

  • -Xmx:最大堆大小

  • -XX:NewSize=n:设置年轻代大小

  • -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4

  • -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5

  • -XX:MaxPermSize=n:设置持久代大小