jstack: Java占用高CPU分析之- GC task thread

jstack 是JDK自带的堆栈跟踪工具,作用有两个:

  1. 为Java 进程或者核心文件打印出线程的堆栈信息;
  2. 远程调试服务器。

查看用法:

jstack -help
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)

Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message

下面开始具体的调试步骤:

  1. top 命令可以看到具体的Java进程号:(注意这里的PID是进程ID)

pid

2. 然后按 Shift + h 直接列出线程号:注意这里的PID是线程ID(对应的是native 线程的id, 即nid)

tid

3. 可以看到主要是19226和19227这两个线程消耗大量的CPU,而且时间累占用了一个小时左右,需要把线程号转换成十六进制,因为打印出来的堆栈信息里面的线程号是十六进制形式: printf “%x/n” 19226

printf

4. 获得占用CPU的Java进程号和线程号后可以用jstack工具来打印堆栈信息了:

(1) 先把整个进程堆栈信息打印预览: jstack 19214

stack1

stack2

(2)如果要快速定位线程造成的问题用:jstack [PID(进程号)] | grep [PID(线程号十六进制)] -A 10

stack3

 

5. 从进程和线程的堆栈信息可以看出是JVM的GC线程一直在占用大量CPU, 定位代码得出的结论是:Java程序连MySQL频繁new connection而且没有调用close方法,导致GC线程一直占用CPU。

 

仅有1条评论 发表评论

  1. alysaaeschbacher.wordpress.com /

    Good day! Do you know if they make any plugins to help with SEO?
    I’m trying to get my blog to rank for some targeted keywords but I’m not seeing very good success.
    If you know of any please share. Thank you!

发表评论