最近线上产品不知道什么情况,内存每次都超出限制大小,占用大量内存导致服务报警。
今天dump一个服务的线程调用栈,分享一下dump 的 过程。
开始操作
- 获取内存消耗最大的进程id
top -d 1
按 Shift m 已内存消耗排列
可以看到我们这java占用内存还是很高啊。别介意图例,我这里就是分享怎么去生成 thread dump 的操作方法,随便起了一个简单的jar 服务并前台运行的,没必要死磕。
- 获取进程中那个线程使用最高
top -Hp pid
按 Shift m 和 Shift p 先安装 内存排列后安装 CPU消耗排列
这里可以看到这个子进程 211 的占用比其他进程要高点哈,记住进程号。
- 生成 Thread dump
kill -3 211
切换到另外一个终端,上面我讲了我是临时启动的一个jar在前台运行,生成的 Thread dump 信息也会在前台显示
我们将信息复制在一个 文件中,稍后去分析看一下它。
分析 Thread dump
这里推荐使用这个在线分析java 线程,可视化整体还可以
这里推荐使用这个在线分析java 线程,可视化整体还可以
注意
kill -3 对java进程生成thread dump,是不能够将相应的内容转储到自己制定的文件中了(至少我是没有尝试成功,而且网上也没有找到相关的资料)。
它只会产生在终端(前台启动的程序)、nohup.out(后台启动的应用)、catalina.out(tomcat应用)、weblogic等应用同理。