#### Jstack命令
jstack是java虛擬機自帶的一種堆棧跟蹤工具。用于打印出給定的java進程ID或core file或遠程調試服務的java堆棧信息。
可以用來生成java虛擬機當前時刻的線程快照。
生成快照的主要目的是定位線程出現長時間停頓的原因,如*死鎖、死循環、請求外部資源超時等待*等。
線程出現停頓的時候通過jstack來查看哥哥線程的調用堆棧,就可以直到沒有響應的線程到底在后臺做什么事情,或者等待什么資源。
*****
例子:
**示例代碼**
```
public class DeadLock implements Runnable {
private int flag;
private static final Object a = new Object();
private static final Object b = new Object();
public DeadLock(int flag) {
this.flag = flag;
}
@Override
public void run() {
if (flag == 1) {
synchronized (a) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("當前線程:"+Thread.currentThread().getName()+"嘗試獲取b");
synchronized (b) {
System.out.println("當前線程:"+Thread.currentThread().getName()+"獲得了b");
}
}
} else {
synchronized (b) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("當前線程:"+Thread.currentThread().getName()+"嘗試獲取a");
synchronized (a) {
System.out.println("當前線程:"+Thread.currentThread().getName()+"等待獲得a");
}
}
}
}
}
```
*****
```
public class DeadLockLauncher {
public static void main(String[] args) {
final DeadLock deadLock1 = new DeadLock(1);
final DeadLock deadLock2 = new DeadLock(0);
Thread t1 = new Thread(deadLock1, "線程1");
Thread t2 = new Thread(deadLock2, "線程2");
t1.start();
t2.start();
}
}
```
*****
* 打開命令行窗口,輸入 jps
```
C:\Users\heyfan.xie>jps
16592 Jps
17232 DeadLockLauncher
7872
17092 Launcher
14040 Launcher
```
* 死鎖啟動類ID為 17232, 輸入 jstack -F 17232
```
C:\Users\heyfan.xie>jstack -F 17232
Attaching to process ID 17232, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.92-b14
Deadlock Detection:
Found one Java-level deadlock:
=============================
"線程2":
waiting to lock Monitor@0x000000001f1e0288 (Object@0x000000076ba3f420, a java/lang/Object),
which is held by "線程1"
"線程1":
waiting to lock Monitor@0x000000001f1e1728 (Object@0x000000076ba3f430, a java/lang/Object),
which is held by "線程2"
Found a total of 1 deadlock.
Thread 3: (state = BLOCKED)
Thread 22: (state = BLOCKED)
- cn.cici.frigate.logistics.dead.DeadLock.run() @bci=120, line=41 (Interpreted frame)
- java.lang.Thread.run() @bci=11, line=745 (Interpreted frame)
Thread 21: (state = BLOCKED)
- cn.cici.frigate.logistics.dead.DeadLock.run() @bci=34, line=30 (Interpreted frame)
- java.lang.Thread.run() @bci=11, line=745 (Interpreted frame)
Thread 15: (state = IN_NATIVE)
- java.net.SocketInputStream.socketRead0(java.io.FileDescriptor, byte[], int, int, int) @bci=0 (Interpreted frame)
- java.net.SocketInputStream.socketRead(java.io.FileDescriptor, byte[], int, int, int) @bci=8, line=116 (Interpreted frame)
// 省略更多的信息
```
* 可以看到* Found a total of 1 deadlock* 競爭鎖定的對象為 java/lang/Object
- 虛擬機
- JVM內存結構
- JVM調優手段
- java對象生命周期
- 垃圾回收判斷對象死亡
- 垃圾回收算法
- 垃圾收集器
- JAVA基礎知識
- java事件機制
- java反射機制
- jvm創建對象
- java異常
- finally語句一定會執行嗎?
- 集合類介紹
- ArrayList
- LinkedList
- HashMap
- ConcurrentHashMap
- 多線程
- 為什么要使用線程池
- 線程死鎖
- 死鎖檢測和解除
- jstack
- jconsole
- 死鎖預防
- 常見線程池
- 線程池參數
- 工作隊列介紹
- 拒絕策略
- ThreadLocal
- CAS
- ReentrantLock
- AQS
- CountDownLatch
- Spring
- spring中bean的作用域
- REDIS
- redis數據結構
- redis hash實現
- redis rehash與hashmap擴容的區別
- Redis使用場景
- Redis為何這么快
- redis連接數不足導致錯誤
- 分布式
- 分布式事務
- ACID
- CAP
- BASE
- 事務隔離性
- 一致性哈希算法
- 負載均衡算法
- Hystrix 信號量和線程池隔離的差異
- Spring Cloud
- eureka
- MYSQL
- mysql優化經驗
- undo redo binlog
- web
- http協議
- http和https區別
- Cookie和session
- TCP三次握手、4次揮手
- TCP的time_wait和close_wait
- 算法問題
- 編輯距離算法
- MQ
- RabbitMq
- Kafka
- 安裝教程
- Win ELK安裝