JVM参数总结

性能调优:

-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模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容