什么是jstack
以下是百度百科的内容
jstack是java虚拟机自带的一种堆栈跟踪工具。
死锁
- FoundoneJava-leveldeadlock:
- =============================
- "Thread-1":
- waitingtolockmonitor0x0003f334(object0x22c19f18,ajava.lang.Object),
- whichisheldby"Thread-0"
- "Thread-0":
- waitingtolockmonitor0x0003f314(object0x22c19f20,ajava.lang.Object),
- 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;
}
}
}
分析和结果
什么是jstack的更多相关文章
- 【java】jstack
介绍 jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jsta ...
- jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)
文章同步发布于github博客地址,阅读效果更佳,欢迎品尝 运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎 ...
- jstack+top定位性能问题
定位性能问题,尤其是cpu使用率过高时,经常需要查找cpu消耗较高的线程,然后查看其堆栈,从而进入代码定位问题. 该场景下, jstack+top是一种非常经典的方式. jstack+top: 1 ...
- jstack工具查看系统线程问题
背景: 最近在做项目系统的异常测试,项目依赖于nkv,需要模拟依赖组件nkv异常时系统的响应及性能情况.通过tc工具模拟当服务器发送到nkv的请求超时时系统的响应.发现接口返回错误率100%,查看服务 ...
- 使用jstack分析cpu消耗过高的问题
我们使用jdk自带的jstack来分析.当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 1.top查找出哪个进程消耗的cpu高 21125 co_ad2 18 ...
- Jstack Jmap jstat
jstack jmap jstat 代码,这里以这个为例怎样使用jstack诊断Java应用程序故障 public class DeadLock { public static void main(S ...
- Win下,通过Jstack截取Java进程中的堆栈信息
在Java软件的使用过程中,有时会莫名的出现奇怪的问题.而这些问题常常无法使用日志信息定位,这时我们就需要通过查看进程内部线程的堆栈调用关系来分析问题出在哪里. 举个例子,当我们在做某个操作时,莫名的 ...
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
摘要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat.hprof等小巧的工具,本博客希望 ...
- java jstack命令详解
名称jstack: stack trace 摘要: jstack [ option ] pid jstack [ option ] executable core jstack [ option ] ...
- jstack简单使用,定位死循环、线程阻塞、死锁等问题
当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,可以使用JDK自带的jstack工具去定位: 废话不说,直接上例子吧,在window平台上的: 死循环 写个死循环的程序如下: pac ...
随机推荐
- DpQuery.js
(function (window) { //添加事件的方法通用所有 function addevent(evetname, fn, obj) { if (document.attachEvent) ...
- 01 Java图形化界面设计——容器(JFrame)
程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构,现在就进入java图形化界面编程. 一.Jav ...
- Img src用base64数据
<img src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgG ...
- poj 3084(最小割)
题目链接:http://poj.org/problem?id=3084 思路:题目的意思是不让入侵者进入保护的房间,至少需要锁几道门.网络流建模:设一个超级源点,源点与有入侵者的房间相连,边容量为in ...
- 如何使用C#操作WinAPI
Windows API是对Windows操作系统的API函数,在C#中调用Windows API的实质是托管代码对非托管代码的调用. 主要使用的格式就是: using System.Runtime.I ...
- 使用 Visual Studio 2015 编译 QT 工程
简单进行一下几步就可以了 1.下载源代码 qt-everywhere-opensource-src-5.6.0-alpha.7z .解压到 D:\ToolKits\5.6.0\src 目录下2.网站 ...
- cxGrid 显示行号及行号列列名
cxGrid默认不显示行号,但是可以通过cxGrid1DBTableView1CustomDrawIndicatorCell事件来重绘行号 选中cxGrid1DBTableView1,在OnCusto ...
- mac上用的svn
Cornerstone是Mac上最佳的SVN管理工具 能破解最好,不会破解的表示mac的最新版本似乎对这款软件不太友好.
- 在javascript中NodeList和Array的区别及转换方法
随着深入理解javascript 后对于一些小知识的了解慢慢加深,这里说的是关于nodelist和array的区别,相信你一定用过toarray()方法,但是这里通过js 的方法讲解nodelist ...
- 爬虫实战【9】Selenium解析淘宝宝贝-获取宝贝信息并保存
通过昨天的分析,我们已经能到依次打开多个页面了,接下来就是获取每个页面上宝贝的信息了. 分析页面宝贝信息 [插入图片,宝贝信息各项内容] 从图片上看,每个宝贝有如下信息:price,title,url ...