性能调优:
-XX:-OmitStackTraceInFastThrow 去掉优化多次抛异常
-XX:-UseBiasedLocking 去掉偏向锁(锁竞争激烈的场景下加上)
-XX:-UseCounterDecay 禁止JIT调用计数器衰减(默认情况下,每次GC时会对调用计数器进行砍半的操作,导致有些方法一直温热,永远都达不到触发C2编译的1万次的阀值)
-XX:AutoBoxCacheMax=20000 设置Integer缓存的最大值,默认是127。这个只对Integer有效,对Long无效。这个参数只对 server 模式生效
-XX:+UseGCTaskAffinity 将任务映射到GC线程
-XX:+ParallelRefProcEnabled 默认为false,并行的处理Reference对象,如WeakReference,除非在GC log里出现Reference处理时间较长的日志,否则效果不会很明显
-XX:-TieredCompilation 禁用中间编译层(1、2、3),以便在最大优化级别(C2)处解释或编译方法
-XX:+UseStringDeduplication JVM在做GC的同时会做重复字符串消除。只适用G1,只适用于长期存活的对象(默认GC 3次后才有资格,可通过 -XX:StringDeduplicationAgeThreshold=n修改阈值)
-XX:+AlwaysPreTouch 启动时就真实分配物理内存,默认是使用到才分配。降低第一次YGC的停顿时间,提示Eden区分配对象速度,但是启动速度增大20s(8G堆)
-XX:+PerfDisableSharedMem 强制JVM将匿名内存用于性能计数器,而不是映射文件。这有助于避免自发磁盘I/O导致的随机VM暂停
-XX:ReservedCodeCacheSize=240M 设置codecache的大小,比如我们jit编译的代码都是放在codecache里的(机器码代码),所以codecache如果满了的话,那带来的问题就是无法再jit编译了,运行速度会降低一个数量级
-XX:GuaranteedSafepointInterval=5000 每经过这个配置的时间,都会让所有线程进入 Safepoint,一旦所有线程都进入,立刻从 Safepoint 恢复。这个定时主要是为了一些没必要立刻 Stop the world 的任务执行
JVM通用配置
-Xms2048M -Xmx2048M 堆最小、最大的大小
-Xmn3584m 年轻代大小,优先级比NewRatio,会覆盖 NewRatio 的配置
-XX:MetaspaceSize=200m 元空间初始化大小,建议设置,默认是20m,扩容时会触发FULL GC,程序启动出现FULL GC 可以考虑设置大点这个值
-XX:MaxMetaspaceSize=300m 元空间最大大小
-XX:NewRatio=1 老年代/新生代的比例,只能整数。
-XX:MaxDirectMemorySize=1024m 设置堆外直接内存,默认64M。到达该值会触发FULL GC
-XX:+ScavengeBeforeFullGC 在执行FullGC之前执行MinorGC,VM会分2次停顿,可以缩短最大停顿时间
-XX:MaxTenuringThreshold=4 对象年龄到达该阈值就会晋升老年代,默认一般是15,CMS默认是6。
-XX:ParallelGCThreads=12 并行 GC 线程的数量,一般最好和 CPU 核心数量相当。这个参数只要是并行 GC 都可以使用。默认情况下,当 CPU 数量小于8, ParallelGCThreads 的值等于 CPU 数量,当 CPU 数量大于 8 时,则使用公式:3 +((5*CPU)/ 8)
-XX:ConcGCThreads=12 并行标记的并发线程数。默认是 (ParallelGCThreads+3)/4
CMS
-XX:+UseConcMarkSweepGC 开启老年代使用 CMS 垃圾收集器
-XX:+CMSParallelRemarkEnabled 让重新标记阶段进行并行重新标记,减少暂停时间
-XX:+CMSClassUnloadingEnabled CMS垃圾收集器默认情况下不会卸载类,通过这个开启
-XX:+CMSScavengeBeforeRemark 在重新标记之前对年轻代做一次minor GC。在重新标记阶段,标记范围是整个堆,包含新生代和老年代。扫描新生代的原因是老年代无用的对象可能被新生代引用。在重新标记之前对新生代做一次minor gc,减少新生代的存活对象,从而降低重新标记时的开销。
-XX:+UseCMSInitiatingOccupancyOnly 命令JVM不基于运行时收集的数据来启动CMS垃圾收集周期。如果没有指定这个,只有第一次会使用CMSInitiatingPermOccupancyFraction=65 这个值. 后面的情况会自动调整
-XX:+ExplicitGCInvokesConcurrent 在做System.gc()时会做background模式CMS GC,即并行FULL GC,可提高FULL GC效率。注,该参数在允许systemGC且使用CMS GC时有效
-XX:CMSInitiatingOccupancyFraction=75 当老年代达到这个阈值时,触发CMS垃圾回收
-XX:+CMSParallelInitialMarkEnabled 开启cms初始标记过程中的并行化,进一步提升初始化标记效率
parnew 垃圾收集器
-XX:ParGCCardsPerStrideChunk=8192 指 parnew 垃圾收集器每个线程处理的CardTable数量,默认256.8192这个指标是openJdk测试得的一个参考值
日志方面
-XX:+UnlockDiagnosticVMOptions 解锁任何额外的隐藏参数
-XX:+PrintCommandLineFlags 打印显式隐式参数
-XX:+PrintGCDetails 打印GC的详细信息
-XX:+PrintGCDateStamps 打印CG发生的时间戳
-XX:+PrintHeapAtGC 每一次GC前和GC后,都打印堆信息
-XX:+PrintTenuringDistribution 输出显示在survivor空间里面有效的对象的岁数情况。这个参数对于设置-XX:MaxTenuringThreshold有很大帮助,阀值需要长时间观察对象分布,设置合理即可
-XX:+PrintPromotionFailure 如果有新生代对象晋升到老生代失败出现的FULL GC,打开这个日志可以看到更详细的信息
-XX:+UseGCLogFileRotation GC日志文件滚动生成
-XX:NumberOfGCLogFiles=10 GC日志保留文件数
-XX:GCLogFileSize=10M 每个GC文件的大小
-Xloggc:./gc-%t.log %t会给文件名添加时间戳后缀,格式是YYYY-MM-DD_HH-MM-SS。
-XX:+PrintSafepointStatistics 打印安全点统计信息
-XX:PrintSafepointStatisticsCount=1 设置打印安全点统计信息的次数
-XX:+HeapDumpOnOutOfMemoryError JVM发生OOM时,自动生成DUMP文件
-XX:-DisplayVMOutput
-XX:+LogVMOutput 必须配合参数-XX:+UnlockDiagnosticVMOptions使用,并且只能加在其后才能生效
-XX:LogFile=./vm.log 编译时日志输出
G1参数
-XX:G1HeapRegionSize=n
设置的 G1 区域的大小。值是 2 的幂,范围是 1 MB 到 32 MB 之间。目标是根据最小的 Java 堆大小划分出约 2048 个区域。
-XX:MaxGCPauseMillis=200
为所需的最长暂停时间设置目标值。默认值是 200 毫秒。指定的值不适用于您的堆大小。
-XX:G1NewSizePercent=5
设置要用作年轻代大小最小值的堆百分比。默认值是 Java 堆的 5%。这是一个实验性的标志。有关示例,请参见“如何解锁实验性虚拟机标志”。此设置取代了 -XX:DefaultMinNewGenPercent 设置。Java HotSpot VM build 23 中没有此设置。
-XX:G1MaxNewSizePercent=60
设置要用作年轻代大小最大值的堆大小百分比。默认值是 Java 堆的 60%。这是一个实验性的标志。有关示例,请参见“如何解锁实验性虚拟机标志”。此设置取代了 -XX:DefaultMaxNewGenPercent 设置。Java HotSpot VM build 23 中没有此设置。
-XX:ParallelGCThreads=n
设置 STW 工作线程数的值。将 n 的值设置为逻辑处理器的数量。n 的值与逻辑处理器的数量相同,最多为 8。
如果逻辑处理器不止八个,则将 n 的值设置为逻辑处理器数的 5/8 左右。这适用于大多数情况,除非是较大的 SPARC 系统,其中 n 的值可以是逻辑处理器数的 5/16 左右。
-XX:ConcGCThreads=n
设置并发标记的线程数。将 n 设置为并行垃圾回收线程数 (ParallelGCThreads) 的 1/4 左右。
-XX:InitiatingHeapOccupancyPercent=45
设置触发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%。
-XX:G1MixedGCLiveThresholdPercent=65
为混合垃圾回收周期中要包括的旧区域设置占用率阈值。默认占用率为 65%。这是一个实验性的标志。有关示例,请参见“如何解锁实验性虚拟机标志”。此设置取代了 -XX:G1OldCSetRegionLiveThresholdPercent 设置。Java HotSpot VM build 23 中没有此设置。
-XX:G1HeapWastePercent=10
设置您愿意浪费的堆百分比。如果可回收百分比小于堆废物百分比,Java HotSpot VM 不会启动混合垃圾回收周期。默认值是 10%。Java HotSpot VM build 23 中没有此设置。
-XX:G1MixedGCCountTarget=8
设置标记周期完成后,对存活数据上限为 G1MixedGCLIveThresholdPercent 的旧区域执行混合垃圾回收的目标次数。默认值是 8 次混合垃圾回收。混合回收的目标是要控制在此目标次数以内。Java HotSpot VM build 23 中没有此设置。
-XX:G1OldCSetRegionThresholdPercent=10
设置混合垃圾回收期间要回收的最大旧区域数。默认值是 Java 堆的 10%。Java HotSpot VM build 23 中没有此设置。
-XX:G1ReservePercent=10
设置作为空闲空间的预留内存百分比,以降低目标空间溢出的风险。默认值是 10%。增加或减少百分比时,请确保对总的 Java 堆调整相同的量。Java HotSpot VM build 23 中没有此设置。
非JVM内部参数
-Djava.security.egd=file:/dev/./urandom 加快 SecureRandom 随机数产生过程
-Djava.net.preferIPv4Stack=true 当java.net.preferIPv4Stack为默认值false时,在支持IPv6的双栈系统上,使用Java的Socket会默认通过底层native方法创建一个IPv6 Socket,这个IPv6 Socket可以同时支持和IPv4或IPv6主机通信。如果设置为true,Java程序将无法使用IPv6进行网络通信,也就是仅支持IPv4
-Djava.awt.headless=true Headless模式是系统的一种配置模式。在系统可能缺少显示设备、键盘或鼠标这些外设的情况下可以使用该模式。一般是在程序开始激活headless模式,告诉程序,现在你要工作在Headless mode下,就不要指望硬件帮忙了,你得自力更生,依靠系统的计算能力模拟出这些特性来
-Dsun.net.inetaddr.ttl=60 JVM缓存DNS解析结果的时间(秒) ,参考这篇文章
-server server模式