今天公司项目收到线上告警,某个集群监控到OOM了,于是立马去服务器上查看相关日志:

java.lang.OutOfMemoryError: Java heap space
Dumping heap to /applog/java_pid69.hprof ...
Unable to create /applog/java_pid69.hprof: File exists> 看到这边顿时心里凉了半截, 该打的dump文件没生成, 到 /applog目录下看对应的 dump生成时间, 果然是几天之前的查看  JVM 启动参数:~~~properties
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/applog

是因为这个配置,只会在OOM时候生成 java_pid.hprof的文件么, 没有自动添加时间戳?

于是, 我自己本地搭建了一个项目,验证这个问题:

package com.itboat008.springboot;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.util.ArrayList;
import java.util.List;@SpringBootTest
class SpringBootDemoApplicationTests {@Testvoid contextLoads() {List<Object> list = new ArrayList<>();while(true){list.add(new byte[1024 * 1024]);}}}

VM options:

-Xms2048M -Xmx2048M  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/applog

运行,果然只有pid, 没有自动追加时间戳

于是想到将自己的spring-boot项目部署到阿里云上, 在docker里面配置验证OOM打dump追加时间戳。

其他的源码可参考 之前的文章:
spring-boot整合thymeleaf和MyBatis

在此基础之上, 添加 一个get请求, 可访问这个请求,触发OOM打dump

UserController 添加 如下代码:

@GetMapping("/testOOM")
@ResponseBody
public ResultVO testOOM(){ResultVO resultVO = new ResultVO();List<Object> list = new ArrayList<>();for(int i = 0 ; i < 10000; i++){list.add(new byte[1024 * 1024]);}resultVO.setResFlag("1");resultVO.setResInfo("asd");return resultVO ;
}

打包, 生成 jar包,上传至阿里云服务器 /home/docker/oom-test目录, 并修改 该jar包的执行权限

重命名jar名称为 app.jar

写Dockerfile

  1. 进入主机的 /home/docker/oom-test目录, vim Dockerfile

Dockerfile:

FROM java:8
MAINTAINER itboat008
#添加主机路径下的 app.jar到 镜像的 /home/docker/oom-test/路径
ADD ./app.jar /home/docker/oom-test/app.jar
ADD ./heapDump.sh /home/docker/oom-test/heapDump.sh
#设置 OnOutOfMemoryError 时候需要执行的脚本
ENV JAVA_OPTS="-Xms256M -Xmx256M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/applog -XX:OnOutOfMemoryError='/home/docker/oom-test/heapDump.sh'"
VOLUME ["/applog"]
ENTRYPOINT java ${JAVA_OPTS} -jar /home/docker/oom-test/app.jar

其中 heapDump.sh如下:

#在该脚本下修改hprof的文件名
datetime = $(date "%Y%m%d%H%M%S")
hprofs = `find /applog -name '*.hprof'`
for tmprof in $hprofs
domv $tmprof `echo "$tmprof.$datetime"`
done

主机上/home/docker/oom-test路径下的文件如下:

制作镜像

cd /home/docker/oom-test
docker build -t oom-test:foxer .
# 查看当前所欲镜像
docker images

#启动容器
docker run -d -p 8888:8080 --name oom-test2009 oom-test:foxer
#查看容器
docker ps

#跟踪容器日志
docker logs -f d63fbe05f043

触发OOM验证

打开浏览器 , 访问 对应的url, 可发现浏览器返回了500的错

跟踪容器日志:

进入容器 /applog路径下查看:

docker exec -it d63fbe05f043 bash

发现已经生成了, 再看下主机路径下对应文件

#查看当前容器信息
docker inspect d63fbe05f043

找到 Mounts这块的配置

#进入到宿主机对应路径
cd /var/lib/docker/volumes/1b6f6094ee975ee3662316d8777aca5e5a8e07f26243699fd5fcaf70a3aaf7d3/_data

发现确实持久化到了主机的/var/lib/docker/volumes/1b6f6094ee975ee3662316d8777aca5e5a8e07f26243699fd5fcaf70a3aaf7d3/_data 路径上

指定主机生成路径

#如果需要指定生成的路径:
docker run -d -p 8888:8080 -v /applog:/applog --name oom-test2116 oom-test:foxer
#查看已启动的容器信息
docker inspect `docker ps | grep 'oom-test:foxer' |awk '{print $1}'`

发现确实挂载到主机的/applog路径下了

访问对应请求,发现生成到了/applog

经验证,如果当前应用已经打过dump了, 那么只要应用不重启, 后续OOM就不会再自动打dump了,只会打印异常堆栈

docker配置OOM打dump追加时间戳相关推荐

  1. docker配置阿里云镜像加速、镜像和容器常用命令、docker镜像原理

    6. Docker 配置阿里镜像加速服务 6.1 docker 运行流程 6.2 docker配置阿里云镜像加速 查看自己的镜像加速地址(链接直达):https://cr.console.aliyun ...

  2. linux(centos7) docker配置前后端分离项目环境

    一.安装docker 1.更新yum包,并安装需要的软件包,yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖 yum -y upgrade yu ...

  3. Docker配置指南系列(二):指令集(二)

    pause: 停止一个容器的所有进程语法:ocker pause CONTAINER [CONTAINER...] port: 列出容器的端口映射,或者查看指定开放端口的NAT映射语法:docker ...

  4. 《Docker容器:利用Kubernetes、Flannel、Cockpit和Atomic构建和部署》——2.2 容器式Linux系统的Docker配置...

    本节书摘来自异步社区<Docker容器:利用Kubernetes.Flannel.Cockpit和Atomic构建和部署>一书中的第2章,第2.2节,作者: [美]Christopher ...

  5. Docker 配置固定IP及桥接的实现方法(转载)

    这篇文章主要介绍了Docker 配置固定IP和桥接的实现方法的相关资料,这里详细介绍了Docker 的四种网络模式及如何实现桥接的案例,需要的朋友可以参考下 docker默认使用bridge模式,通过 ...

  6. docker安装php怎么修改配置,怎么给docker配置内存大小?

    怎么给docker配置内存大小? 解决docker配置内存大小的方法: 一.挂载docker中的配置文件通过将docker中tomcat的catalina.sh配置文件挂载到宿主机中,然后再catal ...

  7. harbor镜像仓库-https访问的证书配置 (docker配置harbor https证书)

    harbor镜像仓库-https访问的证书配置 生成CA证书 随便搞个什么文件夹,用于存放生成的证书 创建key文件: root@eb7023:/data/certs>openssl genrs ...

  8. 一文整理深度学习【深度学习win10的Docker配置】

    win10的Docker配置 一.WSL2配置 1.1. 下载CUDA on WSL 1.2. 下载WSL2 1.3. 安装linux 1.4. sshpass 二.安装Docker 2.1. 安装D ...

  9. 阿里云 docker php mysql_PHP开发环境02 - 阿里云Ubuntu使用Docker配置PHP环境(只限于学习)...

    视频地址 学徒卡夫 - 卡夫的Mac 04 - 阿里云Ubuntu使用Docker配置PHP环境 https://www.bilibili.com/vide... 打包镜像 上传阿里云docker镜像 ...

最新文章

  1. 有程序在记录你的键盘输入_12个用Java编写基础小程序amp;经典案例(收藏)
  2. boost::stable_sort相关的测试程序
  3. 请MM吃饭之工厂模式实现
  4. 服务器标配 SSH 协议,你了解多少?
  5. filter与servlet对照
  6. 大大小小的正六边形嵌套,就会形成像万花筒般有趣的视觉图形!
  7. 其实你女朋友也不是很爱你...
  8. MySQL命令之mysqldump -- 数据库备份程序
  9. 【渝粤题库】国家开放大学2021春1121健康教育与健康促进题目
  10. 数据结构与算法-没有算法的操作VS有算法的操作,性能大提升
  11. python爬虫requests简单案例_python网络爬虫(三)requests库的13个控制访问参数及简单案例...
  12. 蓝宝石会升级bios吗_浴火重生 蓝宝石HD7950 Flex测BIOS提速
  13. 2019华为软件精英挑战赛经验总结
  14. java代码区出现红色,绿色怎么办
  15. MyEclipse共享项目到SVN服务器 .
  16. 一个文献代理和医学资料非常丰富的地方
  17. Java 8 新特性
  18. Chrome(谷歌浏览器) 程序开发32个经常使用插件
  19. 基于Python大数据的的新能源汽车推荐系统的设计与实现
  20. 佟刚老师javaweb笔记(二)

热门文章

  1. MATLAB水果品质自动分级系统
  2. 设置子父元素overflow:hidden,子元素absolute不显示问题
  3. 51单片机数据类型及范围
  4. IBM Expands Watson Platform for Next Generation of Builders
  5. 网络连接错误代码大全及解决方法
  6. 如何去除溴化锂溶液中的硼离子
  7. 毕业论文和期刊论文的区别
  8. Castle Winsor在Asp.net MVC中应用
  9. 全国各地计算机技术与软件资格考试机构网站汇总
  10. cpci计算机无法启动,CPCI军用坚固型特种计算机产品与解决方案 .pptx