没有合适的资源?快使用搜索试试~ 我知道了~
jvm 堆栈性能分析.pdf
资源推荐
资源详情
资源评论
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/release/download_crawler_static/89346314/bg1.jpg)
性能分析之-- JAVA Thread Dump 分析综述
一、Thread Dump 介绍
1.1 什么是 Thread Dump?
Thread Dump 是非常有用的诊断 Java 应用问题的工具。每一个 Java 虚拟机
都有及时生成所有线程在某一点状态的 thread-dump 的能力,虽然各个 Java
虚拟机打印的 thread dump 略有不同,但是大多都提供了当前活动线程的快
照,及 JVM 中所有 Java 线程的堆栈跟踪信息,堆栈信息一般包含完整的类名
及所执行的方法,如果可能的话还有源代码的行数。
1.2 Thread Dump 特点
1. 能在各种操作系统下使用
2. 能在各种 Java 应用服务器下使用
3. 可以在生产环境下使用而不影响系统的性能
4. 可以将问题直接定位到应用程序的代码行上
1.3 Thread Dump 能诊断的问题
1. 查找内存泄露,常见的是程序里 load 大量的数据到缓存;
2. 发现死锁线程;
![](https://csdnimg.cn/release/download_crawler_static/89346314/bg2.jpg)
1.4 如何抓取 Thread Dump
一般当服务器挂起,崩溃或者性能底下时,就需要抓取服务器的线程堆栈(Thread
Dump)用于后续的分析. 在实际运行中,往往一次 dump 的信息,还不足以
确认问题。为了反映线程状态的动态变化,需要接连多次做 threaddump,每
次间隔 10-20s,建议至少产生三次 dump 信息,如果每次 dump 都指向同
一个问题,我们才确定问题的典型性。
有很多方式可用于获取 ThreadDump, 下面列出一部分获取方式:
操作系统命令获取 ThreadDump:
Windows:
1.转向服务器的标准输出窗口并按下 Control + Break 组合键, 之后需要将线程
堆栈复制到文件中;
UNIX/ Linux:
首先查找到服务器的进程号(process id), 然后获取线程堆栈.
1. ps –ef | grep java
2. kill -3 <pid>
注意:一定要谨慎, 一步不慎就可能让服务器进程被杀死。kill -9 命令会杀死
进程。
JVM 自带的工具获取线程堆栈:
JDK 自带命令行工具获取 PID,再获取 ThreadDump:
1. jps 或 ps –ef|grepjava (获取 PID)
![](https://csdnimg.cn/release/download_crawler_static/89346314/bg3.jpg)
2. jstack [-l ]<pid> | tee -a jstack.log (获取 ThreadDump)
二、java 线程的状态转换介绍(为后续分析做准备)
2.1 新建状态(New)
用 new 语句创建的线程处于新建状态,此时它和其他 Java 对象一样,仅仅在
堆区中被分配了内存。
2.2 就绪状态(Runnable)
当一个线程对象创建后,其他线程调用它的 start()方法,该线程就进入就绪状
态,Java 虚拟机会为它创建方法调用栈和程序计数器。处于这个状态的线程位
于可运行池中,等待获得 CPU 的使用权。
2.3 运行状态(Running)
处于这个状态的线程占用 CPU,执行程序代码。只有处于就绪状态的线程才有
机会转到运行状态。
![](https://csdnimg.cn/release/download_crawler_static/89346314/bg4.jpg)
2.4 阻塞状态(Blocked)
阻塞状态是指线程因为某些原因放弃 CPU,暂时停止运行。当线程处于阻塞状
态时,Java 虚拟机不会给线程分配 CPU。直到线程重新进入就绪状态,它才有
机会转到运行状态。
阻塞状态可分为以下 3 种:
1)位于对象等待池中的阻塞状态(Blocked in object’s wait pool):当线
程处于运行状态时,如果执行了某个对象的 wait()方法,Java 虚拟机就会把线
程放到这个对象的等待池中,这涉及到“线程通信”的内容。
2)位于对象锁池中的阻塞状态(Blocked in object’s lock pool):当线程
处于运行状态时,试图获得某个对象的同步锁时,如果该对象的同步锁已经被
其他线程占用,Java 虚拟机就会把这个线程放到这个对象的锁池中,这涉及到
“线程同步”的内容。
3)其他阻塞状态(Otherwise Blocked):当前线程执行了 sleep()方法,或
者调用了其他线程的 join()方法,或者发出了 I/O 请求时,就会进入这个状
态。
2.5 死亡状态(Dead)
当线程退出 run()方法时,就进入死亡状态,该线程结束生命周期。
三、Thread Dump 分析
通过前面 1.4 部分的方法,获取 Thread Dump 信息后,对其进行分析;
3.1 首先介绍一下 Thread Dump 信息的各个部分
头部信息:
![](https://csdnimg.cn/release/download_crawler_static/89346314/bg5.jpg)
时间,jvm 信息
2011-11-02 19:05:06
Full thread dump Java HotSpot(TM) Server VM (16.3-
b01 mixed mode):
线程 info 信息块:
1. "Timer-0" daemon prio=10tid=0xac190c00 nid=0xaef in Object.wait()
[0xae77d000]
2. java.lang.Thread.State: TIMED_WAITING (on object monitor)
3. atjava.lang.Object.wait(Native Method)
4. -waiting on <0xb3885f60> (a java.util.TaskQueue) ###继续 wait
5. atjava.util.TimerThread.mainLoop(Timer.java:509)
6. -locked <0xb3885f60> (a java.util.TaskQueue) ###已经 locked
7. atjava.util.TimerThread.run(Timer.java:462)
* 线程名称:Timer-0
* 线程类型:daemon
* 优先级: 10,默认是 5
* jvm 线程 id:tid=0xac190c00,jvm 内部线程的唯一标识(通过
java.lang.Thread.getId()获取,通常用自增方式实现。)
* 对应系统线程 id(NativeThread ID):nid=0xaef,和 top 命令查看的线
程 pid 对应,不过一个是 10 进制,一个是 16 进制。(通过命令:top -H -p
pid,可以查看该进程的所有线程信息)
剩余65页未读,继续阅读
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/65c02cef028d4c32a8f4dbbb84e42f92_gwc791224.jpg!1)
shandongwill
- 粉丝: 3896
- 资源: 489
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)