Thread dump文件抓取和分析(JCA工具)

Thread dump文件抓取和分析

接下来分析CentOS下怎么抓取Thread dump文件,JCA怎么分析Thread dump文件。

1、CentOS下抓取Thread dump文件

CentOS下命令
会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况

jstack -l pid

不仅会输出Java堆栈信息,还会输出C/C++堆栈信息

jstack -m pid

输出有异常的进程Thread Core文件。

jstack -l pid >> /root/*.txt

执行 “jstack 进程号 | grep 线程ID” 查找某进程下线程的状态。

在这里插入图片描述

2、JCA工具分析Thread dump文件

2.1 线程状态

New: 当线程对象创建时存在的状态,此时线程不可能执行;
Runnable:当调用thread.start()后,线程变成为Runnable状态。只要得到CPU,就执行;
Running:线程正在执行;
Waiting:执行thread.join()或在锁对象调用obj.wait()等情况就会进该状态,表明线程正处于等待某个资源或条件发生来唤醒自己;
Timed_Waiting:执行Thread.sleep(long)、thread.join(long)或obj.wait(long)等就会进该状态,与Waiting的区别在于Timed_Waiting的等待有时间限制;
Blocked:如果进入同步方法或同步代码块,没有获取到锁,则会进入该状态;
Dead:线程执行完毕,或者抛出了未捕获的异常之后,会进入dead状态,表示该线程结束
其次,对于jstack日志,我们要着重关注如下关键信息
Deadlock:表示有死锁
Waiting on condition:等待某个资源或条件发生来唤醒自己。具体需要结合jstacktrace来分析,比如线程正在sleep,网络读写繁忙而等待
Blocked:阻塞
Waiting on monitor entry:在等待获取锁
in Object.wait():获取锁后又执行obj.wait()放弃锁

一般重点查看“等待资源Waiting on condition”、“wait()”、“阻塞Blocked”。这些是引起CPU高,可能是线程执行有死循环。

2.2具体例子

利用下面大量new对象模拟“堆内存溢出”的案例。

   List<Object> list = new ArrayList<>();
            for (int i = 0; i < 10000000; i++) {
                String str = "";
                for (int j = 0; j < 1000; j++) {
                    str += UUID.randomUUID().toString();
                }
                list.add(str);
            }

下载好Jca.jar。将该jar包放到jdk/bin目录下。
输入下面命令,打开JCA分析工具
…/bin>java –jar jca433.jar

弹出工具页面,File—>Open Thread dumps,找到文件。
在这里插入图片描述
-----一般对于JavaCore文件,我们需要多个文件进行分析,对比可以找到大概代码哪行有问题。
从上面线程状态分析可以看出,对应代码21行有异常,另外51%CPU是在“等待资源Waiting on condition”,可能是代码有死循环等问题。可以具体进行排查。

猜你喜欢

转载自blog.csdn.net/xunmengyou1990/article/details/108013251
今日推荐