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

createh52周前 (12-17)技术教程9

一、使用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 -jar 启动参数 java -jar 启动参数 内存

/usr/local/java/jdk1.8.0_131/bin/java -jar -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=...

java命令行参数 java命令行参数表示形式

命令行参数就是main方法里面的参数String[] args他就是一个数组,args只是数据类型的一个名称,就是一个数组的变量,名称无所谓,类型没变就行了。这个就是程序的入口点。如图7.4所示:图7...

Java启动参数设置 java启动参数设置java.exe名字

set JAVA_OPTS=-Xms4g -Xmx4g -Xmn3g -XX:SurvivorRatio=6 -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=2...

腾讯大佬详细讲解Java 启动exe程序,传递参数和获取参数

这篇文章主要介绍了java 启动exe程序,传递参数和获取参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧1、java中启动exe程序 ,并添加传参String[] cmd =...

JVM诊断之查看运行参数 jvm运行参数说明

问题描述为了分析和定位一个Java线上系统问题,我们需要查看JVM启动时的一些参数设置,例如:垃圾回收算法、堆大小等等。这些参数可能在启动脚本中明确指明,也可能采用默认值。在系统运行过程中其他人也许动...

java面试题|JVM调优常用JVM参数代码实例简介

JVM(Java Virtual Machine)启动参数用于配置Java应用程序的运行时环境,包括内存管理、垃圾回收(GC)算法、性能调优和日志记录等。# JVM启动参数,不换行格式 # 设置堆内...