【第五期:Java网络服务的垃圾回收性能调优】

Java网络服务的垃圾回收性能调优

以下内容主要来自于对(Tuning Java Garbage Collection for Web Services)这篇文章的翻译,建议大家先读原文,自己的翻译水平太有限

作为java垃圾回收领域的专家,我不厌其烦地一遍又一遍地回答相同的问题:“为什么我的服务会有频繁的GC停顿?”;“如何去避免长时间的GC停顿?”;“并发模式(应该指CMS中的并发标记)失败的后果有多严重?”。本着授人以鱼不如授人以渔的精神,我写下这篇文章来教你如何进行垃圾回收调优,以使得你的服务可以像LinkedIn一样避免长时间垃圾回收而流畅运行。请注意,我们调优对象是类似于LinkedIn一样的服务,且我们将对程序如何使用内存做出一些假设。基本原则将具有普适性,但如果使用内存的方式与假设不同的话,则下面讲的技术和分析方法是失效的。

值得庆幸的是,我们会简单地选择使用CMS作为垃圾回收算法(因为在大部分情况下,默认的就是最好的),在大部分情况(非所有情况)下,默认方法的性表现的都很出色。在高负载的情况下,这也是你最怕出现问题的时候,默认方法和参数将表现不太理想(strugling(不知如何翻译是好!!)),幸运的是,当你认真排查full GC日志的时候,很很容易地找出问题所在。

如何阅读GC日志

Young GC(大部分情况下).

年轻代有两个survivor区,但每次只会使用一个survivor。survivor可存着上一次垃圾回收后幸存的对象,之所以没有将它们放入老年代,因为我们认为他们(大部分)会很快会消亡(不可达),而在老年代回收他们的代价将变得非常高。值得注意的是,对于经过一至两次垃圾回收就会消亡的对象,虽然放在suvivor区进行回收代价也是挺高的,但相对于放在老年代回收要好很多。对于LinkedIn的服务,大部分内存使用都是在外部请求的进程中消耗的,经过两至三次垃圾回收,再将存活的对象放入老年代表现得最好(这句不知道如何翻译,就按照自己的理解了)

CMS

CMS是很复杂的,因此我们忽略了很多不重要的内部,为了达到我们的目的,我们只需要关注几个重要的阶段。
在并发标记清理(concurrent mark and sweep)有很多内容,但并不重要。大部分情况下,我们更关注,full GC 何时开始(老年代占比多少时触发full GC)以及full GC需要花多长时间。在垃圾清理完成之前,如果老年代新生的对象占满了内存,则虚拟机则会在GC完成之前发生停顿。如果由于历史的原因,在使用单线程的垃圾回收器,通常这并不是一个好的选择…….

如何使用GC日志数据

跳过前面内容的读者,需要从现在开始认真阅读了。带着你刚学的如何阅读GC日志的知识,我们将计算以下6个参数(参数都将简写,为方便编辑公式):
1.对象分配速率Allocation Rate(简写为AR):年轻代的大小除以两次Young GC之间的间隔
2.提升速率The Promotion Rate(PR):老年代的增长速度.
3.suvivor死亡率The Survivor Death Ratio(SDR):第N代suvivor的大小除以第N-1代的大小,
4.老年代垃圾回收时间Old Gen collection times(OGCT):从CMS -initial-mark 到 concurrent-reset的时间,即一次FULL GC时间,你需要了解平均值和最大值.
5.Young GC时间(YGCT):平均值和最大值.
6.老年代缓冲区大小(OGB):PR*max(OGCT)(1+a).
我经常提醒大家既然内存是由项目分配置的,那GC调优就要调整项目本身。值得注意的是,项目调整主要是调整分配速率和SDR。

以上这些指标为我们调整堆起了重要的引导作用。首先,你要确定在一次CMS后,OGB得到了清理,否则你在高负载情况下你将遇到并发模式失败。

几种调优的方向

只要满足基本条件,我们可以通过以下三件事情(技术上我们可以增大或减小这些参数,但基本都是增大这些参数)来改善GC效率.
1.增加年轻代的大小:这样,一个垃圾回收之前,将容纳更多的垃圾对象的产生,而且将会降低Young GC 的执行频率。假设你的服务分配内存只依赖于外部请求,增大Young的大小并不会影响YOUNG GC 复制到suvivor区Objects的数量(大小更合适),因此会降低PR。但是这会让Yong GC 的时间变得更长,如果Young GC的时间已经达到了你的可容忍度,你就要好好考虑了。
2.增加最大的surviror age:这会使得更多对象在被移至老年代之前死亡,将降低老年代的对象的增长速率并降低full GC执行次数,且OGB所需要的大小也可以降低。这也意味着你需要增加survivor空间大小,否则当survivor发生溢出时,就会将所有的对象拷贝至老年代,而且会增加survivor区对象的拷贝的时间。当调.整survivor age时,需要监控SDR,当它达到50%时(为何是这个?),应该将其移至老年代。
3.增加老年代的大小:这无疑会降低fullGC的频率,幸运的是CMS 停顿(初始标记阶段和再标签阶段)的时间会相对稳定(为啥会稳定?),这一特点将保证你的服务不会在高负载情况下产生内存溢出。

总结:

调整垃圾回收器有以下原则:
1.首先确定你的服务是否需要调优,如果停顿时间和频率都没有问题,一般你不需要调整.
2.如果AR或者PR有问题,请重写代码,不要随意在代码中分配内存.
3.确定你需要改变的目标,然后做出改变,并确定是否达到了你的目标。

我自己推导了几个重要的公式,但不知道怎么在markdown上编辑,如果有兴趣可以找我讨论一下

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

推荐阅读更多精彩内容