性能调优工具Jstack使用

来源:互联网 发布:软件行业平均毛利率 编辑:程序博客网 时间:2024/06/05 00:58

前言:在web开发过程中,不管是eclipse还是web服务有时候会经常遇到OutofMemoryError(内存不足),内存泄露,线程锁死,java进程CPU过高等操作,服务器可以允许这些问题的存在,导致这些问题在日常开发中被更多的人忽略掉。

jstack的作用:

  jstack 用于答应给定的java进程ID或者core file或远程调试服务的java堆栈信息,可以使用它查明问题。

详细命令格式:
jstack [ option ] pidjstack [ option ] executable corejstack [ option ] [server-id@] remote-hostname-or-IP

如果是在64位机器上,需要指定选项”-J-d64”,

首先看一下针对程序死锁的错误排查

package **/** * @author peng * @date 2015年9月14日 * @desc 死锁例子 */public class JstackLockTest {    public static void main(String[] args) {        final Object lock1 = new Object(), lock2 = new Object();        Thread t1 = new Thread("t1") {            @Override            public void run() {                synchronized (lock1) {                        try {                            Thread.sleep(3000);                        } catch (InterruptedException e) {                        }                    synchronized (lock2) {                        System.out.println("thread t1 done.");                    }                }            }        };        Thread t2 = new Thread("t2") {            @Override            public void run() {                synchronized (lock2) {                    try {                        Thread.sleep(3000);                    } catch (InterruptedException e) {                    }                    synchronized (lock1) {                        System.out.println("thread t2 done.");                    }                }            }        };        t1.start();        t2.start();    }}

上面示例代码是一个死锁的例子,如果在开发过程中遇到这样的例子,如图一所示:

等了很长时间都没有任何输出,而程序一直在运行中,然后通过jsp查看该程序的jpid值,使用jstack来查看堆栈信息:
Linux代码:

$jps10502 JstackLockTest12815 Jps5393 org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar10863 JstackLockTest$jstack -l 10502

对应的结果:

......省略前面log"Finalizer" daemon prio=10 tid=0x00007fbd7c079000 nid=0x2912 in Object.wait() [0x00007fbd80ff6000]   java.lang.Thread.State: WAITING (on object monitor)        at java.lang.Object.wait(Native Method)        - waiting on <0x00000000f5561300> (a java.lang.ref.ReferenceQueue$Lock)        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)        - locked <0x00000000f5561300> (a java.lang.ref.ReferenceQueue$Lock)        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:171)   Locked ownable synchronizers:        - None"Reference Handler" daemon prio=10 tid=0x00007fbd7c077800 nid=0x2911 in Object.wait() [0x00007fbd810f7000]   java.lang.Thread.State: WAITING (on object monitor)        at java.lang.Object.wait(Native Method)        - waiting on <0x00000000f55611d8> (a java.lang.ref.Reference$Lock)        at java.lang.Object.wait(Object.java:485)        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)        - locked <0x00000000f55611d8> (a java.lang.ref.Reference$Lock)   Locked ownable synchronizers:        - None......省略后面log

从这个结果文件我们一看到发现了一个死锁,具体是线程t2在等待线程t1,而线程t1在等待线程t2造成的,同时也记录了线程的堆栈和代码行数,通过这个堆栈和行数我们就可以去检查对应的代码块,从而发现问题和解决问题。

对于高cpu的排查

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
26045 peng 20 0 3186184 1.239g 1.145g S 100.4 8.0 421:44.79 vmware-vmx
14938 peng 20 0 1920880 31368 13076 S 100.1 0.2 3:03.75 java
9564 peng 20 0 4404644 1.187g 1.163g S 3.3 7.6 462:03.29 vmware-vmx
1132 root 20 0 540820 122556 104088 S 1.7 0.8 22:07.77 Xorg
3746 peng 20 0 1612920 196932 36636 S 1.7 1.2 33:28.35 compiz
12545 peng 20 0 857900 50584 23196 S 1.0 0.3 0:07.37 /usr/bin/termin
10 root 20 0 0 0 0 S 0.3 0.0 0:32.85 rcuos/2
490 peng 20 0 1173848 171256 60884 S 0.3 1.0 0:51.94 chromium-browse
981 peng 20 0 1288652 290592 64952 S 0.3 1.8 0:49.72 chromi

0 0
原创粉丝点击