jstack (查看线程状态) jmap(查看内存)jstat(性能分析)

基本命令的使用

1
2
3
4
5
6
7
获取垃圾回收器的类型和系统参数 // jmap -heap pid  
查看应用启动的参数// jinfo -flags pid
查看当前各个代区的容量和使用量情况 // jstat
FGC、YGC的总次数和总耗时 // jstat
立即生成Dump文件 //jmap -dump:live,file=dump_001.bin PID
强制FullGC // jmap -dump:live
查看线程的运行信息(包括死锁的线程) // jstack -l pid

jstack

jstack是jdk自带的线程堆栈分析工具,使用该命令可以查看或导出 Java 应用程序中线程堆栈信息。

  • 功能
    jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
  • 线程的状态
    NEW,未启动的。不会出现在Dump中。
    RUNNABLE,在虚拟机内执行的。
    BLOCKED,受阻塞并等待监视器锁。
    WATING,无限期等待另一个线程执行特定操作。
    TIMED_WATING,有时限的等待另一个线程的特定操作。
    TERMINATED,已退出的。
  • 命令
    jstack -l pid
    获取pid:ps -ef | grep “name” | grep -v grep | awk ‘{print $2}’
    pid转16进制:echo ‘ibase=10;ibase=16;pid’|bc

jmap

jmap heap pid:查看 JDK的概况的最好的一个参数
Jmap是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本.
jmap -dump:format=b,file=outfile PID 可以将指定进程的内存heap输出出来到outfile文件里.

  • 命令格式
    jmap [ option ] pid
    jmap [ option ] executable core
    jmap [ option ] [server-id@]remote-hostname-or-IP
    参数说明
    options:
    executable :产生core dump的java可执行程序;
    core 将被打印信息的core dump文件;
    remote-hostname-or-IP 远程debug服务的主机名或ip;
    server-id 唯一id,假如一台主机上多个远程debug服务;

  • dump 文件分析
    导出整个JVM 中内存信息: jmap -dump:format=b,file=文件名.dump [pid]

    • 将文件远程复制
    1. 将本地文件复制到远程: scp {local txt} {userName}@{ip}:/{txt}
    2. 将远程文件复制到本地: scp {usreName}@{ip}:/root/{txt}