以下是百度百科的内容

jstack是java虚拟机自带的一种堆栈跟踪工具。

jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
 

死锁

在多线程程序的编写中,如果不适当的运用同步机制,则有可能造成程序的死锁,经常表现为程序的停顿,或者不再响应用户的请求。比如在下面这个示例中,是个较为典型的死锁情况
 
 
在 JAVA 5中加强了对死锁的检测。线程 Dump中可以直接报告出 Java级别的死锁,如下所示:
dump结果
  1. FoundoneJava-leveldeadlock:
  2. =============================
  3. "Thread-1":
  4. waitingtolockmonitor0x0003f334(object0x22c19f18,ajava.lang.Object),
  5. whichisheldby"Thread-0"
  6. "Thread-0":
  7. waitingtolockmonitor0x0003f314(object0x22c19f20,ajava.lang.Object),
  8. whichisheldby"Thread-1" [2] 

实例

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;

/**

* @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;

}

}

}

分析和结果

编辑

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出了状况。如果出现了这种情况,我们就要从这里开始顺藤摸瓜,解决问题。
 
 

什么是jstack的更多相关文章

  1. 【java】jstack

    介绍 jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jsta ...

  2. jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)

    文章同步发布于github博客地址,阅读效果更佳,欢迎品尝 运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎 ...

  3. jstack+top定位性能问题

    定位性能问题,尤其是cpu使用率过高时,经常需要查找cpu消耗较高的线程,然后查看其堆栈,从而进入代码定位问题. 该场景下, jstack+top是一种非常经典的方式. jstack+top:   1 ...

  4. jstack工具查看系统线程问题

    背景: 最近在做项目系统的异常测试,项目依赖于nkv,需要模拟依赖组件nkv异常时系统的响应及性能情况.通过tc工具模拟当服务器发送到nkv的请求超时时系统的响应.发现接口返回错误率100%,查看服务 ...

  5. 使用jstack分析cpu消耗过高的问题

    我们使用jdk自带的jstack来分析.当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 1.top查找出哪个进程消耗的cpu高 21125 co_ad2    18   ...

  6. Jstack Jmap jstat

    jstack jmap jstat 代码,这里以这个为例怎样使用jstack诊断Java应用程序故障 public class DeadLock { public static void main(S ...

  7. Win下,通过Jstack截取Java进程中的堆栈信息

    在Java软件的使用过程中,有时会莫名的出现奇怪的问题.而这些问题常常无法使用日志信息定位,这时我们就需要通过查看进程内部线程的堆栈调用关系来分析问题出在哪里. 举个例子,当我们在做某个操作时,莫名的 ...

  8. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

    摘要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat.hprof等小巧的工具,本博客希望 ...

  9. java jstack命令详解

    名称jstack: stack trace 摘要: jstack [ option ] pid jstack [ option ] executable core jstack [ option ] ...

  10. jstack简单使用,定位死循环、线程阻塞、死锁等问题

    当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,可以使用JDK自带的jstack工具去定位: 废话不说,直接上例子吧,在window平台上的: 死循环 写个死循环的程序如下: pac ...

随机推荐

  1. jquery--递增--年份的选择

    <select id="select_year"></select> <script> $(document).ready(function() ...

  2. 图像处理之优化---任意半径局部直方图类算法在PC中快速实现的框架

    在图像处理中,局部算法一般来说,在很大程度上会获得比全局算法更为好的效果,因为他考虑到了图像领域像素的信息,而很多局部算法可以借助于直方图获得加速.同时,一些常规的算法,比如中值滤波.最大值滤波.最小 ...

  3. 软件设计模式(Design pattern)(待续)

    软件设计模式是在面向对象的系统设计过程中反复出现的问题解决方案. 设计模式通常描述了一组相互紧密作用的类与对象. 设计模式提供一种讨论软件设计的公共语言,使得熟练设计者的设计经验可以被初学者和其他设计 ...

  4. Oracle给大数值添加逗号的分位符形如:9,999,999,999

    SELECT TO_CHAR(1231231123, '9,999,999,999') FROM dual; 1,231,231,123 SELECT TO_CHAR(1231231123, '9,9 ...

  5. 爬虫实战【12】使用cookie登陆豆瓣电影以及获取单个电影的所有短评

    昨天我们已经实现了如何抓取豆瓣上的热门电影信息,虽然不多,只有几百,但是足够我们进行分析了. 今天我们来讲一下如何获取某一部电影的所有短评论信息,并保存到mongodb中. 反爬虫 豆瓣设置的反爬虫机 ...

  6. IDEA 设置代码模板

    一.代码模板 参考: IntelliJ IDEA 使用(一)基本设置与类.方法模板设置 - 云 + 社区 - 腾讯云 文件代码模板的使用 - IntelliJ IDEA 使用教程 - 极客学院 Wik ...

  7. java根据方法名动态调用invoke方法!

    public class Activity { public void deal(String name, long id) { System.out.println(name + id + &quo ...

  8. 巨蟒python全栈开发-第13天 内置函数 匿名函数lambda

    一.今日内容总览 1.内置函数(1):并不是每一个内置函数都是那么常用 上菜:内置函数部分//思维导图:https://www.processon.com/view/link/5b4ee15be4b0 ...

  9. 创建存储过程修改role密码

    1 创建存储过程 DELIMITER | drop procedure if exists pro_update_role_pwd; CREATE PROCEDURE pro_update_role_ ...

  10. 【python】-- 类的创建、__new__、__metaclass___

    类的创建 前面的随笔都是关于类的知识,通过类创建对象,那这个类到底是怎么产生的呢? 1. 传统创建类 class Foo(object): def __init__(self,name): self. ...