性能测试之JVM的故障排查-死锁
2024-09-02 05:53:34
死锁原因
Java发生死锁的根本原因是:在申请锁时发生了交叉闭环申请。即线程在获得了锁A并且没有释放的情况下去申请锁B,这时,另一个线程已经获得了锁B,在释放锁B之前又要先获得锁A,因此闭环发生,陷入死锁循环。
监控死锁
VisualVM监控工具有明显线程死锁提醒,也可监控到发生死锁的线程、类、代码行数、数据类型。
分析死锁
- VisualVM生成threaddump,查找死锁代码块内存地址
- VisualVM生成heapdump, 使用OQL查看被死锁对象的值和引用
select heap.findObject("0x00000006c0276428")
- 使用OQL的另一种方法
jmap -dump:live,file=/data/test.map <jps端口号>
jhat /data/test.map
浏览器访问 http://ip:7000/
示例代码
/*
* 线程死锁等待演示
*/
static class SynAddRunalbe implements Runnable {
int a, b;
public SynAddRunalbe(int a, int b) {
this.a = a;
this.b = b;
}
@Override
public void run() {
synchronized (Integer.valueOf(a)) {
synchronized (Integer.valueOf(b)) {
System.out.println(a + b);
}
}
}
public static void main(String[] args) throws Exception {
for (int i=0;i< 100; i++) {
new Thread(new SynAddRunalbe(1, 2)).start();
new Thread(new SynAddRunalbe(2, 1)).start();
}
}
扫一扫,关注我
最新文章
- [SE0]简单的搜索引擎原理
- HTML5视频Video 音频Audio
- ThinkBox DOC
- SQLite介绍、学习笔记、性能测试
- AE+C# 向axPageLayoutControl1添加图例
- HDU1429+bfs+状态压缩
- [Unity3d]小地图的制作
- Oracle 设置日志模式
- group By 和 Union 、 Union all的用法
- 利用Rsync在windows和linux之间同步数据
- 区块链入门(1):搭建(Ubuntu系统)Truffle v3.2.1 开发和测试环境
- Git服务搭建及github使用教程
- 洛谷 P3455&;BZOJ1101 【[POI2007]ZAP-Queries】
- ES6常用语法(下)
- Wechart 饼图
- Linux&;Windows中VNC协议及使用方法
- c++中友元机制
- js-ES6学习笔记-Generator函数的应用
- Amazon电商数据分析——数据获取
- [ios]iOS8 定位
热门文章
- 记一次磁盘UUID不能识别故障处理
- 如何使用 Python 進行字串格式化
- Python-类属性查询协议-__getattr__ __getattribute__
- 给select赋值的一种方法
- 【Python】使用Python解释器
- 003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程
- c++中的#include ";stdafx.h";
- Unicode、UTF8、GB2312、ANSI
- 《C++primerplus》第9章练习题
- OneWire总线的Arduino库函数