java -server -jar 启动参数详解 java启动jar包命令
一、使用G1 (jdk8)
java -server -Xmx4G -Xms4G -XX:MaxMetaspaceSize=384M -XX:MetaspaceSize=384M -XX:+UseG1GC -XX:MaxGCPauseMillis=500 -XX:+ParallelRefProcEnabled -XX:+DoEscapeAnalysis -XX:+EliminateAllocations -XX:+EliminateLocks -XX:ErrorFile=./tmp/hs_err_pid%p.log -Xloggc:./tmp/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -verbose:class -XX:+PrintCommandLineFlags -Dfile.encoding=UTF-8 -Dsjdbc.self.id.generator.worker.id=$(($RANDOM$RANDOM%1024)) -Djava.security.egd=file:/dev/./urandom -jar /var/app.jar
- -XX:MaxGCPauseMillis 设置允许的停顿时长,不能太短,否则会频繁GC,并且每次回收区域不大,一般设置为200
- -XX:-RestrictContended 消除伪内存共享 - 是false + 是true
- JDK 8 提供了一种消除伪内存共享的方式:1)在code中添加sun.misc.Contended注解;2)将JVM参数配添加上-XX:-RestrictContended;
- -XX:+ParallelRefProcEnabled 默认为false,并行的处理Reference对象,如WeakReference,除非在GC log里出现Reference处理时间较长的日志,否则效果不会很明显。
- -XX:+DoEscapeAnalysis 打开逃逸分析,逃逸分析的作用就是分析对象的作用域是否会逃逸出方法之外,在server虚拟机模式下才可以开启(jdk1.6默认开启)
- -XX:+EliminateAllocations 开启标量替换,标量替换的作用是允许将对象根据属性打散后分配再栈上,默认该配置为开启
- -XX:+EliminateLocks 锁消除。 编译器优化时,对没有必要的同步锁,将锁消除,前提是java必须运行在server模式,同时必须开启逃逸分析:
- -XX:ErrorFile=./tmp/hs_err_pid%p.log 当JVM发生致命错误导致崩溃时,会生成一个hs_err_pid_xxx.log这样的文件,默认情况下,该文件是生成在工作目录下的,当然也可以通过 JVM 参数指定生成路径
- -verbose:class 在控制台即可看到所有被虚拟机加载的类
- java -XX:+PrintCommandLineFlags -version 打印HotSpotVM 采用的自动优化参数
- -Dfile.encoding=UTF-8 强行设置系统文件编码格式为utf-8.
- -Dsjdbc.self.id.generator.worker.id 生产雪花算法需要的Id workerId
- 使用"-Djava.security.egd=file:/dev/./urandom" 加快随机数产生过程
二、使用CMS (jdk8)
java -server -Xmx2G -Xms2G -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:+CMSClassUnloadingEnabled -XX:+ParallelRefProcEnabled -XX:+CMSScavengeBeforeRemark -XX:+DoEscapeAnalysis -XX:+EliminateAllocations -XX:+EliminateLocks -XX:ErrorFile=./tmp/hs_err_pid%p.log -Xloggc:./tmp/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -verbose:class -XX:+PrintCommandLineFlags -XX:-RestrictContended -Dfile.encoding=UTF-8 -Dspring.devtools.restart.enabled=true -Dsjdbc.self.id.generator.worker.id=$(($RANDOM$RANDOM%1024)) -Djava.security.egd=file:/dev/./urandom -jar /var/app.jar
- -XX:+UseConcMarkSweepGC:启用CMS垃圾收集器
- -XX:CMSInitiatingOccupancyFraction=80 与 -XX:+UseCMSInitiatingOccupancyOnly:两个参数需要配合使用,否则第一个参数的75只是一个参考值,JVM会重新计算GC的时间。
- -XX:MaxTenuringThreshold=15:对象在Survivor区熬过多少次Young GC后晋升到年老代,默认是15。Young GC是最大的应用停顿来源,而新生代里GC后存活对象的多少又直接影响停顿的时间,所以如果清楚Young GC的执行频率和应用里大部分临时对象的最长生命周期,可以把它设的更短一点,让其实不是临时对象的新生代长期对象赶紧晋升到年老代。
- -XX:-DisableExplicitGC:允许使用System.gc()主动调用GC。这里需要说明下,有的JVM优化建议是设置-XX:-DisableExplicitGC,关闭手动调用System.gc()。这是应为System.gc()是触发Full GC,频繁的Full GC会严重影响性能。但是很多NIO框架,比如Netty,会使用堆外内存,如果没有Full GC的话,堆外内存就无法回收。如果不主动调用System.gc(),就需要等到JVM自己触发Full GC,这个时候,就可能引起长时间的停顿(STW),而且机器负载也会升高。所以不能够完全禁止System.gc(),又得缩短Full GC的时间,那就使用-XX:+ExplicitGCInvokesConcurrent或-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses选项,使用CMS收集器来触发Full GC。这两个选项需要配合-XX:+UseConcMarkSweepGC使用。
- -XX:+ExplicitGCInvokesConcurrent:使用System.gc()时触发CMS GC,而不是Full GC。默认是不开启的,只有使用-XX:+UseConcMarkSweepGC选项的时候才能开启这个选项。
- -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses:使用System.gc()时,永久代也被包括进CMS范围内。只有使用-XX:+UseConcMarkSweepGC选项的时候才能开启这个选项。
- -XX:+ParallelRefProcEnabled:默认为false,并行的处理Reference对象,如WeakReference,除非在GC log里出现Reference处理时间较长的日志,否则效果不会很明显。
- -XX:+ScavengeBeforeFullGC:在Full GC执行前先执行一次Young GC。
- -XX:+UseGCOverheadLimit: 限制GC的运行时间。如果GC耗时过长,就抛OOM。
- -XX:+UseParallelGC:设置并行垃圾收集器
- -XX:+UseParallelOldGC:设置老年代使用并行垃圾收集器
- -XX:-UseSerialGC:关闭串行垃圾收集器
- -XX:+CMSParallelInitialMarkEnabled 和 -XX:+CMSParallelRemarkEnabled:降低标记停顿
- -XX:+CMSScavengeBeforeRemark:默认为关闭,在CMS remark前,先执行一次minor GC将新生代清掉,这样从老生代的对象引用到的新生代对象的个数就少了,停止全世界的CMS remark阶段就短一些。如果看到GC日志里remark阶段的时间超长,可以打开此项看看有没有效果,否则还是不要打开了,白白多了次YGC。
- -XX:CMSWaitDuration=10000:设置垃圾收集的最大时间间隔,默认是2000。
- -XX:+CMSClassUnloadingEnabled:在CMS中清理永久代中的过期的Class而不等到Full GC,JDK7默认关闭而JDK8打开。看自己情况,比如有没有运行动态语言脚本如Groovy产生大量的临时类。它会增加CMS remark的暂停时间,所以如果新类加载并不频繁,这个参数还是不开的好。