Docker容器只有JRE没有JDK使用Jattach导出内存快照

缘起

目前生产环境(k8s部署的)发现某个服务被重启了,当前监控只有普罗米修斯,可以看到当时的内存和CPU都很高。服务接入了阿里的监控工具ARMS,但是没法导出当时的内存快照,ARMS虽然提供了手动导出的功能,但是人很难确定哪个时间点的内存快照是最合适的。虽然服务重启了,但是没有OOM,所以OOM时导出内存快照开关虽然打开了,但是没有导出。服务重启的原因是k8s的healthcheck超时导致监控认为服务挂了,就把它重启了,但是当时只是响应慢,并不是真的挂了。生产上目前只有JRE,没有JDK,所以没办法像网上大多数人讲的那样,直接使用jstack和jmp等命令导出

Jattach

在网上搜索的时候发现了两个思路

  1. agentlib 启动时使用java -agentlib:heap=dump -jar xxx.jar 这个后来发现也需要jdk GG了
  2. jattach 实现了HotSpot Attach API,可以在JRE中直接执行 参考github https://github.com/apangin/jattach

导出内存快照

a. 下载合适的jattach工具,地址:https://github.com/apangin/jattach/releases 我这边用的debian镜像,所以将在这里插入图片描述 下载下来,放到和dockerfile同一个文件夹下(我这边dockerfile不是放在项目里面的,是单独放在某个文件夹,运维给挂载进去的) b. 将a中的jattach工具放入镜像的/usr/bin 并且赋执行权限

1COPY jattach /usr/bin 2RUN chmod +x /usr/bin/jattach

c. build镜像然后发布后,进入容器内执行

1jattach 1 dumpheap /opt/app/dumpheap.hprof 2jattach 1 threaddump > /opt/app/threaddump.hprof

这样就把内存快照和当时的CPU信息导出了,让运维把/opt/app/这个目录挂载到一个外部磁盘上,就可以拿到导出的信息了

点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

JVM快速调优命令汇总

CPU监控:进程和线程观察哪个进程CPU和内存占比高top观察进程中的线程,哪个线程CPU和内存占比高topHppidtop16837topHp16837定位具体java进程定位具体java进程jps

Java内存分析工具MAT

MAT是一个强大的内存分析工具,可以快捷、有效地帮助我们找到内存泄露,减少内存消耗分析工具。内存中堆的使用情况是应用性能监测的重点,而对于堆的快照,可以dump出来进一步分析,总的来说,一般我们对于堆dump快照有三种方式:添加启动参数发生OOM时自动dump:java应用的启动参数一般最好都加上XX:HeapDumpOnOutOfMe

Docker 运行时资源限制

Docker运行时资源限制Docker基于Linux内核提供的cgroups功能,可以限制容器在运行时使用到的资源,比如内存、CPU、块I/O、网络等。内存限制概述Docker提供的内存限制功能有以下几点:容器能使用的内存和交换分区大小。容器的核心内存大小。容器虚拟内存的交换行为。容器内存的软性限制

Linux 命令全集

一、开关机sync:把内存中的数据写到磁盘中(关机、重启前都需先执行sync)shutdownrnow或reboot:立刻重启shutdownhnow:立刻关机shutdownh19:00:预定时间关闭系统(晚上7点关机,如果现在超过8点则第二天)shutdownh10:预定时间关闭系统(10分钟后关机)