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

那年烟雨落申城
• 阅读 407

缘起

目前生产环境(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镜像,所以将Docker容器只有JRE没有JDK使用Jattach导出内存快照 下载下来,放到和dockerfile同一个文件夹下(我这边dockerfile不是放在项目里面的,是单独放在某个文件夹,运维给挂载进去的) b. 将a中的jattach工具放入镜像的/usr/bin 并且赋执行权限
    COPY jattach /usr/bin
    RUN chmod +x /usr/bin/jattach
    c. build镜像然后发布后,进入容器内执行
    jattach 1 dumpheap /opt/app/dumpheap.hprof
    jattach 1 threaddump > /opt/app/threaddump.hprof
    这样就把内存快照和当时的CPU信息导出了,让运维把/opt/app/这个目录挂载到一个外部磁盘上,就可以拿到导出的信息了
点赞
收藏
评论区
推荐文章
火山引擎MARS-APMPlus 应用性能监控帮助客户Java OOM崩溃率下降80%
本文将会从Java内存基础开始,详细介绍“基于Hprof内存快照的线上JavaOOM归因方案”的底层原理与技术细节,欢迎接入MARSAPMPlus应用性能监控使用。作者:字节跳动终端技术——王涛一、前言如何定位和解决AndroidApp因为内存不足(JavaOOM)引发的线上问题一直是业界的难题。崩溃场景能抓取到的常规信息中并不包括内存分配详情——不了解内存被谁持有,自然也无法追查内存不足的根源。针对这个问题,ClientInfra和头条抖音等业务方合作,通过一系列技术调研,自研了一套基
Stella981 Stella981
3年前
JVM快速调优命令汇总
CPU监控:进程和线程观察哪个进程CPU和内存占比高top观察进程中的线程,哪个线程CPU和内存占比高topHppidtop16837topHp16837定位具体java进程定位具体java进程jps
Wesley13 Wesley13
3年前
Java内存分析工具MAT
MAT是一个强大的内存分析工具,可以快捷、有效地帮助我们找到内存泄露,减少内存消耗分析工具。内存中堆的使用情况是应用性能监测的重点,而对于堆的快照,可以dump出来进一步分析,总的来说,一般我们对于堆dump快照有三种方式:添加启动参数发生OOM时自动dump:java应用的启动参数一般最好都加上XX:HeapDumpOnOutOfMe
Stella981 Stella981
3年前
Docker 运行时资源限制
Docker运行时资源限制Docker基于Linux内核提供的cgroups功能,可以限制容器在运行时使用到的资源,比如内存、CPU、块I/O、网络等。内存限制概述Docker提供的内存限制功能有以下几点:容器能使用的内存和交换分区大小。容器的核心内存大小。容器虚拟内存的交换行为。容器内存的软性限制
Stella981 Stella981
3年前
Linux 命令全集
一、开关机sync:把内存中的数据写到磁盘中(关机、重启前都需先执行sync)shutdownrnow或reboot:立刻重启shutdownhnow:立刻关机shutdownh19:00:预定时间关闭系统(晚上7点关机,如果现在超过8点则第二天)shutdownh10:预定时间关闭系统(10分钟后关机)
Stella981 Stella981
3年前
Redis——持久化数据
Redis被称为是内存数据库,那是因为它会将其所有数据存储在内存里,因此Redis具有强劲的速度性能,但是,也正因为数据存储在内存中,当Redis重启后,所有存储在内存的数据就会丢失。为了使得数据持久化,Redis提供了两种方式:RDB方式和AOF方式。一、RDB方式RDB方式的持久化是通过快照(snapshotting)完成的,
Stella981 Stella981
3年前
Redis学习笔记(五)之持久化
RDB在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存中。Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了。再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
燕青 燕青
1年前
Macos专业的系统监视器:System Dashboard Pro Mac版
是一款功能强大的系统监控工具,专为Mac用户设计。它提供了一个直观的仪表板界面,让用户可以实时监控系统的各项指标,包括CPU使用率、内存使用情况、磁盘空间、网络状态等。SystemDashboardPro支持多种系统指标监控,包括CPU使用率、内存使用情况