正文
gcore的学习-解决jmap无法生成dump文件的一种方法
背景
周末在跆拳道馆看孩子练跆拳道.
开着笔记本翻到了 扣钉日记 公众号里面的讲解
想着自己也遇到过无法保存dump文件的情况.
所以想学习一下. 进行联系
其实之前也验证过宕机时的dump文件. 感觉是比较类似的.
gcore
NAME
gcore - Generate core files for running processes
SYNOPSIS
gcore [-a] [-o filename] pid[s]
DESCRIPTION
gcore generates a core file for the process(es) specified by process
IDs, pid[s]. By default, each core file is written to core.pid, in the
current directory.
-a (Linux only) ignore /proc/PID/coredump_filter and also dump mem-
ory mappings marked with the 'VM_DONTDUMP' flag. See info node
Core File Generation for longer explanation.
-o filename
write core file to filename if one PID, or filename.pid if mul-
tiple PIDs, instead of default core.pid
第一步 获取
yum install gdb -y
需要注意 gcore 是需要使用 gdb工具链的, 所以必须安装一下.
jps 查看对应的 进程号:
注意在执行gcore 之前需要先执行一下
ulimit -c unlimited
设置 core 无限制, 不然会报错:
warning: Memory read failed for corefile section, 1048576 bytes at 0x7fb380c18000.
具体的执行命令为:
time gcore 1947692 -o core
注意这个命令非常耗时, 根据jvm占用内存大小不同而不同.
配置好的机器速度会快一些.
第二步 java处理
jstack `which java` core.1947692
可以进行简单的查看
time jmap -dump:format=b,file=heap.hprof `which java` core.1947692
可以使用这个命令从 core文件中获取一下对应的jvm dump 文件.
获取之后就可以使用 mat jprofiler 工具进行分析了.
gcore的介绍
使用rpm命名查看gdb的rpm包,主要由下面几个程序:
/usr/bin/gcore
/usr/bin/gdb
/usr/bin/gdbserver
/usr/bin/gdbtui
/usr/bin/gstack
其中:
gcore 是生成core文件用的
gdb 调试用的
gdbserver 远程调试使用
gdbtui 界面化的gdb, 同 gdb -tui
gstack 查看正在运行的进程的调用栈信息