当前位置: 首页 > 编程日记 > 正文

jstack 使用(转)

dump 文件里,值得关注的线程状态有:
  1. 死锁,Deadlock(重点关注) 
  2. 执行中,Runnable   
  3. 等待资源,Waiting on condition(重点关注) 
  4. 等待获取监视器,Waiting on monitor entry(重点关注)
  5. 暂停,Suspended
  6. 对象等待中,Object.wait() 或 TIMED_WAITING
  7. 阻塞,Blocked(重点关注)  
  8. 停止,Parked

Runnable:不解释

Blocked:线程阻塞,是指当前线程执行过程中,所需要的资源长时间等待却一直未能获取到,被容器的线程管理器标识为阻塞状态,可以理解为等待资源超时的线程

Wait on condition:该状态出现在线程等待某个条件的发生。具体是什么原因,可以结合 stacktrace来分析。最常见的情况是线程在等待网络的读写。如果网络数据没准备好,线程就等待在那里。另外一种出现 Wait on condition的常见情况是该线程在 sleep,等待 sleep的时间到了时候,将被唤醒。

Waiting for monitor entry 和 in Object.wait():这两种情况在多线程的情况下经常出现。Java是通过Monitor来实现线程互斥和协作(有些把Monitor直译成锁,我认为不妥,不是还有Lock嘛)。具体Monitor的深入理解见 http://www.cnblogs.com/tomsheep/archive/2010/06/09/1754419.html

但是可以理解成Monitor是一个对象或者class所拥有的锁,每个对象和class有且仅有一个。见下图.


每个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 “Active Thread”,而其它线程都是 “Waiting Thread”,分别在两个队列 “ Entry Set”和 “Wait Set”里面等候。

在 “ Entry Set”里面的线程都等待拿到Monitor,拿到了线程就成为了Runnable线程,否则就会一直处于处于 “waiting for monitor entry”。一段代码作为例子

public class MyThread implements Runnable{    public void run() {    synchronized(this) {    for (int i = 0; i < 1; i--) {    System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);    }    }    }    public static void main(String[] args) {    MyThread t1 = new MyThread();    Thread ta = new Thread(t1, "A");    Thread tb = new Thread(t1, "B");    ta.start();    tb.start();    }   }  

大家一看就知道,B线程肯定是“千年老二“,永远拿不到Monitor了。

对应的stack:

"B" prio=10 tid=0x0969a000 nid=0x11d6 waiting for monitor entry [0x8bb22000]  java.lang.Thread.State: BLOCKED (on object monitor)  at org.marshal.MyThread.run(MyThread.java:7)  - waiting to lock <0x94757078> (a org.marshal.MyThread)  at java.lang.Thread.run(Thread.java:636)  "A" prio=10 tid=0x09698800 nid=0x11d5 runnable [0x8bb73000]  java.lang.Thread.State: RUNNABLE  at java.io.FileOutputStream.writeBytes(Native Method)  at java.io.FileOutputStream.write(FileOutputStream.java:297)  at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)  at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)  - locked <0x947571b0> (a java.io.BufferedOutputStream)  at java.io.PrintStream.write(PrintStream.java:449)  - locked <0x94757190> (a java.io.PrintStream)  at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:220)  at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:290)  at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:103)  - locked <0x947572a0> (a java.io.OutputStreamWriter)  at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)  at java.io.PrintStream.write(PrintStream.java:494)  - locked <0x94757190> (a java.io.PrintStream)  at java.io.PrintStream.print(PrintStream.java:636)  at java.io.PrintStream.println(PrintStream.java:773)  - locked <0x94757190> (a java.io.PrintStream)  at org.marshal.MyThread.run(MyThread.java:8)  - locked <0x94757078> (a org.marshal.MyThread)  at java.lang.Thread.run(Thread.java:636)  

<0x94757078> 就是两个线程争夺的Monitor

在 “Wait Set”里面的线程都如饥似渴地等待拿到Monitor。他们是怎么进入到“Wait Set”的呢?当一个线程拿到了Monitor,但是在其他资源没有到位的情况下,调用同步锁对象(一般是synchronized()内的对象)的 wait() 方法,放弃了 Monitor,它就进入到了 “Wait Set”队列。只有当其他线程通过notify() 或者 notifyAll(),释放了同步锁后,这个线程才会有机会重新去竞争Monitor。在stack中,它表现的状态是in Object.wait()。修改上面的代码public class WaitThread implements Runnable{

public void run() {    synchronized(this) {   try {  this.wait();  } catch (InterruptedException e) {  // TODO Auto-generated catch block  
        e.printStackTrace();  }              }    }    public static void main(String[] args) {    WaitThread t1 = new WaitThread();    Thread ta = new Thread(t1, "A");    Thread tb = new Thread(t1, "B");    ta.start();    tb.start();            }   

对应的stack:

"B" prio=10 tid=0x08173000 nid=0x1304 in Object.wait() [0x8baf2000]  java.lang.Thread.State: WAITING (on object monitor)  at java.lang.Object.wait(Native Method)  - waiting on <0xa9cb50e0> (a org.marshal.WaitThread)  at java.lang.Object.wait(Object.java:502)  at org.marshal.WaitThread.run(WaitThread.java:8)  - locked <0xa9cb50e0> (a org.marshal.WaitThread)  at java.lang.Thread.run(Thread.java:636)  "A" prio=10 tid=0x08171c00 nid=0x1303 in Object.wait() [0x8bb43000]  java.lang.Thread.State: WAITING (on object monitor)  at java.lang.Object.wait(Native Method)  - waiting on <0xa9cb50e0> (a org.marshal.WaitThread)  at java.lang.Object.wait(Object.java:502)  at org.marshal.WaitThread.run(WaitThread.java:8)  - locked <0xa9cb50e0> (a org.marshal.WaitThread)  at java.lang.Thread.run(Thread.java:636)  

A和B线程都进入了”wait set“。B线程也拿到过这个Monitor,因为A线程释放过了,这也验证上面的话,他们都在等待得而复失的<0xa9cb50e0>

 热锁

热锁,也往往是导致系统性能瓶颈的主要因素。其表现特征为,由于多个线程对临界区,或者锁的竞争,可能出现:
    * 频繁的线程的上下文切换:从操作系统对线程的调度来看,当 线程在等待资源而阻塞的时候,操作系统会将之切换出来,放到等待的队列,当线程获得资源之后,调度算法会将这个线程切换进去,放到执行队列中。
    * 大量的系统调用:因为线程的上下文切换,以及热锁的竞争,或 者临界区的频繁的进出,都可能导致大量的系统调用。
    * 大部分 CPU开销用在 “系统态 ”:线程上下文切换,和系统调用,都会导致 CPU在 “系统态 ”运行,换而言之,虽然系统很忙碌,但是 CPU用在 “用户态 ”的比例较小,应用程序得不到充分的 CPU资源。 

    * 随着 CPU数目的增多,系统的性能反而下降。因为 CPU数目多,同 时运行的线程就越多,可能就会造成更频繁的线程上下文切换和系统态的 CPU开销,从而导致更糟糕的性能。 
上面的描述,都是一个 scalability(可扩展性)很差的系统的表现。从整体的性能指标看,由于线程热锁的存在,程序的响应时间会变长,吞吐量会降低。< /span>
         那么,怎么去了解 “热锁 ”出现在什么地方呢?一个重要的方法还是结合操作系统的各种工具观察系统资源使用状况,以及收集 Java线程的 DUMP信息,看线程都阻塞在什么方法上,了解原因,才能找到对应的解决方法。
        我们曾经遇到过这样的例子,程序运行时,出现了以上指出的各种现象,通过观察操作系统的资源使用统计信息,以及线程 DUMP信息,确定了程序中热锁的存在,并发现大多数的线程状态都是 Waiting for monitor entry或者 Wait on monitor,且是阻塞在压缩和解压缩的方法上。后来采用第三方的压缩包 javalib替代 JDK自带的压缩包后,系统的性能提高了几倍

转自  http://go-on.iteye.com/blog/1673894

http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html

http://jameswxx.iteye.com/blog/1041173

转载于:https://www.cnblogs.com/SamuelSun/p/5660574.html

相关文章:

ios TableView编辑状态多选框的修改

在- (void)layoutSubview 和 - (void)setEditing:(BOOL)editing animated:(BOOL)animated 中添加 UIImage *selectImg [UIImage imageNamed:"im_select_sign"]; UIImage *disSelectImg [UIImage imageNamed:"im_disSelect_sign"]; for (UIC…

区块链有哪些技术特征

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 区块链有哪些技术特征 在信息网络化的大背景下&#xff0c;当需要与不熟悉的对手方进行价值交换活动时&#xff0c;人们如何做才能防止不会…

《JavaEE开发的颠覆者——Spring Boot实战》是一本好书

这本书的风格非常好、每一节都是先点明这一块知识的要点&#xff0c;随后就手把手的做出一个最简明、但有能体现核心的实例&#xff08;大多只有几个Class&#xff09; 这样的书用来熟悉一门框架&#xff0c;实在是再好不过。转载于:https://www.cnblogs.com/nanlan2017/p/1045…

html css 布局知识概况

1、如果想设置页面居中&#xff0c;当设置margin属性为auto的时候&#xff0c;不能在设置浮动或绝对定位属性。并且一定要设置width为一个定值 2、盒子模型三维立体结构图 3、浮动布局 利用浮动可以实现横向布局&#xff0c;通过float来实现&#xff08;left--左浮动&#xff0…

项目的简单总结二--可拉伸的头视图

项目总结二 tableVIew和collectionview中头视图的可拉伸放大效果 demo中只做了tableview的效果, collectionview做法一样 效果如下图: demo地址: https://github.com/wyon0313/ZoomHeaderView

浅谈区块链技术

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 浅谈区块链技术 这几天空闲的时候在网上浏览了一些区块链的技术&#xff0c;其实区块链只是一个技术&#xff0c;只不过是比特币很好的实…

IIS 7.5 去掉index.php 西数服务器

//新建web.config 加上下面代码<?xml version"1.0"?> <configuration> <system.webServer><rewrite><rules><rule name"OrgPage" stopProcessing"true"><match url"^(.*)$" /><condit…

bzoj1927: [Sdoi2010]星际竞速

跟上一题几乎一样。。。 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; #define rep(i,n) for(int i1;i<n;i) #define clr(x,c) memset(x,c,sizeof(x)) #define op() cl…

在cell中取得UITableView所在的ViewController对象

原来碰到这个问题一般会将控制器传进cell中, 或者将cell要做的响应事件回调到控制器去处理, 前段时间找到一种方法觉得很不错 - (UIViewController *)getTableViewSuperViewController { for (UIView* next [self superview]; next; next next.superview) { UI…

区块链当前现状

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 区块链是分布式账本技术&#xff0c;用于记录交易数据&#xff0c;具有不可篡改性、完整分布性、可追溯性等技术优势&#xff0c;应用包括…

MVC 4.0 Razor模板引擎 @Html.RenderPartial 与 @Html.RenderAction 区别

近来在学习MVC 4.0&#xff0c;设置布局全局网页的页脚&#xff0c;使用了Razor语法 {Html.RenderPartial("Footer", Model.FooterData);} 但是并不理解Html帮助器方法Html.RenderPartial。 先来介绍一下Html.RenderPartial用法。 Html.RenderPartial在Asp.net Mvc中…

iOS 图片处理-利用GPUImage 磨皮和美白图片

项目中要求处理图片, 简单记录一下美白和磨皮过程 (其中GPUImage还有美颜滤镜, 使用方式基本一样) //磨皮 - (void)editPhotoByBilateralWithLevel:(CGFloat)level { GPUImagePicture *pic [[GPUImagePicture alloc] initWithImage:image]; // 磨皮滤镜…

linux下编译php扩展

1 在pecl.php.net搜索你需要的php扩展 2 在解压后的扩展目录运行phpize 3 执行编译./configure --with-php-config/usr/local/php/bin/php-config 4 修改php/lib/php.ini文件 加上这句话extention扩展.so的绝对路径转载于:https://www.cnblogs.com/wyqn/p/8493456.html

区块链技术原理

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 以比特币的区块链为例&#xff0c;你可以把区块链想象成一个比特币的公共账本&#xff0c;这个账本&#xff1a; 1.存放在互联网的各个比…

Spring之事务管理配置

1. 基于注解的事务配置 1. 在需要添加事务的方法上加上Transactional注解2. Spring的配置文件中配置事务管理器1 <!-- 添加事务管理器组件DataSourceTransactionManager -->2 <bean id"transactionManager"3 class"org.springframewor…

iOS 图片处理-图片旋转和裁剪

项目中要求处理图片, 简单记录一下图片旋转和裁剪过程 /** 将图片旋转弧度radians */- (UIImage *)imageRotatedByRadians:(CGFloat)radians{ // calculate the size of the rotated views containing box for our drawing space UIView *rotatedViewBox [[UIView alloc…

ThinkPHP 3.1.2 视图 1

一、模板的使用 &#xff08;重点&#xff09;a、规则模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html&#xff08;.tpl&#xff09;更换模板文件的后缀名&#xff08;修改配置文件&#xff09;TMPL_TEMP…

mysql事务处理用法与实例详解

MySQL的事务支持不是绑定在MySQL服务器本身&#xff0c;而是与存储引擎相关1.MyISAM&#xff1a;不支持事务&#xff0c;用于只读程序提高性能 2.InnoDB&#xff1a;支持ACID事务、行级锁、并发 3.Berkeley DB&#xff1a;支持事务一个事务是一个连续的一组数据库操作&#xff…

C++ 类的内存分布

C类内存分布 转自&#xff1a;http://www.cnblogs.com/jerry19880126/p/3616999.html先写下总结&#xff0c;通过总结下面的例子&#xff0c;你就会明白总结了。下面总结一下&#xff1a; 1、虚基类指针和虚函数指针是可以继承的 2. 虚函数指针来源于父类或者自己是第一个声明虚…

iOS 关于手机权限的检查与获取

手机通讯录权限: /** * 检测权限并作响应的操作 */ - (void)checkAuthorizationStatus:(UISwitch *)sender { switch (ABAddressBookGetAuthorizationStatus()) { case kABAuthorizationStatusAuthorized: //存在权限 //获取通讯…

也谈谈区块链技术

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链社区&#xff0c;未经允许拒绝转载。 现在区块链技术很火&#xff0c;而且几乎被上升到了一个“革命性”的高度&#xff0c;很多股票居然都因为沾了点区块链变得炙手可热。其实这玩意没有这么…

nyoj——297(期望)

GoroSort 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;4描述Goro has 4 arms. Goro is very strong. You dont mess with Goro. Goro needs to sort an array of N different integers. Algorithms are not Goros strength; strength is Gor…

js ajax调用请求

<pre name"code" class"html"> function getAppList(env){var data {};data.env env;var successfn function(jdata){$(".deploy_list").html("");_HTML "<tr><th>发布清单</th></tr>";$…

iOS SDWebImage加载webp

项目更新使用的最新版本的SDWebImage, 需配置如下: Build Settings -> preprocessor macros -> 添加 SD_WEBP1

区块链之初识区块链

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 首先得明白几个概念&#xff1a;区块链&#xff0c;比特币&#xff0c;中心化&#xff0c;去中心化&#xff0c;挖矿 区块链和比特币 区…

Linux RSS/RPS/RFS/XPS对比

RSS适合于多队列网卡&#xff0c;把不同的流分散的不同的网卡多列中&#xff0c;至于网卡队列由哪个cpu处理还需要绑定网卡队列中断与cpuRPS&#xff1a;适合于单队列网卡或者虚拟网卡&#xff0c;把该网卡上的数据流让多个cpu处理RFS&#xff1a;当流量需要传输到用户态处理时…

iOS 关于UIView覆盖StatusBar的小知识点

项目中有关于浏览图片的需求, 自己写了一套, 但是一直有个关于StatusBar的问题: 因为在查看图片时隐藏掉了StatusBar, 当结束查看后再显示sta会发现整个界面下滑了20px, 在IM聊天界面这个滑动效果很不友好 最近在优化这一块东西时又想到了这个问题, 现在得到了比较好的解决方…

从数字货币说起

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 从数字货币说起 历史上&#xff0c;货币的形态经历了多个阶段的演化&#xff0c;包括实物货币、金属货币、代用货币、信用货币、电子货币、…

git常用命令及规范流程

参考地址&#xff1a;https://www.cnblogs.com/my--sunshine/p/7093412.html&#xff0c;感谢分享 官网地址&#xff1a;https://git-scm.com/book/zh/v2 git init 在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个repo,并在当前文件夹下创建一个.git文件夹.git…

关于iOS 11的适配

距离iOS 11正式发布也有小半年了, 陆陆续续也看到许多关于iOS 11和iPhone X适配相关的文章, 现记录下自己做适配所做的工作 首先给出自己适配所用到的宏定义, 如下://状态栏 #define kStatusBarHeight [[UIApplication sharedApplication] statusBarFrame].size.height //导航条…