转自:https://www.javatang.com/archives/2017/10/19/33151873.html

基本概念 {#basic-info}

在对Java内存泄漏进行分析的时候,需要对jvm运行期间的内存占用、线程执行等情况进行记录的dump文件,常用的主要有thread dump和heap dump。

  • thread dump 主要记录JVM在某一时刻各个线程执行的情况,以栈的形式显示,是一个文本文件。通过对thread dump文件可以分析出程序的问题出现在什么地方,从而定位具体的代码然后进行修正。thread dump需要结合占用系统资源的线程id进行分析才有意义。
  • heap dump 主要记录了在某一时刻JVM堆中对象使用的情况,即某个时刻JVM堆的快照,是一个二进制文件,主要用于分析哪些对象占用了太多的堆空间,从而发现导致内存泄漏的对象。

上面两种dump文件都具有实时性,因此需要在服务器出现问题的时候生成,并且多生成几个文件,方便进行对比分析。下面我们先来说一下如何生成 thread dump。

使用jstack生成thread dump

当服务器出现高CPU的时候,首先执行 top -c 命令动态显示进程及占用资源的排行,如下图:

top后面的参数-c可以显示进程详细的信息。top命令执行的时候还可以执行一些快捷键:

  • 1 对于多核服务器,可以显示各个CPU占用资源的情况
  • shift+h 显示所有的线程信息
  • shift+w 将当前 top 命令的设置保存到 ~/.toprc 文件中,这样不用每次都执行快捷键了

以上图为例,pid为1503的进程占用了大量的CPU资源,接下来需要将占用CPU最高进程中的线程打印出来,可以用 top -bn1 -H -p <pid> 命令,执行结果如下:

上面 -bn1 参数的含义是只输出一次结果,而不是显示一个动态的结果。

我个人请喜欢用 ps -mp <pid> -o THREAD,tid,time | sort -k2r 命令查看,后面的sort参数根据线程占用的cpu比例进行排序,结果如下:

接下来我们清楚今天的主角 jstack,这是一个在JDK5开始提供的内置工具,可以打印指定进程中线程运行的状态,包括线程数量、是否存在死锁、资源竞争情况和线程的状态等等。有下面的几个常用的参数:

  • -l 长列表,打印关于锁的附加信息
  • -m 打印java和jni框架的所有栈信息

因为thread id在栈信息中是以十六进制的形式显示的,因此需要使用 printf “%x\n” tid  命令将现场id转成十六进制的值,然后执行 jstack -l <pid> | grep <thread-hex-id> -A 10 命令显示出错的堆栈信息,如下图:

上面命令中 -A 10 参数用来指定显示行数,否则只会显示一行信息。

这样通过上图,可以很快地定位到程序问题的代码,然后对代码进行分析和改进即可。注意:需要在多个时间段提出多个 Thread Dump信息,然后综合进行对比分析,单独分析一个文件是没有意义的。

生成shell文件

上面讲述了整个的分析过程,不过所有的命令就是实时的,所以最好创建一个shell脚本瞬间执行完成,下面对 当CPU飙高时,它在做什么 这篇文章中所提供的shell进行了改进如下:

#!/bin/bash
if [ $# -le 0 ]; thenecho "usage: $0 <pid> [line-number]"exit 1
fi# java home
if test -z $JAVA_HOME
thenJAVA_HOME='/usr/local/jdk'
fi#pid
pid=$1
# checking pid
if test -z "$($JAVA_HOME/bin/jps -l | cut -d '' -f 1 | grep $pid)"
thenecho "process of $pid is not exists"exit
fi#line number
linenum=$2
if test -z $linenum
thenlinenum=10
fistackfile=stack$pid.dump
threadsfile=threads$pid.dump# generate java stack
$JAVA_HOME/bin/jstack -l $pid >> $stackfile
ps -mp $pid -o THREAD,tid,time | sort -k2r | awk '{if ($1 !="USER" && $2 != "0.0" && $8 !="-") print $8;}' | xargs printf "%x\n" >> $threadsfile
tids="$(cat $threadsfile)"
for tid in $tids
doecho "------------------------------ ThreadId ($tid) ------------------------------"cat $stackfile | grep 0x$tid -A $linenum
donerm -f $stackfile $threadsfile

目前脚本有点问题,需要调整。

【性能定位】使用jstack定位线程堆栈信息相关推荐

  1. Jstack查询线程堆栈

    Jstack是什么? jstack是java虚拟机自带的一种堆栈跟踪工具. jstack主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁).线程快照是当前java虚拟机内每一条线程正 ...

  2. 使用jstack查看某个Java进程内的线程堆栈信息

    本文来说下如何使用jstack来查看堆栈信息 文章目录 概述 概述

  3. jstack-查看Java进程的线程堆栈信息,锁定高消耗资源代码

    jstack主要用来查看某个Java进程内的线程堆栈信息.语法格式如下: jstack [option] pid jstack [option] executable core jstack [opt ...

  4. linux查看java堆栈信息_Java运行状态分析2:获取线程堆栈信息

    Java运行状态分析2:获取线程堆栈信息 基本概念 出现内存泄漏或者运行缓慢场景,有时候无法直接从业务日志看出问题时候,需要分析jvm内存和线程堆栈 线程堆栈信息主要记录jvm线程在某时刻线程执行情况 ...

  5. jpa,分析duid参数,当前用户的最大线程数,线上问题排查,stack命令查看占用CPU高的线程堆栈信息

    1.先查看应用进程号: ps -ef | grep 应用名 ,也就是 pid 2.查看pid垃圾回收情况: jstat -gc pid 5000(时间间隔) 3.dump jvm二进制的内存详细使用情 ...

  6. Java问题定位之如何借助线程堆栈进行问题分析

    在大型的应用中,线程堆栈打印出来特别多,如何从众多的信息中找到真正有用,有价值的信息,我们需要一定的技巧.本文对此详细介绍. 我们可以从三个方面分析:堆栈的局部信息,一次堆栈的统计信息,多个堆栈的对比 ...

  7. java线程堆栈信息分析

    线程堆栈也称作线程调用堆栈.Java线程堆栈是虚拟机中线程(包括锁)状态的一个瞬间快照,即系统在某个时刻所有线程的运行状态,包括每一个线程的调用堆栈,锁的持有情况等信息.对于已经消失而又没留有痕迹的信 ...

  8. Java命令:jstack — 获取线程dump信息

    目录 一.命令介绍 二.使用实例 实例一:jstack查看输出 实例二:jstack统计线程数 实例三:jstack检测死锁 实例四:jstack检测CPU高 一.命令介绍 Usage:jstack ...

  9. java性能分析与问题定位 实战

    文章目录 常用命令 APM监控工具 eclipseMAT内存分析工具 决策树 直方图 今天我们来聊下生产环境排查.定位问题的工具和方法. 常用命令 jdk提供的工具类,可以用来获取java进程的内存. ...

最新文章

  1. sklearn的train_test_split()各函数参数含义解释(非常全)
  2. matlab实战中一些重要的函数总结
  3. python自动化开发是什么_Python自动化开发学习6
  4. 伴鱼:借助 Flink 完成机器学习特征系统的升级
  5. Linux debian ubuntu安装GIMP软件
  6. Android中CursorLoader的使用、原理及注意事项
  7. csgo降低延迟指令_ILP——指令级并行
  8. 微服务架构【技术点3】--- [初级] windows下zookeeper的配置+dubbo服务提供者端+dubbo消费者端配置
  9. 2021深圳杯数学建模D题思路分析
  10. php创建对象出问题,activex部件不能创建对象
  11. 机器学习|切比雪夫不等式(3sigma原则来源)|10mins入门|概统学习笔记(十)
  12. 高中知识三角函数怎么计算机,高中三角函数怎么学 有什么方法
  13. 【GT】Assembler 源码解读及使用 !Cocos Creator!
  14. Classic Shell 4.2.4 中文版已经发布
  15. python+openCV滑动条的使用
  16. 关于 Eclipse 使用的自习笔记
  17. 全国各地电台FM.ini汇总
  18. 大恒水晶相机_大恒工业相机多实例使用
  19. c 语言中虚方法有什么作用是什么,虚函数的作用?
  20. 技术,管理,和境界问题

热门文章

  1. jQuery基础:选择器、动画、DOM操作和事件等
  2. C语言经典问题——兑换硬币
  3. docker logs查看日志
  4. java实现图片分辨率压缩、图片软化、jpg质量压缩
  5. 教育学习类app是怎么开发的
  6. 这篇文章终于把中美德三国的工业互联网讲清楚了
  7. 京东订单拉取接入流程
  8. Go语言圣经 - 第11章 测试 - 11.1 go test 11.2 测试函数
  9. 吃海鲜搭配什么菜好 搭配这些健康又美味
  10. 【认知】眼见为实吗?也许你看到的并不是真实的:视觉恒常性