jstack是java虚拟机自带的一种堆栈跟踪工具。jstack位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap

size和垃圾回收状况的监控。

Jstat可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。

1、Jstack命令格式

jstack [ option ] pid

2、常用参数

-F当’jstack [-l] pid’没有相应的时候强制打印栈信息

-l长列表.打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.

-m打印java和native c/c++框架的所有栈信息.

-h | -help打印帮助信息

pid需要被打印配置信息的java进程id,可以用jps查询.

3、生成死锁(deadlock)的源代码

package com.jdkTools;

/**

*简单的应用,供测试JDK自带的jstack使用 本应用会造成deadlock,可能会导致系统崩溃

*逻辑:一旦两个线程互相等待的局面出现,死锁(deadlock)就发生了

*

* @author范芳铭

*/

public class EasyJstack extends Thread {

private EasyJstackResourceresourceManger;//资源管理类的私有引用,通过此引用可以通过其相关接口对资源进行读写

private int a, b;//将要写入资源的数据

public static void main(String[]args) throws Exception {

EasyJstackResourceresourceManager = new EasyJstackResource();

EasyJstack stack1 = newEasyJstack(resourceManager, 1, 2);

EasyJstack stack2 = newEasyJstack(resourceManager, 3, 4);

stack1.start();

stack2.start();

}

publicEasyJstack(EasyJstackResource resourceManager, int a, int b) {

this.resourceManger =resourceManager;

this.a = a;

this.b = b;

}

public void run() {

while (true) {

this.resourceManger.read();

this.resourceManger.write(this.a,this.b);

}

}

}

package com.jdkTools;

/**

*简单的应用,供测试JDK自带的jstack使用 本应用会造成deadlock,可能会导致系统崩溃

*逻辑:一旦两个线程互相等待的局面出现,死锁(deadlock)就发生了

* @author范芳铭

*/

public class EasyJstackResource {

/**

*管理的两个资源,如果有多个线程并发,那么就会死锁

*/

private Resource resourceA = newResource();

private Resource resourceB = newResource();

public EasyJstackResource() {

this.resourceA.setValue(0);

this.resourceB.setValue(0);

}

public int read() {

synchronized (this.resourceA){

System.out.println(Thread.currentThread().getName()

+ "线程拿到了资源 resourceA的对象锁");

synchronized (resourceB){

System.out.println(Thread.currentThread().getName()

+ "线程拿到了资源 resourceB的对象锁");

return this.resourceA.getValue()+ this.resourceB.getValue();

}

}

}

public void write(int a, int b) {

synchronized (this.resourceB){

System.out.println(Thread.currentThread().getName()

+ "线程拿到了资源 resourceB的对象锁");

synchronized(this.resourceA) {

System.out.println(Thread.currentThread().getName()

+ "线程拿到了资源 resourceA的对象锁");

this.resourceA.setValue(a);

this.resourceB.setValue(b);

}

}

}

public class Resource {

private int value;//资源的属性

public int getValue() {

return value;

}

public void setValue(intvalue) {

this.value = value;

}

}

}

4、运行结果

Thread-0线程拿到了资源 resourceA 的对象锁

Thread-0线程拿到了资源 resourceB 的对象锁

Thread-0线程拿到了资源 resourceB 的对象锁

Thread-1线程拿到了资源 resourceA 的对象锁

应用已经被锁住了

5、用jstack进行分析

C:\Program Files\Java\jdk1.6.0_25\bin>jps -l

5204 com.jdkTools.EasyJstack

6268 sun.tools.jps.Jps

5412

C:\Program Files\Java\jdk1.6.0_25\bin>jstack 5204

2015-01-21 15:32:22

Full thread dump Java HotSpot(TM) Client VM (11.3-b02mixed mode):

…中间省略

"Signal Dispatcher" daemon prio=10tid=0x01a42000 nid=0x1a5c runnable [0x00000000..0x00000000]

java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=8 tid=0x01a2b000nid=0x1798 in Object.wait() [0x0bc3f000..0x0bc3fa68]

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

atjava.lang.Object.wait(Native Method)

- waitingon <0x03b50b38> (a java.lang.ref.ReferenceQueue$Lock)

atjava.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)

- locked<0x03b50b38> (a java.lang.ref.ReferenceQueue$Lock)

atjava.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)

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

"Reference Handler" daemon prio=10tid=0x01a29c00 nid=0x1e38 in Object.wait() [0x0bbef000..0x0bbefae8]

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

atjava.lang.Object.wait(Native Method)

- waitingon <0x03b50a40> (a java.lang.ref.Reference$Lock)

atjava.lang.Object.wait(Object.java:485)

atjava.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)

- locked<0x03b50a40> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x01a26800 nid=0x1cecrunnable

"VM Periodic Task Thread" prio=10tid=0x01a80000 nid=0x10e0 waiting on condition

JNI global references: 594

Found one Java-level deadlock:

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

"Thread-1":

waiting to lockmonitor 0x01a2dea4 (object 0x03b8ed40, acom.jdkTools.EasyJstackResource$Resource),

which is held by"Thread-0"

"Thread-0":

waiting to lockmonitor 0x01a2eb3c (object 0x03b8ed30, acom.jdkTools.EasyJstackResource$Resource),

which is held by"Thread-1"

Java stack information for the threads listed above:

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

"Thread-1":

atcom.jdkTools.EasyJstackResource.read(EasyJstackResource.java:27)

- waitingto lock <0x03b8ed40> (a com.jdkTools.EasyJstackResource$Resource)

- locked<0x03b8ed30> (a com.jdkTools.EasyJstackResource$Resource)

atcom.jdkTools.EasyJstack.run(EasyJstack.java:34)

"Thread-0":

atcom.jdkTools.EasyJstackResource.write(EasyJstackResource.java:42)

- waitingto lock <0x03b8ed30> (a com.jdkTools.EasyJstackResource$Resource)

- locked<0x03b8ed40> (a com.jdkTools.EasyJstackResource$Resource)

atcom.jdkTools.EasyJstack.run(EasyJstack.java:35)

Found 1 deadlock.

能够明确看到“Found one Java-level deadlock:”能够找到系统中的死锁。

6、分析结果

Java stack information for the threads listed above:

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

"Thread-1":

atcom.jdkTools.EasyJstackResource.read(EasyJstackResource.java:27)

- waitingto lock <0x03b8ed40> (a com.jdkTools.EasyJstackResource$Resource)

- locked<0x03b8ed30> (a com.jdkTools.EasyJstackResource$Resource)

atcom.jdkTools.EasyJstack.run(EasyJstack.java:34)

"Thread-0":

atcom.jdkTools.EasyJstackResource.write(EasyJstackResource.java:42)

- waitingto lock <0x03b8ed30> (a com.jdkTools.EasyJstackResource$Resource)

- locked<0x03b8ed40> (a com.jdkTools.EasyJstackResource$Resource)

atcom.jdkTools.EasyJstack.run(EasyJstack.java:35)

Found 1 deadlock.

仔细看这一段文字,告诉我们 EasyJstackResource.java:27出了状况。如果出现了这种情况,我们就要从这里开始顺藤摸瓜,解决问题。

7、其他状态和简单解读

死锁,Deadlock(重点关注)

执行中,Runnable

等待资源,Waiting on condition(重点关注)

等待获取监视器,Waiting on monitor entry(重点关注)

暂停,Suspended

对象等待中,Object.wait() 或 TIMED_WAITING

阻塞,Blocked(重点关注)

停止,Parked

java8 jstack_JDK自带工具之jstack相关推荐

  1. java 虚拟机(jvm)-06-JVM jdk 自带工具 jstack jconsole jvisualvm jmap jinfo

    jdk 自带工具 在 java 安装目录 bin 下. 你可以看到对应的信息,这里有很多 java 为我们提供的工具. $ ls appletviewer.exe* java-rmi.exe* jav ...

  2. 6 款 Java 8 自带工具,轻松分析定位 JVM 问题!

    这篇文章中介绍下如何使用 JDK 自带工具来分析和定位 Java 程序的问题. 使用 JDK 自带工具查看 JVM 情况 JDK 自带了很多命令行甚至是图形界面工具,帮助我们查看 JVM 的一些信息. ...

  3. 收集6 款 Java 8 自带工具,轻松分析定位 JVM 性能问题!

    这篇文章中介绍下如何使用 JDK 自带工具来分析和定位 Java 程序的问题. 使用 JDK 自带工具查看 JVM 情况 JDK 自带了很多命令行甚至是图形界面工具,帮助我们查看 JVM 的一些信息. ...

  4. MySQL自带工具使用介绍

    MySQL自带工具使用介绍: 1)mysql命令:mysql命令事是使用最多的命令工具了,为用户提供了一个命令行接口来操作管理MySQL的服务器. 命令格式: Usage:mysql [OPTIONS ...

  5. 使用MySQL自带工具mysqlhotcopy快速备份mysql数据库

    使用MySQL自带工具mysqlhotcopy快速备份mysql数据库 发表于82 天前 ⁄ 网站备份 ⁄ 暂无评论 mysqlhotcopy是一个Perl脚本,最初由Tim Bunce编写并提供.它 ...

  6. mysql 自带工具详解

    MySQL自带工具使用介绍: 1)mysql命令:mysql命令事是使用最多的命令工具了,为用户提供了一个命令行接口来操作管理MySQL的服务器. 命令格式: Usage:mysql [OPTIONS ...

  7. 教你怎么用WIN7系统自带工具调整硬盘分区

    转载自: 教你怎么用WIN7系统自带工具调整硬盘分区_百度经验 http://jingyan.baidu.com/article/fd8044fae86fb55031137ae5.html?qq-pf ...

  8. windows7内存诊断工具有用吗_Win7怎么使用自带工具进行内存检测?

    电脑使用久了,总是会出现各种各样的问题,其中比较常见的就是内存问题了.出现内存问题,我们可以采用系统自带的工具进行内存检测,可是很多用户不知道Win7怎么使用自带工具进行内存检测,为此小编赶紧整理了以 ...

  9. 计算机系统最大的加速能力,系统加速我用Windows系统四大自带工具 -电脑资料

    对于Windows操作系统的提升,网上介绍的方法有很多种,但是笔者经过试用后发现还是下面的这四种效果相对来说更好一些,系统为什么速度越来越慢,笔者认为最主要的是系统垃圾过多造成的,用户在使用电脑的过程 ...

最新文章

  1. 湘潭大学计算机科学与技术录取分数线,2016年湘潭大学计算机科学与技术专业在湖南录取分数线...
  2. py-faster-rcnn GPU跑demo预测分数低
  3. jenkins 对 maven对应的 jvm 配置参数
  4. 基于centos8搭建zookeeper集群
  5. 【Kafka】kafka无法查看消费组消费信息,其他相关组件正常
  6. JS【知识点】------(转)
  7. java treemap_Java TreeMap的排序
  8. [NOI2018]你的名字(68pts)
  9. 基于javacv的视频转码(升级版)
  10. Java中基于Rxtx的串口操作
  11. Java word转pdf字体格式和样式变乱的问题
  12. Echarts 配置渐变
  13. Spring(二)控制层梳理
  14. 计算机网络上有个红叉没无线,无线网络连接显示红叉不能上网怎么办?
  15. Linux之常见面试题知识点批注(六)
  16. GeekPwn再现碟中谍场景 黑客肆意控制智能摄像头
  17. char能不能存中文字符
  18. 序列化和反序列化的底层实现原理是什么?
  19. 一个微服务业务系统的中台构建之路
  20. FZU1901 Period II

热门文章

  1. 网页上传到服务器中文乱码问题
  2. 16周岁人类个体的思维碎片
  3. 【linux】linux中fork()详解(实例讲解)|fork的运行机制
  4. 霍金去世前,曾向China发出严正警告!!!原因是...
  5. Swing免费皮肤Substance的使用
  6. vue-其他watch监听.html
  7. html微博点赞代码,如何实现新浪微博功能:关注某个的发布信息,自动点赞和转发...
  8. 用AI管理牛棚?还能一周内交付算法?共达地助力牧场智能化升级
  9. 启用活动目录将存在怎样的一般性缺陷呢?
  10. TotalCommander 日常使用命令