java线上问题排查指令   2016-07-01


在线上遇到java问题时经常会依赖一些java自带的命令。下面对常用的命令做一个归纳整理。

jps

功能

jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令

常用指令

1
2
3
4
jps #显示当前用户的所有java进程的PID
jps -v 3331 #显示虚拟机参数
jps -m 3331 #显示传递给main()函数的参数
jps -l 3331 #显示主类的全路径

如果要显示其他用户的java进程,可以使用sudo jpssudo -u username jps(username表示用户名,如tomcat)

jinfo

功能

实时查看和调整虚拟机参数,可以显示未被显示指定的参数的默认值(jps -v 则不能)。
以键值对的形式打印出JAVA系统参数及命令行参数的名称和内容。
jdk8中已经不支持该命令。

常用指令

1
jinfo -flag CMSIniniatingOccupancyFration 144 #查询CMSIniniatingOccupancyFration参数值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-flag name
prints the name and value of the given command line flag.
-flag [+|-]name
enables or disables the given boolean command line flag.
-flag name=value
sets the given command line flag to the specified value.
-flags
prints command line flags passed to the JVM. pairs.
-sysprops
prints Java System properties as name, value pairs.
-h
prints a help message
-help
prints a help message

jstat

功能

显示进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

1
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

参数解释:

  • Option — 选项,我们一般使用 -gcutil 查看gc情况
  • vmid — VM的进程号,即当前运行的java进程号
  • interval– 间隔时间,单位为秒或者毫秒
  • count — 打印次数,如果缺省则打印无数次

参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。

假设需要每250毫秒查询一次进程5828垃圾收集状况,一共查询5次,那命令行如下:

1
jstat -gc 5828 250 5

对于命令格式中的VMID与LVMID需要特别说明下:如果是本地虚拟机进程,VMID(Virtual Machine IDentifier,虚机标识符)和LVMID(Local Virtual Machine IDentifier,虚机标识符)是一致的,如果是远程虚拟机进程,那VMID的格式应当是:[protocol:][//] lvmid [@hostname[:port]/servername]

常用指令

1
2
3
jstat -gc 3331 250 20 #查询进程2764的垃圾收集情况,每250毫秒查询一次,一共查询20次。
jstat -gccause #额外输出上次GC原因
jstat -calss #监视类装载、类卸载、总空间以及所消耗的时间

常见术语

  1. jstat –class : 显示加载class的数量,及所占空间等信息。
    Loaded 装载的类的数量 Bytes 装载类所占用的字节数 Unloaded 卸载类的数量 Bytes 卸载类的字节数 Time 装载和卸载类所花费的时间
  2. jstat -compiler 显示VM实时编译的数量等信息。
    Compiled 编译任务执行数量 Failed 编译任务执行失败数量 Invalid 编译任务执行失效数量 Time 编译任务消耗时间 FailedType 最后一个编译失败任务的类型 FailedMethod 最后一个编译失败任务所在的类及方法
  3. jstat -gc : 可以显示gc的信息,查看gc的次数,及时间。
    S0C年轻代中第一个survivor(幸存区)的容量 (字节) S1C 年轻代中第二个survivor(幸存区)的容量 (字节) S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节) S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节) EC 年轻代中Eden(伊甸园)的容量 (字节) EU 年轻代中Eden(伊甸园)目前已使用空间 (字节) OC Old代的容量 (字节) OU Old代目前已使用空间 (字节) PC Perm(持久代)的容量 (字节) PU Perm(持久代)目前已使用空间 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 YGCT 从应用程序启动到采样时年轻代中gc所用时间(s) FGC 从应用程序启动到采样时old代(全gc)gc次数 FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT 从应用程序启动到采样时gc用的总时间(s)
  4. jstat -gccapacity :可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小
    NGCMN 年轻代(young)中初始化(最小)的大小(字节) NGCMX 年轻代(young)的最大容量 (字节) NGC 年轻代(young)中当前的容量 (字节) S0C 年轻代中第一个survivor(幸存区)的容量 (字节) S1C 年轻代中第二个survivor(幸存区)的容量 (字节) EC 年轻代中Eden(伊甸园)的容量 (字节) OGCMN old代中初始化(最小)的大小 (字节) OGCMX old代的最大容量(字节) OGC old代当前新生成的容量 (字节) OC Old代的容量 (字节) PGCMN perm代中初始化(最小)的大小 (字节) PGCMX perm代的最大容量 (字节)
    PGC perm代当前新生成的容量 (字节) PC Perm(持久代)的容量 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 FGC 从应用程序启动到采样时old代(全gc)gc次数
  5. jstat -gcutil :统计gc信息
    S0 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比 S1 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比 E 年轻代中Eden(伊甸园)已使用的占当前容量百分比 O old代已使用的占当前容量百分比 P perm代已使用的占当前容量百分比 YGC 从应用程序启动到采样时年轻代中gc次数 YGCT 从应用程序启动到采样时年轻代中gc所用时间(s) FGC 从应用程序启动到采样时old代(全gc)gc次数 FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT 从应用程序启动到采样时gc用的总时间(s)
  6. jstat -gcnew :年轻代对象的信息。
    S0C 年轻代中第一个survivor(幸存区)的容量 (字节) S1C 年轻代中第二个survivor(幸存区)的容量 (字节) S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节) S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节) TT 持有次数限制 MTT 最大持有次数限制 EC 年轻代中Eden(伊甸园)的容量 (字节) EU 年轻代中Eden(伊甸园)目前已使用空间 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)
  7. jstat -gcnewcapacity: 年轻代对象的信息及其占用量。
    NGCMN 年轻代(young)中初始化(最小)的大小(字节) NGCMX 年轻代(young)的最大容量 (字节) NGC 年轻代(young)中当前的容量 (字节) S0CMX 年轻代中第一个survivor(幸存区)的最大容量 (字节) S0C 年轻代中第一个survivor(幸存区)的容量 (字节) S1CMX 年轻代中第二个survivor(幸存区)的最大容量 (字节) S1C 年轻代中第二个survivor(幸存区)的容量 (字节) ECMX 年轻代中Eden(伊甸园)的最大容量 (字节) EC 年轻代中Eden(伊甸园)的容量 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 FGC 从应用程序启动到采样时old代(全gc)gc次数
  8. jstat -gcold :old代对象的信息。
    PC Perm(持久代)的容量 (字节) PU Perm(持久代)目前已使用空间 (字节) OC Old代的容量 (字节) OU Old代目前已使用空间 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 FGC 从应用程序启动到采样时old代(全gc)gc次数 FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT 从应用程序启动到采样时gc用的总时间(s)
    9.stat -gcoldcapacity : old代对象的信息及其占用量。
    OGCMN old代中初始化(最小)的大小 (字节) OGCMX old代的最大容量(字节) OGC old代当前新生成的容量 (字节) OC Old代的容量 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 FGC 从应用程序启动到采样时old代(全gc)gc次数 FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT 从应用程序启动到采样时gc用的总时间(s)
    10.jstat -gcpermcapacity: perm对象的信息及其占用量。
    PGCMN perm代中初始化(最小)的大小 (字节) PGCMX perm代的最大容量 (字节)
    PGC perm代当前新生成的容量 (字节) PC Perm(持久代)的容量 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 FGC 从应用程序启动到采样时old代(全gc)gc次数 FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT 从应用程序启动到采样时gc用的总时间(s)
  9. jstat -printcompilation :当前VM执行的信息。
    Compiled 编译任务的数目 Size 方法生成的字节码的大小 Type 编译类型 Method 类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的

jmap

功能

生成堆转储快照(heapdump)

常用指令

1
2
3
4
jmap -heap 3331 #查看java 堆(heap)使用情况
jmap -histo 3331 #查看堆内存(histogram)中的对象数量及大小
jmap -histo:live 3331 #JVM会先触发gc,然后再统计信息
jmap -dump:format=b,file=heapDump 3331 #将内存使用的详细情况输出到文件,之后一般使用其他工具进行分析。

jhat

功能

一般与jmap搭配使用,用来分析jmap生成的堆转储文件。

由于有很多可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)可以替代,所以很少用。不过在没有可视化工具的机器上也是可用的。

常用指令

1
jmap -dump:format=b,file=heapDump 3331+jhat heapDump #解析Java堆转储文件,并启动一个 web server

jstack

功能

生成当前时刻的线程快照。

常用指令

1
2
3
jstack 3331 #查看线程情况
jstack -F 3331 #正常输出不被响应时,使用该指令
jstack -l 3331 #除堆栈外,显示关于锁的附件信息

常见问题定位过程

1. 频繁GC问题或内存溢出问题

  1. 使用jps查看线程ID
  2. 使用jstat -gc 3331 250 20查看gc情况,一般比较关注PERM区的情况,查看GC的增长情况。
  3. 使用jstat -gccause:额外输出上次GC原因
  4. 使用jmap -dump:format=b,file=heapDump 3331生成堆转储文件
  5. 使用jhat或者可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆情况。
  6. 结合代码解决内存溢出或泄露问题。

2. 死锁问题

  1. 使用jps查看线程ID
  2. 使用jstack 3331:查看线程情况

参考:http://www.hollischuang.com/archives/tag/java%E5%91%BD%E4%BB%A4%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%97


分享到:


  如果您觉得这篇文章对您的学习很有帮助, 请您也分享它, 让它能再次帮助到更多的需要学习的人. 您的支持将鼓励我继续创作 !
本文基于署名4.0国际许可协议发布,转载请保留本文署名和文章链接。 如您有任何授权方面的协商,请邮件联系我。

目录

  1. 1. jps
  2. 2. jinfo
  3. 3. jstat
  4. 4. jmap
  5. 5. jhat
  6. 6. jstack
  7. 7. 常见问题定位过程
    1. 7.1. 1. 频繁GC问题或内存溢出问题
    2. 7.2. 2. 死锁问题