深入理解JVM——如何在Java 9以上的JVM中微调G1垃圾回收?

垃圾回收器在执行某些垃圾回收任务时会暂停所有应用程序线程。这些暂停有时被称为Stop-The-World暂停,因此尽可能避免这种情况是GC调优的主要目标,因为它们会对Java应用程序的性能产生巨大影响。

调整堆大小

垃圾回收调优的第一步是调整堆的大小。这是因为如果堆太小,则会发生太多的GC以回收内存,这会降低整体应用程序吞吐量,如果堆太大,那么GC发生概率会少,一旦发生GC则需要很长时间,这样你的应用的响应时间指标就会受到影响。并行收集器特别容易受到此问题的影响,因此如果您需要大堆并且暂停时间较短,那么您应该尝试使用G1GC收集器。

旁注:因为Java 9和Shenandoah垃圾收集器在撰写本文时仍被视为“实验性”时,不推荐使用并发标记扫描(CMS)收集器。因此,如果您正在运行在线交互式应用程序,那么G1GC应该是您的默认选择,如果您正在运行脱机批处理应用程序,那么并行收集器应该是您的首选。

堆的大小由两个值控制:使用ms标志指定的初始值和使用mx标志指定的最大值。

-Xms1g -Xmx8g

堆的初始和最大大小允许JVM根据工作负载自动调整堆大小。如果JVM遇到内存压力并且观察到GC执行过多,它会不断增加堆,直到内存压力消失,或直到堆达到其最大大小。如果内存压力很低,JVM还可以通过缩小堆大小来决定减少暂停时间。这个过程称为自适应大小调整,它不仅可以调整堆的整体大小,还可以调整年轻代和老代的大小和比例。

如果您花时间精细调整应用程序的GC行为和大小,则可以选择关闭自适应大小调整。这可以节省JVM计算堆大小所需的一小段时间。您可以通过将标志设置UseAdaptiveSizePolicy为false 来执行此操作。

-XX:-UseAdaptiveSizePolicy

此外,将初始堆大小设置为与最大堆大小相同的值或将初始新gen大小设置为与最大新gen大小相同的值只能关闭大小自适应调整行为的一部分。

强烈建议的设置最大堆大小的准则是最大堆大小不应超过计算机上的物理内存量。如果您运行多个JVM,则最大堆大小的总和不应超过计算机的物理内存。

设置最大堆大小的更一般建议是:在完整GC之后堆占用大约30%,要计算此值,您可以在GC日志中查找完整GC发生的条目,并观察GC完成时使用的内存量。或者,您可以运行应用程序,直到它达到稳定状态,然后使用jconsole或强制使用完整的GC jcmd。

调整GC性能

如果启用了自适应大小调整,则可以使用MaxGCPauseMillis标志来调整GC行为,此标志设置最大GC暂停时间的目标,当与Parallel收集器一起使用时,JVM将调整年轻一代和老一代的大小,以便尝试达到目标,然后它将调整堆的大小,以便在GC中花费的时间不超过某个值,默认情况下为1%。

G1GC的目标之一是它只需要很少的调整,因此,在G1GC中,一个调整参数MaxGCPauseMillis执行以下所有优化,以尝试实现指定的暂停时间目标:

  • 调整堆的大小
  • 更快开始后台处理,
  • 调整阈值:对象成为老生代的对象的时间期限,
  • 调整在混合GC循环期间处理的旧区域数。

在G1GC中,标志的默认值为200 ms。虽然你可能想把它设置成一个非常小的20毫秒,但请注意,为了达到这个目的,垃圾收集器会将年轻一代收缩到一个非常小的尺寸并收集较少的老一代,这最终会导致老一代垃圾过多的情况,系统必须执行完整的GC,这是不可取的。

修复并发模式故障

G1GC是一个并发收集器,这意味着当应用程序线程仍在运行时,垃圾收集进程的某些阶段可以并发运行,并且由于正在运行的应用程序可以继续产生垃圾,我们可能会遇到应用程序耗尽老生代内存而垃圾收集器仍在垃圾收集过程中的情况。换句话说,正在运行的应用程序生成的垃圾比它可以清理的速度快。这种情况称为并发模式故障、失效故障或疏散故障,具体取决于故障发生的时间。如果您在GC日志中看到很多这些错误,解决方案是增加堆的大小,更早地启动G1后台处理,或者通过使用更多后台线程来加速GC处理。

要更频繁地执行G1后台活动,您可以降低触发G1循环的阈值。这是通过减少InitiatingHeapOccupancyPercent标志的值来实现的。

-XX:InitiatingHeapOccupancyPercent=45

默认情况下,此标志设置为45。这意味着当堆填充45%时会触发GC循环。减少此值意味着GC会更早且更频繁地触发。但应注意的是,该值不会设置为太低而导致GC过于频繁发生。

要增加后台线程数,请使用该ConcGCThreads标志。

-XX:ConcGCThreads=4

此标志的默认值设置为ParallelGCThreadss加2除以4.只要计算机上有足够的CPU可用,就可以增加此值而不会导致任何性能损失。

如果调整堆大小并调整收集器对您不起作用,那么您可以尝试另一个收集器。如果你仍然没有取得好成绩,那么你需要考虑调整应用程序代码本身。

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

推荐阅读更多精彩内容