jmap执行失败了,怎么获取heapdump?

这篇具有很好参考价值的文章主要介绍了jmap执行失败了,怎么获取heapdump?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明。

在之前的OOM问题复盘中,我们添加了jmap脚本来自动dump内存现场,方便排查OOM问题。

但当我反复模拟OOM场景测试时,发现jmap有时可以dump成功,有时会报错,如下:
jmap执行失败了,怎么获取heapdump?
经过网上一顿搜索,发现两种原因可能导致这个问题,一是执行jmap用户与jvm进程用户不一致,二是/tmp/.java_pidXXX文件被删除,但经过检查,这都不是我们jmap失败的原因。

经过了解,jmap导出内存的原理,大致如下:
jmap执行失败了,怎么获取heapdump?

  1. 如果jvm进程id是8255,jmap会先创建一个/tmp/.java_pid8255文件,然后发送SIGQUIT信号给jvm。
  2. jvm收到信号后启动AttachListener线程,以UNIX domain socket的形式监听/tmp/.java_pid8255文件,以接收命令。
  3. jmap也以UNIX domain socket的形式连接上/tmp/.java_pid8255文件,并发送dumpheap命令给jvm,这个过程中jvm会检查命令发送方用户的euid/egid是否与自己一致。
  4. AttachListener线程收到dumpheap命令后,等到JVM进入Safepoint后,执行HeapDumper操作以导出heap.hprof文件。

可以看出,当jvm已经卡死,或有长时间的GC正在Safepoint中执行,都会导致jmap长时间读不到命令的响应而超时失败!

使用jmap -F

当给jmap添加-F参数时,jmap会使用Linux的ptrace机制来导出堆内存,ptrace是Linux平台的一种调试机制,像strace、gdb都是基于它开发的,它使得调试进程(jmap)可以直接读取被调试进程(jvm)的原生内存,然后jmap再根据jvm的内存布局规范,将原生内存转换为hprof格式。

但在实际执行时,会发现jmap -F执行得非常慢,可能要几个小时,这是因为ptrace每次只能读一个字的内存,而我们的堆有10G,因此jmap -F对于我们几乎无法使用。

注:这里说的原生程序,指的是类似于C/C++这种直接编译出来、不需要依赖语言虚拟机的程序,而原生内存,指的是通过malloc或mmap等直接申请出来的内存。

使用gcore

有过Linux下原生程序调试经验的,应该会知道gcore这个实用工具,它可用来生成程序原生内存的core文件,然后jstack、jmap等都可以读取此类文件,如下:

# 生成core文件,8787是进程号
$ gcore -o core 8787
Saved corefile core.8787
[Inferior 1 (process 8787) detached]

$ ll -lh core.8787
-rw-r--r-- 1 work work 5.8G 2023-04-16 11:40:00 core.8787

# 从core文件中读取线程栈
$ jstack `which java` core.8787

# 将core文件转换为hprof文件,很慢,建议摘流量后执行
$ jmap -dump:format=b,file=heap.hprof `which java` core.8787

但是当我使用jmap转换core文件时,我发现我本机测试时可以成功,但在测试服务器上却一直报错,如下:
jmap执行失败了,怎么获取heapdump?
我网上找了好久,都没找到报此错误的原因...

但我发现gcore执行时,是有一些警告信息的,如下:
jmap执行失败了,怎么获取heapdump?
看起来可能是gcore导出的core文件不全,联想到jvm部署在容器中,怀疑是有某些权限限制,导致部分程序内存导出失败了。

使用Linux内核的coredump机制

除了gcore可以导原生内存,其实Linux内核也有自动的coredump机制,即进程在收到某些信号后,会自动触发内核的coredump机制,内核会负责将进程的原生内存保存为core文件,而内核一般是最高权限运行的,所以它生成的core文件应该是完整的。

先开启coredump机制,如下:

# 检查是否开启,输出unlimited表示core文件不受限制,即完全开启
$ ulimit -c

# 临时开启coredump
$ ulimit -c unlimited

# 永久开启
$ echo "ulimit -c unlimited" >> /etc/profile

然后,配置一下coredump文件保存位置,如下:

# 查看当前配置
$ cat /proc/sys/kernel/core_pattern
/home/core/core.%e.%p.%t

# 配置coredump文件保存位置,并使其生效
$ vi /etc/sysctl.conf
kernel.core_pattern=/home/core/core.%e.%p.%t
$ sysctl –p /etc/sysctl.conf

core_pattern占位符解释

占位符 解释
%p pid
%u uid
%g gid
%s signal number
%t UNIX time of dump
%h hostname
%e executable filename

注:如果没有权限修改core_pattern路径,可考虑使用软链接ln -s做路径跳转,当然,还需要保证coredump路径有写入权限。

配置ok后,可通过kill发送信号来触发内核coredump,可触发coredump的常见信号如下:

  • SIGQUIT 数值2 从键盘输入Ctrl+'\'可以产生此信号
  • SIGILL 数值4 非法指令
  • SIGABRT 数值6 abort调用
  • SIGSEGV 数值11 非法内存访问
  • SIGTRAP 数值5 调试程序时使用的断点

我选择了SIGABRT信号,即kill -6,经过验证,可生成core文件,而且core文件也能被jmap转换为hprof文件。

有了hprof文件,就可以愉快地使用MAT、JVisualVM、JMC等工具进行内存分析啦😁文章来源地址https://www.toymoban.com/news/detail-415334.html

到了这里,关于jmap执行失败了,怎么获取heapdump?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • heapdump 攻击面利用

    点击上方蓝字关注我们 一、heapdump案例 1.1 项目中的分析 这个是项目中遇到的一个例子,发现了heapdump泄露,但没有找到可用session,当时就想着内存中应该是有账号密码的,于是就开始找了起来。 用OQL进行搜索,先找数据库密码,很好找,但由于是内网数据库没啥用。 然后

    2024年02月02日
    浏览(35)
  • shell:脚本执行失败就退出的3种方案

    简介:  在日常的自动化测试中,尤其shell脚本,在针对需要多个程序运行,shell脚本顺序执行过程可能会有中间环节会运行失败,抛出异常停止运行并报错,然而shell的其他下方语句仍然会继续往下执行,有时需要规避这类问题,使得出错后就退出后面的执行。 案例目录结构

    2024年02月11日
    浏览(36)
  • linux执行程序运行命令失败,提示找不到命令

    sudo: ./VMware-Workstation-Full-17.0.0-20800274.x86_64.bundle:找不到命令。 经检查,sudo命令正常,该脚本文件的确存在于该目录下。 1.文件是否有执行权限 使用 ls -l 命令查看下该文件的权限: 表示当前文件无执行权限。 ps: - 代表没有权限,r为可读权限,w为可写权限,x为可执行权限

    2024年02月08日
    浏览(43)
  • oracle作业执行失败提示ORA-12011的解决思路

    先说结论:请好好的阅读oracle的alert日志文件,里面的错误提示是很清楚的,精确到行;在plsql里运行作业出错的提示是简略的,容易给人浮躁的心态;如果在ssh工具显示中文为乱码,请设置好工具的字符集问题。 数据库:   12c 发布 1 错误代码:  ORA-12011 描述:  无法执行 %s 作

    2024年02月15日
    浏览(47)
  • 渗透测试-Spring Heapdump利用技巧

    在某次项目当中发现了一个spring boot的heapdump泄露,无法使用常见的mat分析工具打开。在逛github的时候发现了一个比较好的工具,可对该heapdump提取密码,并且该工具的其他功能比较新颖,打开了heapdump的新玩法。 heapdump_tool:https://github.com/wyzxxz/heapdump_tool 运行环境:java 8 基础

    2024年02月02日
    浏览(34)
  • Linux系统root下执行su登录其他用户失败

    在Linux系统上,从root用户切换到oracle用户时报错 su: cannot open session: Permission denied 如下: 定位原因1 分析登录日志,可以看到时登录的时候limit中的 memlock 设置失败,导致用户登录失败: limit配置表示限制该用户最大可以打开的文件数量、会话数量、内存等,使用 ulimit -a 命令

    2024年02月05日
    浏览(48)
  • Springboot信息泄露以及heapdump的利用

    14天阅读挑战赛 努力是为了不平庸~ 安全有些时候是枯燥的,这一次,让我们先人一步,趣学渗透! 渗透测试的时候老遇到spring的heapdump能下载但是不知道怎么利用,今天发几个工具让漏洞危害最大化。通过heapdump获取明文密码在深入利用。 路由列表 /trace :显示最近的http包

    2024年02月05日
    浏览(71)
  • 记一次heapdump泄露到拿下云主机

    通过前期信息收集发现某站存在springboot env 泄露。 通过对其进行web扫描发现heapdump文件进行下载,下载完成后使用解密工具对heapdump文件进行解密。 工具下载链接:https://github.com/wyzxxz/heapdump_tool 发现accessKey后使用cf工具进行利用拿下oss存储桶以及云主机。 工具下载链接:ht

    2024年02月09日
    浏览(43)
  • 解决fastboot模式下执行fastboot flashing unlock命令失败的问题

    Android设备在有些场景下需要解锁,解锁方法如下: 执行第二步的时候,有可能会收到失败提示 FAILED (remote: Unrecognized command flashing lock) 此时,需要更新下设备驱动。 首先执行 adb reboot fastboot ,使得设备进入fastboot模式; 打开计算机管理; 找到设备 右键选择“更新设备驱动”

    2023年04月11日
    浏览(45)
  • JVM——》jmap详解

    推荐链接:     总结——》【Java】     总结——》【Mysql】     总结——》【Redis】     总结——》【Kafka】     总结——》【Spring】     总结——》【SpringBoot】     总结——》【MyBatis、MyBatis-Plus】     总结——》【Linux】     总结——》【MongoDB】    

    2024年02月09日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包