java8 jstack_JDK自带工具之jstack
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相关推荐
- java 虚拟机(jvm)-06-JVM jdk 自带工具 jstack jconsole jvisualvm jmap jinfo
jdk 自带工具 在 java 安装目录 bin 下. 你可以看到对应的信息,这里有很多 java 为我们提供的工具. $ ls appletviewer.exe* java-rmi.exe* jav ...
- 6 款 Java 8 自带工具,轻松分析定位 JVM 问题!
这篇文章中介绍下如何使用 JDK 自带工具来分析和定位 Java 程序的问题. 使用 JDK 自带工具查看 JVM 情况 JDK 自带了很多命令行甚至是图形界面工具,帮助我们查看 JVM 的一些信息. ...
- 收集6 款 Java 8 自带工具,轻松分析定位 JVM 性能问题!
这篇文章中介绍下如何使用 JDK 自带工具来分析和定位 Java 程序的问题. 使用 JDK 自带工具查看 JVM 情况 JDK 自带了很多命令行甚至是图形界面工具,帮助我们查看 JVM 的一些信息. ...
- MySQL自带工具使用介绍
MySQL自带工具使用介绍: 1)mysql命令:mysql命令事是使用最多的命令工具了,为用户提供了一个命令行接口来操作管理MySQL的服务器. 命令格式: Usage:mysql [OPTIONS ...
- 使用MySQL自带工具mysqlhotcopy快速备份mysql数据库
使用MySQL自带工具mysqlhotcopy快速备份mysql数据库 发表于82 天前 ⁄ 网站备份 ⁄ 暂无评论 mysqlhotcopy是一个Perl脚本,最初由Tim Bunce编写并提供.它 ...
- mysql 自带工具详解
MySQL自带工具使用介绍: 1)mysql命令:mysql命令事是使用最多的命令工具了,为用户提供了一个命令行接口来操作管理MySQL的服务器. 命令格式: Usage:mysql [OPTIONS ...
- 教你怎么用WIN7系统自带工具调整硬盘分区
转载自: 教你怎么用WIN7系统自带工具调整硬盘分区_百度经验 http://jingyan.baidu.com/article/fd8044fae86fb55031137ae5.html?qq-pf ...
- windows7内存诊断工具有用吗_Win7怎么使用自带工具进行内存检测?
电脑使用久了,总是会出现各种各样的问题,其中比较常见的就是内存问题了.出现内存问题,我们可以采用系统自带的工具进行内存检测,可是很多用户不知道Win7怎么使用自带工具进行内存检测,为此小编赶紧整理了以 ...
- 计算机系统最大的加速能力,系统加速我用Windows系统四大自带工具 -电脑资料
对于Windows操作系统的提升,网上介绍的方法有很多种,但是笔者经过试用后发现还是下面的这四种效果相对来说更好一些,系统为什么速度越来越慢,笔者认为最主要的是系统垃圾过多造成的,用户在使用电脑的过程 ...
最新文章
- 湘潭大学计算机科学与技术录取分数线,2016年湘潭大学计算机科学与技术专业在湖南录取分数线...
- py-faster-rcnn GPU跑demo预测分数低
- jenkins 对 maven对应的 jvm 配置参数
- 基于centos8搭建zookeeper集群
- 【Kafka】kafka无法查看消费组消费信息,其他相关组件正常
- JS【知识点】------(转)
- java treemap_Java TreeMap的排序
- [NOI2018]你的名字(68pts)
- 基于javacv的视频转码(升级版)
- Java中基于Rxtx的串口操作
- Java word转pdf字体格式和样式变乱的问题
- Echarts 配置渐变
- Spring(二)控制层梳理
- 计算机网络上有个红叉没无线,无线网络连接显示红叉不能上网怎么办?
- Linux之常见面试题知识点批注(六)
- GeekPwn再现碟中谍场景 黑客肆意控制智能摄像头
- char能不能存中文字符
- 序列化和反序列化的底层实现原理是什么?
- 一个微服务业务系统的中台构建之路
- FZU1901 Period II
热门文章
- 网页上传到服务器中文乱码问题
- 16周岁人类个体的思维碎片
- 【linux】linux中fork()详解(实例讲解)|fork的运行机制
- 霍金去世前,曾向China发出严正警告!!!原因是...
- Swing免费皮肤Substance的使用
- vue-其他watch监听.html
- html微博点赞代码,如何实现新浪微博功能:关注某个的发布信息,自动点赞和转发...
- 用AI管理牛棚?还能一周内交付算法?共达地助力牧场智能化升级
- 启用活动目录将存在怎样的一般性缺陷呢?
- TotalCommander 日常使用命令