如何规避容器内做Java堆dump导致容器崩溃的问题
写在前边
最近公司生产环境的容器云上出了个性能问题,为了做性能分析,使用 JDK 自带的 jmap 收集堆dump,出现了内存溢出导致了容器崩溃。
本篇文章将带你探究,如何规避容器内做堆 dump 导致容器崩溃的问题。适用于低于 Java 8 update 191版本的 JDK。
分析容器崩溃原因
确认容器崩溃的根本原因
毋庸置疑的是容器的内存占用超过了容器的限制,被 k8s 或 docker kill 掉了。
为什么会超过容器的限制呢?
有两种可能:
- Java 应用服务内存仍在攀升,就算不操作也会崩溃
jmap收集堆dump时占用内存所致
根据容器云平台的运维人员提供的监控截图,基本确认是第二种情况。

Ps: GMT时间+8小时即北京时间,18点左右出现容器内存急剧攀升的情况,而此时正在收集堆dump
为什么 jmap 会申请超过容器限制的内存呢?
首先,我们需要知道 jmap 本身是启动了另一个 JVM 来收集问题应用的 JVM堆的信息的。提到 JVM 运行在容器里会出现的问题,第一个就应该想到 JVM 对容器环境的支持问题,即低于 Java 8 update 191 版本的 JDK 会直接读到物理节点的内存,从而根据物理节点去申请内存,直接导致了容器崩溃。
本次环境就是 OpenJDK 8 低于 191 的版本,所以原因找到了。
解决方案
参考了两个版本的 jmap 官方文档,发现有个可以配置 jmap 所在 JVM 的参数 -Jflag
JDK 7
-J<flag>
Passes <flag> to the Java virtual machine on which jmap is run.
JDK 8
-Jflag
Passes flag to the Java Virtual Machine where the jmap command is running.
这里笔者确认了下这个flag参数最终传递到的是 jmap 所在的 JVM 中,而不是应用服务 JVM
所以方案就比较简单了,根据容器除应用服务 JVM 堆及元空间内存外的可用内存,设置个合理的JVM即可。
示例:容器限制 32G 内存,应用服务堆占用 24G,元空间占用 2G,则可用内存在 6G以下。给容器预留 1G 内存防止其崩溃,可以设置 jmap 使用 5G。
命令格式:jmap [输出dump文件配置] [设置jmap虚拟机参数] [进程号]
jmap -dump:format=b,file=/deployments/heap.hprof -J-Xmx5g 1
参考文档:
https://docs.oracle.com/javase/7/docs/technotes/tools/share/jmap.html
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html
本文同步发表在笔者博客园[https://www.cnblogs.com/hellxz/]与CSDN[https://blog.csdn.net/u012586326],禁止转载。
如何规避容器内做Java堆dump导致容器崩溃的问题的更多相关文章
- 容器中的Java堆大小调整:快速,轻松
在上一篇博客中,我们已经看到Java进行了改进,可以根据正在运行的环境(即物理机或容器(码头工人))识别内存.java的最初问题是,它无法弄清楚它是否在容器中运行,并且它曾经为容器运行所在的整个硬件捕 ...
- Java:常用的容器小记
Java:常用的容器小记 对 Java 中的 常用容器,做一个微不足道的小小小小记 容器类概述 常见容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 M ...
- 从容器里dump java堆实验探索(原创)
目标:从docker容器里dump java堆 模拟程序 占用空间500M, 设置启动JVM参数 docker启动命令 (PS:经过测试,至少要650M才能启动容器) 方式1: 通过docker ex ...
- 一文深入了解史上最强的Java堆内缓存框架Caffeine
它提供了一个近乎最佳的命中率.从性能上秒杀其他一堆进程内缓存框架,Spring5更是为了它放弃了使用多年的GuavaCache 缓存,在我们的日常开发中用的非常多,是我们应对各种性能问题支持高并发的一 ...
- 性能分析之-- JAVA Thread Dump 分析综述
性能分析之-- JAVA Thread Dump 分析综述 一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...
- 性能监控工具以及java堆分析OOM
一.性能监控工具 1.系统性能监控 Linux -确定系统运行的整体状态,基本定位问题所在 -uptime: ------系统时间 ------运行时间(例子中为127天) ------连接数(每 ...
- Java堆外内存之六:堆外内存溢出问题排查
一.堆外内存组成 通常JVM的参数我们会配置 -Xms 堆初始内存 -Xmx 堆最大内存 -XX:+UseG1GC/CMS 垃圾回收器 -XX:+DisableExplicitGC 禁止显示GC -X ...
- Java堆内存设置
转自:https://blog.csdn.net/Qiuzhongweiwei/article/details/81023645 堆内存设置 原理 JVM堆内存分为2块:永久空间和堆空间. 永久即持久 ...
- MAT工具定位分析Java堆内存泄漏问题方法
一.MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题.该工具提供了两种使用方式,一种是插件版,可以安装到Eclips ...
随机推荐
- 福利|GISer需知网站
一些GISer需知的网站推荐 1.https://www.usgs.gov/ 美国地质调查局 美国地质勘探局(United States Geological Survey,简称USGS),又译美国地 ...
- stash —— 一个极度实用的Git操作
今天要介绍的 Git 操作就是 stash,毫不夸张地说,每个用 Git 的开发人员都一定要会懂怎么使用. 在介绍之前,不知道你有没有和我一样的经历:某一天,我正在一个 feature 分支上高高兴兴 ...
- 《前端运维》一、Linux基础--06Shell流程控制
这章我们来学习下流程控制,简单来说就是逻辑判断和循环的写法.并不复杂,我们来简单地看下. 1.if语句 shell的if语句有两种写法,一种是shell脚本式的,一种是命令式的. if conditi ...
- nginx反向代理出现了代理的端口号
nginx反向代理显示了代理的端口号 nginx反向代理配置文件 upstream mall { server 1.1.1.1:10261 weight=1; } server { listen 80 ...
- TypeSciprt webpack配置
初始化 初始化项目 npm init -y 安装依赖 npm install ... --save-dev 依赖包列表 名称 作用 webpack 构建工具webpack webpack-cli we ...
- vue自定义指令?
除核心指令之外的指令, 使用directive进行注册. 指令自定义钩子函数: bind, inserted, update, componentUpdated, unbind
- 为什么要用 Spring Boot?
Spring Boot 优点非常多,如:独立运行简化配置自动配置无代码生成和XML配置应用监控上手容易Spring Boot 集这么多优点于一身,还有理由不使用它呢?
- 解释一下Spring AOP里面的几个名词?
(1)切面(Aspect):被抽取的公共模块,可能会横切多个对象.在Spring AOP中,切面可以使用通用类(基于模式的风格)或者在普通类中以@AspectJ注解来实现. (2)连接点(Join p ...
- Mac安装swoole中遇到的问题
转:https://blog.csdn.net/lishanleilixin/article/details/96137272 1:下载swoole源码,https://github.com/swoo ...
- Mybatis 的一级、二级缓存?
1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 C ...