GZIP造成JAVA Native Memory泄漏案例

本文原载于Elastic中文社区: https://elasticsearch.cn/publish/article/178

近期公司某个线上JAVA应用出现内存泄漏问题,整个排查过程颇费周折,前后耗费了近2周才定位到问题根源并予以修复。排查问题过程中在网上翻查了大量的资料,发现国内几乎没有文章能对同类问题做透彻的分析和找到问题真正根源的。即使国外的各类博客和文章,也少有正确的分析。因此感觉有必要对问题根源和相关案例做一个总结,希望能为国内开发者避免踩上同类陷阱提供一些帮助。

开门见山,先列一下收集到的同类问题案例集:

这些案例涉及到的不乏一些流行的开源软件如Lucene, Elasticsearch, Kafka,并且某些Bug版本在大量公司有线上部署。这些案例的问题根源都惊人的一致,即在JAVA里使用GZIP库进行数据流的压缩/解压之后,忘记调用流的close()方法,从而造成native memory的泄漏。

关于这类问题的分析方法和工具,上面收集的案例集里有非常详尽的描述,这里就不再班门弄斧一一赘述了。只结合我们自己的案例,做一个比较简短的介绍和总结。

我们公司这个案例的排查之所以花了近2个礼拜,其中一个重要原因是这个应用是通过Docker部署的。应用上线运行一段时间后,会被Docker的OOM killer给Kill掉,查看JVM监控数据却发现Heap使用得很少,甚至都没有old GC发生过,top里看这个JAVA进程的RSS内存占用远高于分配的Heap大小。很自然的,研发人员第一反应是底层系统的问题,注意力被转移到研究各种Docker内存相关的参数上。 而我知道ElasticCloud曾经也被某些版本的linux内核bug困扰,docker可能会误杀JVM (参见Memory Issues We'll Remember),bug的内核版本和docker版本和我们线上部署的又很接近,因此这个内核bug也被加入到了怀疑列表中。 事后证明这个方向是错误的,浪费了一些时间。

在一段时间排查无果后,为了缩小排查范围,我们决定将这个应用部署到VM上做对比测试。结果内存泄漏问题依然存在,因而排除掉了Linux内核和docker本身的问题。

同期也参考过一篇关于DirectByteByffer造成堆外内存泄漏问题的分析博客,JVM源码分析之堆外内存完全解读,考虑到问题现象和我们类似,我们的应用也有用到netty,DBB泄漏也被列为怀疑对象。然而在JVM启动里参数里对MaxDirectMemorySize做了限制后,经过一段时间对外服务,JAVA进程的RSS仍然会远超过HEAP + MDM设置的大小。

这期间我们也使用过NMT工具分析HEAP内存占用情况,然而这个工具报告出来的内存远小于RSS,也就是说这多出来的内存并没有被JVM本身用到,泄漏的是native memory。 JAVA应用产生native memory泄漏通常是在使用某些native库时造成的,因此注意力转移到JNI。

最终帮助我们找到正确方向的是开头列的 Debugging Java Native Memory Leaks 这篇由Twitter工程师写的博客。 博客里介绍了如何使用jemalloc来替换glibc的malloc,通过拦截和追踪JVM对native memory的分配申请,从而可以分析出HEAP以外的内存分配由哪些方法调用产生的。博客里提到产生泄漏的原因是忘记关闭GZIPOutputStream,巧合的是我们线上应用也使用了gzip压缩服务请求数据,于是查看了一下相关的代码,果然发现有忘记关闭的stream。 找到根源后,解决问题就简单了,一行代码修复。

对于ElasticSearch用户,要注意的是某些版本存在这个泄漏问题,对于小内存机器上运行的ES服务可能会有较大的影响。 可是官方没有明确列出所有受影响的版本,只在博客里提到5.2.1修复了这些问题。 因此如果你有顾虑的话,可以用top命令看一下ES JAVA进程的RSS消耗,如果大大于分配的HEAP,有可能就是中招啦。

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

推荐阅读更多精彩内容