-server
-Xms2048M
-Xmx2048M
-Xmn1024M
-Xss512K
-XX:MaxDirectMemorySize=1G
堆外内存/直接内存的大小,默认为堆内存减去一个Survivor区的大小
-XX:MetaspaceSize=128M
初始化的元空间大小
-XX:MaxMetaspaceSize=512m
元空间的最大大小
-XX:SurvivorRatio=2
Ende 682M Survivor 341M
-XX:TargetSurvivorRatio=75
survivor空间超过此大小,则将对象移到old区 225M
-XX:MaxTenuringThreshold=2
对象年龄2岁
-XX:PretenureSizeThreshold=1048576
大于1M的对象直接进入老年代
#JIT编译相关
-XX:InitialCodeCacheSize=20971520
JVM启动的时候CodeCache初始化大小[2M],如果满了会导致jit非正常运行
-XX:ReservedCodeCacheSize=251658240
CodeCache的最大大小,jdk6-7 48M jdk8 240M
-XX:+UseCodeCacheFlushing
开启CodeCache的回收机制
-XX:+TieredCompilation
是否开启分层编译,jdk8默认开启,重启后可能出现系统负载很高,开启后C1 C2协作,系统负载很快降下来
-XX:CICompilerCount=4
c2编译线程的数量,默认为2,跟分层编译有关,可以快速降低系统重启后的负载
-XX:+BackgroundCompilation
默认为true,编译线程是后台运行的。不要关闭,否则程序将在编译的时候停顿等待编译完成
-XX:CompileThreshold=10000
jdk6-8默认为10000,方法调用计数器
-XX:OnStackReplacePercentage=140
jdk6-8 servier为140,client为933,用来计算回边计数器[10700,13995]
-XX:InterpreterProfilePercentage=33
jdk6-8默认为33
server 回边阈值=方法调用计数器阈值(CompileThreshold)× (OSR 比率(OnStackReplacePercentage)- 解释器监控比率(InterpreterProfilePercentage)) / 100
client 回边阈值=方法调用计数器阈值(CompileThreshold)× OSR 比率(OnStackReplacePercentage)/ 100
#其他优化参数
-XX:+DisableExplicitGC
jdk6-8默认为false,关闭显示的System.gc(),千万别关闭
-XX:+ExplicitGCInvokesConcurrent
当调用System.gc()的时候, 执行并行gc。默认是不开启的,只有使用-XX:+UseConcMarkSweepGC[G1也可以]选项的时候才能开启这个选项。
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
当调用System.gc()的时候, 执行并行gc。并在垃圾回收的周期内卸载类。 只有使用-XX:+UseConcMarkSweepGC[G1也可以]选项的时候才能开启这个选项。
-XX:+UseFastAccessorMethods
jdk7后如果开启了分层编译,不建议开启
-XX:+UseFastEmptyMethods
jdk7后如果开启了分层编译,不建议开启
-XX:StringTableSize=300007
String常量池的StringTable大小,jdk6 1009,jdk7-8是60013,最好设置为素数
-XX:+DoEscapeAnalysis
jdk6-8默认开启逃逸分析,必须开启逃逸分析,才能使用TLAB
-XX:+EliminateAllocations
jdk6-8默认开启开启标量替换,允许将对象打散分配在栈上,比如若一个对象拥有两个字段,会将这两个字段视作局部变量进行分配
-XX:+UseTLAB
jdk6-8默认开启,开启此参数会提前为每个线程分配tlab堆空间,在Ende空间中,降低了内存分配的碰撞
-XX:TLABWasteTargetPercent=2
设置TLAB空间所占用Eden空间的百分比大小,缺省情况下仅占有整个Eden空间的1%
#解锁试验参数
-XX:+UnlockExperimentalVMOptions
解锁一些实验标志的参数,所有的试验参数必须加在此后面
-XX:+UnlockDiagnosticVMOptions
上同
#并发垃圾收集线程数设置
-XX:ParallelGCThreads=8
设置STW期间并行垃圾线程数,ConcGCThreads=(此值+3)/4
-XX:ConcGCThreads=3
CMS并发垃圾线程数,设置了这个上面的就无效了
#CMS回收参数
-XX:+UseConcMarkSweepGC
老年代使用CMS回收,其实下面的UseParNewGC可以不用显示的开启,开启此参数就默认开启了
-XX:+UseParNewGC
新生代使用并行回收
-XX:CMSInitiatingOccupancyFraction=75
默认68%,设置CMS回收老年代的阈值,不可设置过大,否则极易出现promotion failed,触发Full GC
-XX:+UseCMSInitiatingOccupancyOnly
是否必须达到CMSInitiatingOccupancyFraction才触发CMS,否则JVM会重新计算GC的触发阈值
-XX:+CMSParallelInitialMarkEnabled
jdk6-7默认false,jdk8默认true,是否开启并行初始标记,降低STW停顿时间
-XX:+CMSParallelRemarkEnabled
jdk6-8默认true,是否在重新标记阶段,开启并行重新标记,降低STW停顿时间
-XX:+CMSParallelSurvivorRemarkEnabled
jdk6-8默认true,是否开启并行survivor区重新标记
-XX:+CMSScavengeBeforeRemark
是否在重新标记前先执行一次minor GC将新生代清掉,这样从老生代的对象引用到的新生代对象的个数就少了,停止全世界的CMS remark阶段就短一些,如果看到GC日志里remark阶段的时间超长,可以打开此项看看有没有效果,否则还是不要打开了,白白多了次YGC。
-XX:CMSFullGCsBeforeCompaction=0
表示经过多少次foreground的CMS GC会做一次内存压缩,默认为0,但是压缩会影响暂停时间,因为可以是恶当的调整这个值
-XX:+UseCMSCompactAtFullCollection
jdk6-8默认为true,设置CMS在完成垃圾回收后,是否要进行一次内存碎片的整理
-XX:+CMSClassUnloadingEnabled
jdk8默认开启,jdk6-7默认关闭,是否允许对类元数据进行回收
-XX:CMSWaitDuration=2000
设置垃圾收集的最大时间间隔,默认是2000
#G1回收参数
-XX:+UseG1GC
使用G1垃圾回收策略
-XX:InitiatingHeapOccupancyPercent=45
设置触发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%
-XX:G1HeapRegionSize=16M
设置的 G1 区域的大小。值是 2 的幂,范围是 1 MB 到 32 MB 之间。默认值将根据 heap size 算出最优解,目标是根据最小的 Java 堆大小划分出约 2048 个区域
-XX:MaxGCPauseMillis=50
为所需的最长暂停时间设置目标值。默认值是 200 毫秒。指定的值不适用于您的堆大小
-XX:GCPauseIntervalMillis=2000
设置停顿间隔时间,默认值200毫秒
-XX:G1ReservePercent=10
设置堆内存保留为假天花板的总量,以降低提升失败的可能性. 默认值是 10。如果对象转移失败,将会在GC日志中显示 to-space overflow (to-空间溢出),会导致很昂贵的操作(1.GC仍继续所以空间必须被释放;2.拷贝失败的对象必须被放到正确的位置;3.CSet指向区域中的任何 RSets 更新都必须重新生成;)
-XX:G1HeapWastePercent=10
设置您愿意浪费的堆百分比。如果可回收百分比小于堆废物百分比,不会启动混合垃圾回收周期。默认值是 10%。在global concurrent marking结束之后,我们可以知道old gen regions中有多少空间要被回收,在每次YGC之后和再次发生Mixed GC之前,会检查垃圾占比是否达到此参数,只有达到了,下次才会发生Mixed GC
-XX:G1MixedGCCountTarget=8
设置标记周期完成后,对存活数据上限为 G1MixedGCLIveThresholdPercent 的旧区域执行混合垃圾回收的目标次数。默认值是 8 次混合垃圾回收。混合回收的目标是要控制在此目标次数以内
-XX:+UseStringDeduplication
开启字符串去重,默认false,必须使用G1才生效
-XX:StringDeduplicationAgeThreshold=3
字符串去重只会处理那些经历过几次垃圾收集仍然存活的字符串,这确保多数生命周期很短的字符串不会被处理,默认为3
#G1的实验参数
-XX:G1NewSizePercent=5
设置要用作年轻代大小最小值的堆百分比。默认值是 Java 堆的 5%
-XX:G1MaxNewSizePercent=60
设置要用作年轻代大小最大值的堆大小百分比。默认值是 Java 堆的 60%
-XX:G1MixedGCLiveThresholdPercent=65
为混合垃圾回收周期中要包括的旧区域设置占用率阈值。默认占用率为 65%,也就是存活对象低于此值的才会被入选CSet(它记录了GC要收集的Region集合,集合里的Region可以是任意年代的)
-XX:G1OldCSetRegionThresholdPercent=10
设置混合垃圾回收期间要回收的最大旧区域数。默认值是 Java 堆的 10%
-XX:+ScavengeBeforeFullGC
在Full GC执行前先执行一次Young GC
-XX:GCLockerEdenExpansionPercent=5
GC的时候Eden区的扩张比例,默认5
#其他配置
-XX:SoftRefLRUPolicyMSPerMB=0
每1M空闲空间可保持的SoftReference对象生存的时长(单位毫秒),默认值1000
-XX:+ParallelRefProcEnabled
默认为false,并行的处理Reference对象,如WeakReference,除非在GC log里出现Reference处理时间较长的日志,否则效果不会很明显。
-XX:+UseBiasedLocking
jdk6-8默认为true,(在存在大量锁对象的创建且高度并发的环境下(即非多线程高并发应用)禁用偏向锁能够带来一定的性能优化)
-XX:-OmitStackTraceInFastThrow
不忽略重复异常的栈,这是JDK的优化,大量重复的JDK异常不再打印其StackTrace。但是如果系统是长时间不重启的系统,在同一个地方跑了N多次异常,结果就被JDK忽略了,那岂不是查看日志的时候就看不到具体的StackTrace,那还怎么调试,所以还是关了的好。默认为true。VM只对几个特定类型异常开启了Fast Throw优化,这些异常包括:NullPointerException,ArithmeticException,ArrayIndexOutOfBoundsException,ArrayStoreException,ClassCastException。
-XX:+AlwaysPreTouch
在启动时把所有参数定义的内存全部捋一遍。使用这个参数可能会使启动变慢,但是在后面内存使用过程中会更快。可以保证内存页面连续分配,新生代晋升时不会因为申请内存页面使GC停顿加长。通常只有在内存大于32G的时候才会有感觉
-XX:AutoBoxCacheMax=10000
增加数字对象自动装箱的范围,JDK默认-128~127的int和long,超出范围就会即时创建对象,所以,增加范围可以提高性能,但是也是需要测试
-XX:+AggressiveOpts
win jdk8没有此参数,作用如其名(aggressive),启用这个参数,则每当 JDK 版本升级时,你的 JVM 都会使用最新加入的优化技术(如果有的话)
-XX:+AggressiveHeap
win jdk8没有此参数,java堆内存优化。默认是关闭的,如果开启后,针对一些长时间运行的且有密集的内存分配操作,JVM根据系统cpu和内存的配置参数来进行优化
-XX:+UseLargePages
jdk6-8默认关闭,是否使用大的内存页
-XX:LargePageSizeInBytes=4M
设置内存页的大小,默认4M,不要设置过大,一般在4-128M之间即可
-Xint
解释模式,无法做到分层编译优化等
-Xcomp
编译模式,开启后jvm启动会比较慢
-Xmixed
混合模式,jdk默认
-XX:+StackTraceInThrowable
是否将堆栈信息放到Throwable中,默认为true。如果要开启异常快速抛出,要么StackTraceInThrowable为false,要么OmitStackTraceInFastThrow为true
#调式参数
-XX:PrintFLSStatistics=1
分析CMS空闲列表空间,jdk6-8默认都是关闭的,打印每次GC前后内存碎片的统计信息,统计信息主要包括3个维度:Free Space、Max Chunk Size和Num Chunks,其中Free Space表示老生代当前空闲的总内存容量,Max Chunk Size表示老生代中最大的内存碎片所占的内存容量大小,Num Chunks表示老生代中总的内存碎片数。如果不为0(负数也行),那么每次GC前后都会打印出free list的统计信息;如果大于1,那么还会输出如下的gc日志,能够直观的看到碎片率,frag的值越大碎片化越严重,JVM的初始状态,frag的值为0.0000,即没有任何碎片。
-XX:PrintCMSStatistics=1
如果大于0,则输出关于CMS收集器的统计信息,例如,CMS年轻代收集的次数以及并发预清除数量
-XX:+PrintCompilation
打印编译信息
-XX:+PrintPromotionFailure
打印Promotion Failure更多的细节
-XX:+CITime
打印JIT编译器编译耗时,默认关闭
-XX:+PrintInlinint
打印方法内联信息
-XX:+TraceClassLoading
监控类的加载
-XX:+PrintClassHistogram
在控制台按下Ctrl+Break后,打印类的信息
-XX:+PrintCommandLineFlags
打印命令行启动参数
-XX:+PrintFlagsFinal
打印JDK的所有参数的默认信息
-XX:+PrintCodeCache
在JVM退出时输出codecache相关内存使用量
-XX:+PrintStringDeduplicationStatistics
打印字符串去重的一些信息
-XX:+PrintGCDetails
启用gc日志打印功能
-XX:+PrintHeapAtGC
打印GC前后的详细堆栈信息
-XX:+PrintGCDateStamps
打印可读的日期而不是时间戳
-XX:+PrintTenuringDistribution
查看每次minor GC后新的存活周期的阈值
-XX:+PrintGCApplicationStoppedTime
打印所有引起JVM停顿时间
-XX:+PrintGCApplicationConcurrentTime
打印JVM在两次停顿之间正常运行时间
-XX:+PrintSafepointStatistics
打印GC安全点的一些分析信息
-XX:PrintSafepointStatisticsCount=1
输出safepoint 的统计信息
-XX:+PrintGCCause
JDK7以前默认关闭,JDK8以后默认开启,gc日志中输出gc原因
-Xloggc:logs/gc.log
输出GC日志到指定文件中
-XX:+HeapDumpOnOutOfMemoryError
发生内存溢出是进行heap-dump
-XX:HeapDumpPath=logs/oom.log
这个参数与-XX:+HeapDumpOnOutOfMemoryError共同作用,设置heap-dump时内容输出文件
-XX:ErrorFile=logs/hs_err_%p.log
指定致命错误日志位置。一般在JVM发生致命错误时会输出类似hs_err_pid.log的文件,默认是在工作目录中(如果没有权限,会尝试在/tmp中创建),不过还是自己指定位置更好一些,便于收集和查找,避免丢失。
java -XX:+PrintFlagsFinal -version 打印所有的JDK的参数,可以用此命令结合dos的find命令(或Linux的grep命令来查看指定参数的默认值)
- 堆内存: 存储Java对象,默认为物理内存的1/64
- 线程栈: 存储局部变量(原子类型,引用)及其他,默认为1M
- 永久代: 存储类定义及常量池,注意JDK7/8的区别
- 二进制代码:JDK7与8,打开多层编译时的默认值不一样,从48到240M
- 堆外内存: 被Netty,堆外缓存等使用,默认最大值约为堆内存大小
4核4G 推荐参数组合
堆内存 + 线程数 * 线程栈 + 元空间 + 二进制代码 + 堆外内存
2048M + 1000 * 256K + 256M + 128M + (~1024M) = 3712M
-server -Xms2048M -Xmx2048M -Xmn1024M -Xss256K -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=1G -XX:SurvivorRatio=2 -XX:TargetSurvivorRatio=75 -XX:MaxTenuringThreshold=2 -XX:PretenureSizeThreshold=1048576 -XX:InitialCodeCacheSize=20971520 -XX:ReservedCodeCacheSize=134217728 -XX:+UseCodeCacheFlushing -XX:+TieredCompilation -XX:CICompilerCount=3 -XX:+ExplicitGCInvokesConcurrent -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:StringTableSize=300007 -XX:TLABWasteTargetPercent=2 -XX:ConcGCThreads=3 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSParallelInitialMarkEnabled -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+ScavengeBeforeFullGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+ParallelRefProcEnabled -XX:+UseBiasedLocking -XX:-OmitStackTraceInFastThrow -XX:AutoBoxCacheMax=10000 -XX:+AggressiveOpts -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -Xloggc:logs/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/oom.log -XX:ErrorFile=logs/hs_err_%p.log
4核8G 推荐参数组合
堆内存 + 线程数 * 线程栈 + 元空间 + 二进制代码 + 堆外内存
5120M + 1000 * 256K + 512M + 256M + (~1024M) = 7168M
-server -Xms5120M -Xmx5120M -Xmn2048M -Xss256K -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=512m -XX:MaxDirectMemorySize=1G -XX:SurvivorRatio=2 -XX:TargetSurvivorRatio=75 -XX:MaxTenuringThreshold=2 -XX:PretenureSizeThreshold=1048576 -XX:InitialCodeCacheSize=20971520 -XX:ReservedCodeCacheSize=268435456 -XX:+UseCodeCacheFlushing -XX:+TieredCompilation -XX:CICompilerCount=3 -XX:+ExplicitGCInvokesConcurrent -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:StringTableSize=300007 -XX:TLABWasteTargetPercent=2 -XX:ConcGCThreads=3 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSParallelInitialMarkEnabled -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+ScavengeBeforeFullGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+ParallelRefProcEnabled -XX:+UseBiasedLocking -XX:-OmitStackTraceInFastThrow -XX:AutoBoxCacheMax=10000 -XX:+AggressiveOpts -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -Xloggc:logs/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/oom.log -XX:ErrorFile=logs/hs_err_%p.log
4核8G 推荐参数组合【去除救助空间】
堆内存 + 线程数 * 线程栈 + 元空间 + 二进制代码 + 堆外内存
5120M + 1000 * 256K + 512M + 256M + (~1024M) = 7168M
-server -Xms5120M -Xmx5120M -Xmn2048M -Xss256K -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=512m -XX:MaxDirectMemorySize=1G -XX:SurvivorRatio=65535 -XX:MaxTenuringThreshold=0 -XX:PretenureSizeThreshold=2097152 -XX:InitialCodeCacheSize=20971520 -XX:ReservedCodeCacheSize=268435456 -XX:+UseCodeCacheFlushing -XX:+TieredCompilation -XX:CICompilerCount=3 -XX:+ExplicitGCInvokesConcurrent -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:StringTableSize=300007 -XX:TLABWasteTargetPercent=2 -XX:ConcGCThreads=3 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSInitiatingOccupancyFraction=85 -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSParallelInitialMarkEnabled -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+ScavengeBeforeFullGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+ParallelRefProcEnabled -XX:+UseBiasedLocking -XX:-OmitStackTraceInFastThrow -XX:AutoBoxCacheMax=20000 -XX:+AggressiveOpts -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -Xloggc:logs/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/oom.log -XX:ErrorFile=logs/hs_err_%p.log