zoukankan      html  css  js  c++  java
  • 什么是jstack

    以下是百度百科的内容

    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出了状况。如果出现了这种情况,我们就要从这里开始顺藤摸瓜,解决问题。
     
     
  • 相关阅读:
    Web开发快速上手
    前端概述
    Python语言进阶
    图像和办公文档处理
    网络编程
    进程和线程
    正则表达式
    面向对象进阶
    面向对象
    js 获取指定时间上月26 ,
  • 原文地址:https://www.cnblogs.com/baxianhua/p/9408307.html
Copyright © 2011-2022 走看看