容器下 -XX:+HeapDumpOnOutOfMemoryError 未生成 dump 文件的问题

标签: JVM HeapDumpOnOutOfMemoryError K8S | 发表时间:2019-09-05 18:59 | 作者:coderbee
出处:https://coderbee.net

JVM 的启动命令一般都会加上参数 -XX:+HeapDumpOnOutOfMemoryError=/path/to/save/dump.hprof,用于在 JVM 发生 OOM 时自动生成内存 dump 文件。

应用在生产环境是运行在 Docker 容器里、由 K8S 负责管理容器。

但是有的应用发生 OOM 时,在 /path/to/save/dump.hprof 路径下并没有生成对应的 dump 文件。

优秀的运维同事小伍在测试环境进行了各种测试,得出以下两种情况没法生产文件:
1. /path/to/save/ 如果中间层的目录没有提前建好,是没法生成 dump 文件的。
2. 堆外内存不足 800M 时,也没法生成 dump 文件。

第1点没啥问题,文件所在的目录没有提前建好是会报 java.io.FileNotFoundException 异常的。

第2点其实是因为 JVM 运行在容器里,容器允许使用的内存是有上限的,比如分配给容器的是 4G 内存,JVM 堆占用 80%,那么堆外内存就只能占用 20% 即 800M。

发生 OOM 时,JVM 占用了 3.2G;对于堆外内存,线程、JVM自身、应用申请的本地内存等都要在这里分配,OOM dump 也需要利用堆外内存,容器使用的总内存达到 4G 内存上限时,触发系统的 oomkiller 机制把容器进程杀死。

这带来一个小问题:如果要保证 JVM OOM 自动 dump 机制能顺利执行,我们就需要在容器里预留出足够的堆外内存,每个容器都得考虑预留,这就带来内存利用率的问题了。如果 JVM 直接运行在宿主操作系统,没有容器的限制,能申请的堆外内存是受限于系统能分配的内存的,不同应用的 JVM 可共享这个可分配内存空间。


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

相关 [容器 xx heapdumponoutofmemoryerror] 推荐:

容器下 -XX:+HeapDumpOnOutOfMemoryError 未生成 dump 文件的问题

- - coderbee笔记
JVM 的启动命令一般都会加上参数 -XX:+HeapDumpOnOutOfMemoryError=/path/to/save/dump.hprof,用于在 JVM 发生 OOM 时自动生成内存 dump 文件. 应用在生产环境是运行在 Docker 容器里、由 K8S 负责管理容器. 但是有的应用发生 OOM 时,在 /path/to/save/dump.hprof 路径下并没有生成对应的 dump 文件.

xx的最高境界[24p]

- lei - 乐淘吧
xx的最高境界[24p] is a post from: 乐淘吧-淘快乐. 591mmm旗舰店入驻淘宝商城!打造品牌全场以3.8折大型活动!. 最新淘宝网各大排行第一的店铺!(官方数据倾力打造. 犯罪最高境界—心理暗示杀人 (0.937). “我爸是李刚”这句口号真的冲出亚洲,走向世界了. 还是该叫你尔基 (RANDOM - 0.008).

xx记忆法,某中学楼梯

- olddog1st - 微博段子
原文地址:http://www.tduanzi.com/tweets/14375.html.

【转】HeapDumpOnOutOfMemoryError堆转储实践和一些分析

- - 编程语言 - ITeye博客
使用了标志-XX:+HeapDumpOnOutOfMemoryError,JVM会在遇到OutOfMemoryError时拍摄一个“堆转储快照”,并将其保存在一个文件中. 对如下一段代码,【代码1】.       设置虚拟机参数为:-Xmx40m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\Java\dump.

最隐蔽,最小巧,最精致的女性XX器

- Evan - 宅映像
美国有一款USB手指,不但可储存资料,还可随时满足女士的性需求,因为它本身是一件女性专用震荡器. 这款震荡器USB名叫The Duet(图),长11.6厘米,阔2.7厘米,厚1.23厘米,配备双摩打和五段变速,操作时非常宁静,没有电线和电池,只要将USB插进电脑的USB埠就会充电,每次充电后可连续使用四小时.

Java中的CopyOnWrite容器

- - 酷 壳 - CoolShell.cn
感谢  清英 同学的投稿. Copy-On-Write简称COW,是一种用于程序设计中的优化策略. 其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略. 从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet.

有赞容器化实践

- - SegmentFault 最新的文章
容器化已经成为一种趋势,它可以解决很多运维中的痛点,比如效率、成本、稳定性等问题,而接入容器的过程中往往也会碰到很多问题和不便. 在有赞最开始做容器化是为了快速交付开发测试环境,在容器化的过程中,我们碰到过容器技术、运维体系适配、用户使用习惯改变等各种问题,本文主要介绍有赞容器化过程中碰到的问题以及采取的方案.

容器网络并不难

- - DockOne.io
【编者的话】本文通过实验方法一步步揭秘容器网络是如何实现容器间的互通,以及容器和外部网络是如何连通的. 使用容器总是感觉像使用魔法一样. 对于那些理解底层原理的人来说容器很好用,但是对于不理解的人来说就是个噩梦. 很幸运的是,我们已经研究容器技术很久了,甚至成功揭秘 容器只是隔离并受限的Linux进程, 运行容器并不需要镜像,以及另一个方面, 构建镜像需要运行一些容器.

美团容器平台架构及容器技术实践

- - 美团点评技术团队
本文根据美团基础架构部/容器研发中心技术总监欧阳坚在2018 QCon(全球软件开发大会)上的演讲内容整理而成. 美团的容器集群管理平台叫做HULK. 漫威动画里的HULK在发怒时会变成“绿巨人”,它的这个特性和容器的“弹性伸缩”很像,所以我们给这个平台起名为HULK. 貌似有一些公司的容器平台也叫这个名字,纯属巧合.

Web容器线程池机制小议

- - ITeye博客
从刚开始学习java,我们就被告知Java是一种支持多线程的语言,每条程序指令都会在一个线程中执行,而启动主线程的入口,是可执行类中的main方法. 我们可以在main方法或其调用的方法中创建新的线程以实现多线程、并发处理的效果. Java入门资料上介绍线程时往往会说明一点,创建线程不是免费的,是有成本的--对内存的消耗、对CPU切换调度的消耗都是成本,所以像数据库连接池这类“创建昂贵型”资源一样,创建好的线程优先被复用而不是每次都创建新的,这就是线程池出现的原因.