阿里云 JDK8 垃圾回收参数参考

-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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值