JVM参数调优

匿名 (未验证) 提交于 2019-12-03 00:27:02

基本常识

堆内存 = 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

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

-XX:CICompilerCount=12:编译线程,加快编译速度



其他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
-Xrunjdwp: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常用调优

Xms=Xmx。减少堆内存大小的调整,提高稳定性
适当增大Xmn、XX:NewRatio。尽量将新生代对象留在新生代,避免新生的大对象直接进入老年代,适当调大Xmn、NewRatio,增加新生代的空间
适当调整XX:PretenureSizeThreshold、XX:MaxTenuringThreshold。应该尽量阻止短命大对象进入老年代
-Xss2m改为-Xss1m。减少线程栈的内存分配,避免内存的浪费
XX:PermSize=196m改为256m。持久代的初始值和最大值都设为256M,避免持久代初始内存不足时因此内存的动态分配。
适当调整堆外内存

XX:+UseConcMarkSweepGC、XX:+UseCMSCompactAtFullCollection。在多核CPU上,可用并行垃圾回收器CMS。
XX:ParallelGCThreads。并行的垃圾回收线程的数量,最好等于CPU数量
Xincgc。使用增量式的GC
XX:+DisableExplicitGC。禁用System.gc(),因为它会触发Full GC
XX:CMSInitiatingOccupancyFraction和XX:+UseCMSInitiatingOccupancyOnly最好一起使用,做到可控,只有当old到达阀值(CMSInitiatingOccupancyFraction)时进行majorGC。


JVM常用参数


CATALINA_OPTS="-server"


























上述参数在后续会详细介绍其意思

文章来源: JVM参数调优
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!