CMS垃圾回收案例分享(JDK1.7) - 如何避免JVM内存资源耗尽

案例描述

我们在做项目迁移后 (jdk1.6 ->1.7, 框架升级到spring,业务代码不做修改),发现迁移后的一些instance的gcoverhead在某个特定的时间段(我们用「T」来表示)会突然飙高,最终出现了jvm heap memory被耗尽的情况,导致应用无法响应。


image.png

案例分析

我们首先分析这类问题是什么原因造成的。我们具体找了其中一台机器查看metrics,发现jvm heap memory在「T」时间段骤降,最终无法恢复。

image.png

我们查看了对应时间段「T」的log,我们发现在这段期间有很多请求(我们用A代替)超时的异常,这类request会去一个service(我们用B代替)上拿资源。日志显示「T」时间段A类请求的耗时特别长,50000ms的请求比比皆是。我们开始以为A类请求是在请求大文件,所以超时时间设置比较大,因为这个项目本身就是要进行各类文件的操作。但从日志发现,这类文件也不过6M。这对于一个内网之间的请求调用而言,不是什么压力。所以我们猜测,是网络波动或者B服务本身不稳定导致的问题,。我们随后查看了A请求超时时间设置,为900000ms.

然后我们把目光转移到了迁移前老的项目,我们发现在该特定时段「T」也会出现请求超时这类错误,A请求的超时时间也为900000ms。迁移前老的项目也会因为过高的gcoverhead导致个别instance内存被耗尽,但影响的范围很小,对于个别instance出现异常,dev/ops的job会负责重启项目。而且老的项目对于这种超时异常导致的问题的承受能力是25k per hour,而迁移后的项目,仅仅是3.5k。

image.png

是什么差异导致这种不同的行为呢?我们先看一下迁移前后和迁移后的一些参数对比

image.png

参数的差异最终锁定到young generation的占比。我们拿到了项目的heap dump。对于ibm jdk1.6和open jdk1.7,两者使用的都是分代垃圾回收器,open jdk1.7里面就是我们熟悉的CMS。我们通过图片可以看出最后gcoverhead增高是由于old generation的频繁full gc导致的。对于CMS垃圾回收器的原理,这里简单描述一下,一个实例一般最开始创建于young generation(默认Survivor0 : Survivor1 : Eden = 1 : 1 : 8)的Eden区,在这个区域会进行young gc,触发条件Eden区满了。对象经过若干次(java对象头里面用4个bit来存储gc标记,最大次数是15,但针对CMS,默认是4次。JVM 参数的设定为-XX:MaxTenuringThreshold 。这个参数和 -XX:TargetSurvivorRatio配合使用:期望s区存活大小的参数。默认值为50,即50%。当一个S区中所有的age对象的大小如果大于等于Desired survivor size,则重新计算threshold,以age和MaxTenuringThreshold两者的最小值为准。来决定是否要晋升到老年代young gc后如果还存活,会进入老年代,当老年代满了,会触发full gc,full gc会STW,会消耗大量资源。
所以看出,升级到老年代,不一定完全按照age ,如果object 增长过大, 甚至只经过一次就直接进入到老年代了。

image.png

从图中我们可以看到Young generation中minior gc的频率特别高,原因是我们迁移后的项目的young generation的占比过低(800m/6000m,一般推荐1:3)这样就会导致一个问题,对象过早晋升到年老代,从而触发年老代频繁的full gc。对应到刚才的案例就是这些很占资源的长链接实例,经过多次young gc一直没有被回收 最终晋升到老年代 导致触发频繁的full gc 最终消耗尽jvm资源

image.png
image.png

解决办法

在迁移后的项目里面,框架默认young generation为800m,最终我们将迁移后的项目设定为2000m,当出现这种大面积资源获取缓慢时,项目不再出现抗不过的情况。至于为什么在timeout 900000ms这块没有进行调优,因为目前项目是在迁移阶段,我们是保持和老的项目相同的配置。而且问题我们有向用户那边反应,至于后续的更改,由用户来决定。

参考文档
https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html

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

推荐阅读更多精彩内容