「java查看那个线程阻塞」查看java线程信息命令jstat

博主:adminadmin 2023-03-17 13:46:07 576

本篇文章给大家谈谈java查看那个线程阻塞,以及查看java线程信息命令jstat对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

在java多线程程序中,怎样实时找出处于等待(阻塞)状态线程、进程的个数。

线程的最大好处就是可以共用同一个内存块。

你只要定义一个静态的变量,给所有线程读写操作。你就能统计这些了。

怎样使用jstack诊断Java应用程序故障

1. 首先来了解一下jstack这个命令的作用,jstack 是一个可以返回在应用程序上运行的各种各样线程的一个完整转储的实用程序,您可以使用它查明问题。jstack [-l] pid,jpid可以通过使用jps命令来查看当前Java程序的jpid值,-l是可选参数,它可以显示线程阻塞/死锁情况。

/**

* 死锁例子

* @author crane.ding

* @since 2011-3-20

*/

public class DeadLock {

public static void main(String[] args) {

final Object obj_1 = new Object(), obj_2 = new Object();

Thread t1 = new Thread("t1"){

@Override

public void run() {

synchronized (obj_1) {

try {

Thread.sleep(3000);

} catch (InterruptedException e) {}

synchronized (obj_2) {

System.out.println("thread t1 done.");

}

}

}

};

Thread t2 = new Thread("t2"){

@Override

public void run() {

synchronized (obj_2) {

try {

Thread.sleep(3000);

} catch (InterruptedException e) {}

synchronized (obj_1) {

System.out.println("thread t2 done.");

}

}

}

};

t1.start();

t2.start();

}

}

2. 以上DeadLock类是一个死锁的例子,假使在不知情的情况下,运行DeadLock后,发现等了N久都没有在屏幕打印线程完成信息。这个时候就可以使用jps查看该程序的jpid值和使用jstack来生产堆栈结果问题。

$ java -cp deadlock.jar DeadLock

$

$ jps

3076 Jps

448 DeadLock

$ jstack -l 448 deadlock.jstack

结果文件deadlock.jstack内容如下:

2011-03-20 23:05:20

Full thread dump Java HotSpot(TM) Client VM (19.1-b02 mixed mode, sharing):

"DestroyJavaVM" prio=6 tid=0x00316800 nid=0x9fc waiting on condition [0x00000000]

java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:

- None

"t2" prio=6 tid=0x02bcf000 nid=0xc70 waiting for monitor entry [0x02f6f000]

java.lang.Thread.State: BLOCKED (on object monitor)

at com.demo.DeadLock$2.run(DeadLock.java:40)

- waiting to lock 0x22a297a8 (a java.lang.Object)

- locked 0x22a297b0 (a java.lang.Object)

Locked ownable synchronizers:

- None

"t1" prio=6 tid=0x02bce400 nid=0xba0 waiting for monitor entry [0x02f1f000]

java.lang.Thread.State: BLOCKED (on object monitor)

at com.demo.DeadLock$1.run(DeadLock.java:25)

- waiting to lock 0x22a297b0 (a java.lang.Object)

- locked 0x22a297a8 (a java.lang.Object)

Locked ownable synchronizers:

- None

"Low Memory Detector" daemon prio=6 tid=0x02bb9400 nid=0xa6c runnable [0x00000000]

java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:

- None

"CompilerThread0" daemon prio=10 tid=0x02bb2800 nid=0xcb8 waiting on condition [0x00000000]

java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:

- None

"Attach Listener" daemon prio=10 tid=0x02bb1000 nid=0x7f4 waiting on condition [0x00000000]

java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:

- None

"Signal Dispatcher" daemon prio=10 tid=0x02bd2800 nid=0xd80 runnable [0x00000000]

java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:

- None

"Finalizer" daemon prio=8 tid=0x02bab000 nid=0xe1c in Object.wait() [0x02d3f000]

java.lang.Thread.State: WAITING (on object monitor)

at java.lang.Object.wait(Native Method)

- waiting on 0x229e1148 (a java.lang.ref.ReferenceQueue$Lock)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)

- locked 0x229e1148 (a java.lang.ref.ReferenceQueue$Lock)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)

at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

Locked ownable synchronizers:

- None

"Reference Handler" daemon prio=10 tid=0x02ba6800 nid=0xbe0 in Object.wait() [0x02cef000]

java.lang.Thread.State: WAITING (on object monitor)

at java.lang.Object.wait(Native Method)

- waiting on 0x229e1048 (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 0x229e1048 (a java.lang.ref.Reference$Lock)

Locked ownable synchronizers:

- None

"VM Thread" prio=10 tid=0x02b6a400 nid=0x568 runnable

"VM Periodic Task Thread" prio=10 tid=0x02bc8400 nid=0x75c waiting on condition

JNI global references: 878

Found one Java-level deadlock:

=============================

"t2":

waiting to lock monitor 0x02baaeec (object 0x22a297a8, a java.lang.Object),

which is held by "t1"

"t1":

waiting to lock monitor 0x02baa2bc (object 0x22a297b0, a java.lang.Object),

which is held by "t2"

Java stack information for the threads listed above:

===================================================

"t2":

at com.demo.DeadLock$2.run(DeadLock.java:40)

- waiting to lock 0x22a297a8 (a java.lang.Object)

- locked 0x22a297b0 (a java.lang.Object)

"t1":

at com.demo.DeadLock$1.run(DeadLock.java:25)

- waiting to lock 0x22a297b0 (a java.lang.Object)

- locked 0x22a297a8 (a java.lang.Object)

Found 1 deadlock.

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

java中如何判断一个线程是否在wait状态?

用 isAlive()和isInterrupted() 判断线程处于活动状态和是否终端。如果实现你想要的,wait的时候,维护一下状态。

怎么通过linux命令去分析jvm里面那个线程阻塞了

仍然需要生成jvm进程的thread dump data,便于与Linux top命令输出关联。步骤如下:

1)执行top命令,或使用-H选项(显示所有线程),找到相关的高CPU的PID

2)生成thread dump 快照(kill -3 PID)。

3)将top命令输出PID转换为HEX格式(16进制)

4)在thread dump data中搜索nid=Hex PID

5)分析受影响的thread和stack trace,精确定位代码。

top output sample

[plain] view plain copy

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND

...........

22111 userWLS 9 0 86616 84M 26780 S 0.0 40.1 0:00 java

java线程阻塞问题,怎么解决

典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。但suspend()方法很容易引起死锁问题,已经不推荐使用了。wait() 和 notify() 方法:两个方法配套使用,wait() 使得线程进入阻塞状态,它有两种形式,一种允许 指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的 notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用。 初看起来它们与 suspend() 和 resume() 方法对没有什么分别,但是事实上它们是截然不同的。区别的核心在于,前面叙述的所有方法,阻塞时都不会释放占用的锁(如果占用了的话),而这一对方法则相反。 上述的核心区别导致了一系列的细节上的区别。 首先,前面叙述的所有方法都隶属于 Thread 类,但是这一对却直接隶属于 Object 类,也就是说,所有对象都拥有这一对方法。初看起来这十分不可思议,但是实际上却是很自然的,因为这一对方法阻塞时要释放占用的锁,而锁是任何对象都具有的,调用任意对象的 wait() 方法导致线程阻塞,并且该对象上的锁被释放。而调用 任意对象的notify()方法则导致因调用该对象的 wait() 方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。 其次,前面叙述的所有方法都可在任何位置调用,但是这一对方法却必须在 synchronized 方法或块中调用,理由也很简单,只有在 synchronized 方法或块中当前线程才占有锁,才有锁可以释放。同样的道理,调用这一对方法的对象上的锁必须为当前线程所拥有,这样才有锁可以释放。因此,这一对方法调用必须放置在这样的 synchronized 方法或块中,该方法或块的上锁对象就是调用这一对方法的对象。若不满足这一条件,则程序虽然仍能编译,但在运行时会出现IllegalMonitorStateException 异常。 wait() 和 notify() 方法的上述特性决定了它们经常和synchronized 方法或块一起使用,将它们和操作系统的进程间通信机制作一个比较就会发现它们的相似性:synchronized方法或块提供了类似于操作系统原语的功能,它们的执行不会受到多线程机制的干扰,而这一对方法则相当于 block 和wakeup 原语(这一对方法均声明为 synchronized)。它们的结合使得我们可以实现操作系统上一系列精妙的进程间通信的算法(如信号量算法),并用于解决各种复杂的线程间通信问题。 关于 wait() 和 notify() 方法最后再说明两点: 第一:调用 notify() 方法导致解除阻塞的线程是从因调用该对象的 wait() 方法而阻塞的线程中随机选取的,我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。 第二:除了 notify(),还有一个方法 notifyAll() 也可起到类似作用,唯一的区别在于,调用 notifyAll() 方法将把因调用该对象的 wait() 方法而阻塞的所有线程一次性全部解除阻塞。当然,只有获得锁的那一个线程才能进入可执行状态。 谈到阻塞,就不能不谈一谈死锁,略一分析就能发现,suspend() 方法和不指定超时期限的 wait() 方法的调用都可能产生死锁。遗憾的是,Java 并不在语言级别上支持死锁的避免,我们在编程中必须小心地避免死锁。 以上我们对 Java 中实现线程阻塞的各种方法作了一番分析,我们重点分析了 wait() 和 notify() 方法,因为它们的功能最强大,使用也最灵活,但是这也导致了它们的效率较低,较容易出错。实际使用中我们应该灵活使用各种方法,以便更好地达到我们的目的。

关于java查看那个线程阻塞和查看java线程信息命令jstat的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。