【精品】JVM参数调优

2017/07/10 - Java

基本常识

  • 堆内存 = Eden + old + Metaspace(perm)

  • 总内存 = 堆 + 栈 + 堆外内存 + jvm等内部使用的内存

  • system.gc最常见的场景是RMI/NIO下的堆外内存分配等

  • java -verbose:class -version:查看jvm启动时被加载的类

  • OutOfMemoryError

分配内存当Eden内存不够用的时候,某些情况下会尝试到Old里进行分配(比如说要分配的内存很大),如果还是没有分配成功,于是会触发一次ygc的动作,而ygc完成之后我们会再次尝试分配,如果仍不足以分配此时的内存,那会接着做一次full gc(不过此时的soft reference不会被强制回收),将老生代也回收一下,接着再做一次分配,仍然不够分配那会做一次强制将soft reference也回收的full gc,如果还是不能分配,那这个时候就抛出OutOfMemoryError GC更多请看

  • perm用来存klass、method、constantPool等信息,klass是我们熟知的class文件在jvm里的运行时数据结构

内存相关(常用)

  • -Xms:设置程序启动时的初始堆大小(如 -Xms4g,jvm启动时,分配最小堆大小4g)
  • -Xmx:设置程序能获得的最大堆大小(如 -Xmx4g,jvm启动时,允许分配的最大的堆大小4g。一般设定为同一个值,这是因为无论扩展还是缩减空间都需要进行full gc
  • -Xss:设置线程栈的大小(如 -Xss1m)

  • -Xmn:年轻代大小(如 -Xmn2g,分配的年轻代大小2g)
  • -XX:SurvivorRatio:新生代中eden区与Survivor区的比例,有两个surivior(如 -XX:SurvivorRatio=10)

  • -XX:MetaspaceSize:元数据区默认大小。JDK8之后没有Perm区了(如 -XX:MetaspaceSize=256m)
  • -XX:MaxMetaspaceSize:元数据的最大大小(如 -XX:MaxMetaspaceSize=256m)
  • -XX:MaxDirectMemorySize:最大的堆外内存(如 -XX:MaxDirectMemorySize=1g)

内存相关(jdk8及以上可能不管用了)

  • -XX:MinHeapFreeRatio:设置堆空间最小空闲比例。当堆空间的空闲内存小于这个数值时,JVM便会扩展堆空间。
  • -XX:MaxHeapFreeRatio:设置堆空间最大空闲比例。当堆空间的空闲内存大于这个数值时,JVM便会压缩堆空间。
  • -XX:NewSize:设置新生代初始化大小。
  • -XX:MaxNewSize:设置年轻代最大值
  • -XX:NewRatio:设置老年代和新生代的比例。
  • -XX:MaxPermSize:设置永久代的最大值。
  • -XX:PermSize:设置永久代的初始值。
  • -XX:TargetSurvivorRatio:设置survivor取的可使用率。当survivor区的空间使用率达到这个数值时,会将对象送入老年代。

GC相关

  • -XX:+UseConcMarkSweepGC:使用CMS内存收集,新生代自动默认使用ParNew。
  • -XX:ParallelGCThreads=4:设置并行收集器的线程数为4,一般跟cpu核数相等
  • -XX:CMSMaxAbortablePrecleanTime=5000:指定CMS-concurrent-abortable-preclean阶段执行的时间,该阶段主要是执行一些预清理,减少应用暂停的时间
  • -XX:+CMSClassUnloadingEnabled:对永久代区不再使用的class进行回收
  • -XX:CMSInitiatingOccupancyFraction=80:使用80%后开始CMS收集
  • -XX:+UseCMSInitiatingOccupancyOnly:使用手动或者自定义触发cms收集,同时也会禁止hostspot 自行触发CMS GC
  • -XX:+ExplicitGCInvokesConcurrent:无论什么时候调用系统GC(system.gc()),都执行CMS GC,而不是Full GC
  • -XX:CMSWaitDuration=10000:让CMS的initial-mark起来前,等待10sParNew的发生,ParNew可以减少GC root chain的数量。否则initial-mark会很长,不少会超过1s

  • -Xloggc:/home/admin/logs/gc.log:gc打印的日志目录
  • -XX:+PrintGCDetails:打印GC的详情信息
  • -XX:+PrintGCDateStamps:打印GC的时间戳
  • -XX:+HeapDumpOnOutOfMemoryError:当发生OOM错误 时,将内存DUMP下来
  • -XX:HeapDumpPath=/home/admin/logs/java.hprof:设置内存DUMP的路径
  • -XX:+PrintGCApplicationStoppedTime:打印垃圾回收器执行的暂停时间
  • -XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间
  • -XX:+PrintHeapAtGC:打印GC前的详细堆栈信息
  • XX:+PrintGCCause来打印原因
  • -XX:+HeapDumpBeforeFullGC、-XX:+HeapDumpAfterFullGC:在Full GC前后分别对内存做一个dump
  • -XX:+DisableExplicitGC:禁用认为GC

优化相关

  • -server、-client:client模式的特点是启动快、占用内存少、JIT编译器生成代码的速度也更快。Server模式则提供了更复杂的生成码优化功能,这个功能对于服务器程序而言尤为重要。
  • -XX:LargePageSizeInBytes:内存页的大小
  • -XX:+UseFastAccessorMethods:原始类型快速优化
  • -XX:+AggressiveOpts:编译速度加快
  • -XX:+UseBiasedLocking:启用偏向锁,优化锁机制改善性能
  • -Xnoclassgc:禁用垃圾回收
  • -XX:SofLRUPolicyMSPerMB:每兆堆空闲空间中SoftReference的存活空间,默认是1秒
  • -XX:PretenureSizeThreshold:对象超过多大值时直接在旧生代中分配
  • -XX:TLABWasteTargetPercent:TLAB占eden区的百分比,默认是1%
  • -XX:+CollectGenOFist:FullGC时是否先YGC 默认是是false 不允许线YGC

其他GC收集器

  • -XX:+UseSerialGC:设置串行收集器
  • -XX:+UseParallelGC:设置并行收集器, Full GC 采用parallel MSC 就是年轻代使用并发收集,而年老代仍旧使用串行收集
  • -XX:+UseParNewGC:设置年轻代为并行收集器,这个可以与cms收集同时使用,jdk5以上是不用配置的
  • -XX:+UseParalledlOldGC:设置并行年老代收集器, jdk6以上新出的配置
  • -XX:MaxGCPauseMillis:每次年轻代垃圾回收的最长时间,如果无法满足此事件,JVM会自动调整年轻代大小,以满足此值
  • -XX:GCTimeRatio:设置垃圾回收时间站程序运行时间的百分比
  • -XX:+ScavengeBeforeFullGC:Full GC前调用YGC 默认是true

  • -XX:+AggressiveHeap:让JVM自动根据机器的内存和CPU数优化各种参
  • -XX:CMSFullGCsBeforeCompaction :在多少次GC后进行内存压缩,这个是因为并行收集器不对内存空间进行压缩的,所以运行一段时间后会产生很多碎片,使得运行效率降
  • -XX:+CMSParallelRemarkEnabled:降低标记停顿
  • -XX:+UseCMSCompactAtFullCollection:在Full GC时对老年代压缩
  • -XX:CMSInitiatingPermOccupancyFraction:设置perm gen使用达到多少%比时触发垃圾回收,默认是92%
  • -XX:+CMSIncrementalMode:设置为增量模式

调试相关

  • -Xdebug
  • -Xnoagent
  • -X runjdwp:transport=dt_socket,server=y,suspend=n,address=8000

其他

  • -XX:+FailOverToOldVerifier:如果新的Class校验器检查失败,则使用老的校验器
  • -XX:+HandlePromotionFailure:关闭新生代收集器,jdk5以前是不默认启动的 jdk6默认启用
  • -XX:-MaxFDLimit:设置java进程可用文件描述符为操作系统允许的最大值
  • -XX:+UseAltsigs:为了防止与其他发送信号的应用程序冲突,允许使用候补信号替代
  • -XX:+UseBoundTherads:绑定所有的用户线程到内核线程,减少线程进入到饥饿状态次数
  • -XX:+UseGCOverhedLimit:限制GC的运行时间。如果GC耗时过长,就抛OOM
  • -XX:+UseLWPSynchronization :使用轻量级进程(cpu线程)替换线程同步
  • -XX:+UseTLAB:启动线程本地缓存区
  • -XX:+UseSplitVerifier:使用新的Class类型校验器
  • -XX:+UseThreadPriorities:使用本地线程的优先级
  • -XX:+UseVMInterruptibleIO:允许运行时中断线程
  • -XX:-UseISM:启动solaris的ISM
  • -XX:+UseLargePages:启动最大内存分页
  • -XX:+UseBoundThreads:绑定所有的用户线程到内核线程
  • -XX:ErrorFile=FileName.log:异常打印在错误文件上
  • -XX:+PerfSaveDataToFile:退出时保存jvmstat二进制的文件
  • -XX:+UseSpining:开启自旋锁
  • -XX:PreBlockSpin=N:更改自旋锁的自旋次数
  • -XX:+TraceClassLoading :跟踪类加载的信息(诊断内存泄露很有用)
  • -XX:+TraceClassUnloading :跟踪类卸载的信息(诊断内存泄露很有用)
  • -agentlib:libname[=options] :用于加载本地的lib
  • -agentlib:hprof :用于获取JVM的运行情况
  • -agentpath:pathnamep[=options] :加载制定路径的本地库
  • -Dproperty=value :设置系统属性名/值对
  • -jar :制定以jar包的形式执行一个应用程序
  • -javaagent:jarpath[=options] :实现premain方法在main方法前执行可以利用该方式玩一个JVM层面的hook
  • -verbose:jni :输出native方法的调用情况玩JNI必备技能
  • -XX:+PrintCompilation:可以看到正在jit哪些方法,分别用了多少时间,代码块有多大等
  • -XX:+TieredCompilation:将jit编译的过程分为了好几层进行逐步编译,这样每次编译带来的开销会比较小,相当于把一步到位的事情分解到了几个过程里,给cpu带来的影响也被分摊了
  • -XX:MaxJavaStackTraceDepth=1024:JVM里对栈的输出条数
  • -XX:CompilerThreadStackSize:编译器盏大小
  • -XX:VMThreadStackSize:JVM盏大小
  • -XX:StackYellowPages,-XX:StackRedPages,-XX:StackShadowPages:盏内存保护相关

JVM常用参数

CATALINA_OPTS="-server"
CATALINA_OPTS="${CATALINA_OPTS} -Xms4g -Xmx4g"
CATALINA_OPTS="${CATALINA_OPTS} -Xmn2560m"
CATALINA_OPTS="${CATALINA_OPTS} -XX:SurvivorRatio=10"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+UseConcMarkSweepGC"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+UseCMSCompactAtFullCollection"
CATALINA_OPTS="${CATALINA_OPTS} -XX:CMSMaxAbortablePrecleanTime=5000"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+CMSClassUnloadingEnabled"
CATALINA_OPTS="${CATALINA_OPTS} -XX:CMSInitiatingOccupancyFraction=80"
CATALINA_OPTS="${CATALINA_OPTS} -XX:PermSize=512m -XX:MaxPermSize=512m -Xss1m"
CATALINA_OPTS="${CATALINA_OPTS} -Xloggc:${MIDDLEWARE_LOGS}/gc.log"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+PrintGCDetails"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+PrintGCDateStamps"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+HeapDumpOnOutOfMemoryError"
CATALINA_OPTS="${CATALINA_OPTS} -XX:HeapDumpPath=${APP_HOME}/logs/im.hprof"
CATALINA_OPTS="${CATALINA_OPTS} -Djava.awt.headless=true"
CATALINA_OPTS="${CATALINA_OPTS} -Dsun.net.client.defaultConnectTimeout=10000"
CATALINA_OPTS="${CATALINA_OPTS} -Dsun.net.client.defaultReadTimeout=30000"
# SETENV NEW OPTS
CATALINA_OPTS="${CATALINA_OPTS} -XX:MaxDirectMemorySize=1g"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+UseCMSInitiatingOccupancyOnly"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+ExplicitGCInvokesConcurrent -Dsun.rmi.dgc.server.gcInterval=2592000000 -Dsun.rmi.dgc.client.gcInterval=2592000000"
CATALINA_OPTS="${CATALINA_OPTS} -XX:ParallelGCThreads=${CPU_COUNT}"
CATALINA_OPTS="${CATALINA_OPTS} -DJM.LOG.PATH=${MIDDLEWARE_LOGS}"
CATALINA_OPTS="${CATALINA_OPTS} -Dfile.encoding=${JAVA_FILE_ENCODING}"
CATALINA_OPTS="${CATALINA_OPTS} -Dhsf.publish.delayed=true"

如果文章对您有帮助,欢迎扫描下方二维码赞助(一分也是爱噢),谢谢

Search

    一分也是爱噢 一分也是爱

    目录