java -server -jar 启动参数详解 java启动jar包命令

createh54个月前 (12-17)技术教程35

一、使用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

  1. -XX:MaxGCPauseMillis 设置允许的停顿时长,不能太短,否则会频繁GC,并且每次回收区域不大,一般设置为200
  2. -XX:-RestrictContended 消除伪内存共享 - 是false + 是true
  3. JDK 8 提供了一种消除伪内存共享的方式:1)在code中添加sun.misc.Contended注解;2)将JVM参数配添加上-XX:-RestrictContended;
  4. -XX:+ParallelRefProcEnabled 默认为false,并行的处理Reference对象,如WeakReference,除非在GC log里出现Reference处理时间较长的日志,否则效果不会很明显。
  5. -XX:+DoEscapeAnalysis 打开逃逸分析,逃逸分析的作用就是分析对象的作用域是否会逃逸出方法之外,在server虚拟机模式下才可以开启(jdk1.6默认开启)
  6. -XX:+EliminateAllocations 开启标量替换,标量替换的作用是允许将对象根据属性打散后分配再栈上,默认该配置为开启
  7. -XX:+EliminateLocks 锁消除。 编译器优化时,对没有必要的同步锁,将锁消除,前提是java必须运行在server模式,同时必须开启逃逸分析:
  8. -XX:ErrorFile=./tmp/hs_err_pid%p.log 当JVM发生致命错误导致崩溃时,会生成一个hs_err_pid_xxx.log这样的文件,默认情况下,该文件是生成在工作目录下的,当然也可以通过 JVM 参数指定生成路径
  9. -verbose:class 在控制台即可看到所有被虚拟机加载的类
  10. java -XX:+PrintCommandLineFlags -version 打印HotSpotVM 采用的自动优化参数
  11. -Dfile.encoding=UTF-8 强行设置系统文件编码格式为utf-8.
  12. -Dsjdbc.self.id.generator.worker.id 生产雪花算法需要的Id workerId
  13. 使用"-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

  1. -XX:+UseConcMarkSweepGC:启用CMS垃圾收集器
  2. -XX:CMSInitiatingOccupancyFraction=80 与 -XX:+UseCMSInitiatingOccupancyOnly:两个参数需要配合使用,否则第一个参数的75只是一个参考值,JVM会重新计算GC的时间。
  3. -XX:MaxTenuringThreshold=15:对象在Survivor区熬过多少次Young GC后晋升到年老代,默认是15。Young GC是最大的应用停顿来源,而新生代里GC后存活对象的多少又直接影响停顿的时间,所以如果清楚Young GC的执行频率和应用里大部分临时对象的最长生命周期,可以把它设的更短一点,让其实不是临时对象的新生代长期对象赶紧晋升到年老代。
  4. -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使用。
  5. -XX:+ExplicitGCInvokesConcurrent:使用System.gc()时触发CMS GC,而不是Full GC。默认是不开启的,只有使用-XX:+UseConcMarkSweepGC选项的时候才能开启这个选项。
  6. -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses:使用System.gc()时,永久代也被包括进CMS范围内。只有使用-XX:+UseConcMarkSweepGC选项的时候才能开启这个选项。
  7. -XX:+ParallelRefProcEnabled:默认为false,并行的处理Reference对象,如WeakReference,除非在GC log里出现Reference处理时间较长的日志,否则效果不会很明显。
  8. -XX:+ScavengeBeforeFullGC:在Full GC执行前先执行一次Young GC。
  9. -XX:+UseGCOverheadLimit: 限制GC的运行时间。如果GC耗时过长,就抛OOM。
  10. -XX:+UseParallelGC:设置并行垃圾收集器
  11. -XX:+UseParallelOldGC:设置老年代使用并行垃圾收集器
  12. -XX:-UseSerialGC:关闭串行垃圾收集器
  13. -XX:+CMSParallelInitialMarkEnabled 和 -XX:+CMSParallelRemarkEnabled:降低标记停顿
  14. -XX:+CMSScavengeBeforeRemark:默认为关闭,在CMS remark前,先执行一次minor GC将新生代清掉,这样从老生代的对象引用到的新生代对象的个数就少了,停止全世界的CMS remark阶段就短一些。如果看到GC日志里remark阶段的时间超长,可以打开此项看看有没有效果,否则还是不要打开了,白白多了次YGC。
  15. -XX:CMSWaitDuration=10000:设置垃圾收集的最大时间间隔,默认是2000。
  16. -XX:+CMSClassUnloadingEnabled:在CMS中清理永久代中的过期的Class而不等到Full GC,JDK7默认关闭而JDK8打开。看自己情况,比如有没有运行动态语言脚本如Groovy产生大量的临时类。它会增加CMS remark的暂停时间,所以如果新类加载并不频繁,这个参数还是不开的好。

相关文章

Java方法参数传递的机制 java方法参数可以传空吗

目前两种比较流行的方法参数传递模式主要是值传递和引用传递。不同的编程语言对于这两种机制可能有不同的处理方式。对Java来说,一切都是严格按值传递的。接下来,我们来一起探讨下 Java 如何为各种类型传...

Java基础之抽象类、接口作为方法参数和返回值

不同修饰符使用细节常用来修饰类、方法、变量的修饰符public 权限修饰符,公共访问, 类,方法,成员变量protected 权限修饰符,受保护访问, 方法,成员变量默认什么也不写 也是一种权限修饰符...

Java技术干货| JVM常用的优化思路及配置参数

#头条创作挑战赛#设置堆大小:通过-Xms和-Xmx参数设置初始堆大小和最大堆大小。示例: -Xms512m -Xmx1024m设置新生代和老年代比例:通过-XX:NewRatio参数设置新生代和老年...

微信支付报"调用支付jsapi缺少参数 total_fee",实际Java统一

微信支付报"调用支付jsapi缺少参数 total_fee",实际Java统一支付接口,返回“body参数长度有误”之前帮朋友做过一次微信支付,记得里面到处都是坑,今天朋友说出现问题提...