Câu trả lời nằm ở lệnh jps - bong da doi thuong bang the cao
Xin lỗi vì tiêu đề có vẻ clickbait, nhưng thực sự những công cụ này rất mạnh mẽ. Trước đây tôi đã giới thiệu một chút về chúng khi giải quyết một số vấn đề, và gần đây tôi lại gặp thêm một tình huống cần kiểm tra vấn đề. Khi làm việc với môi trường máy chủ, không thể sử dụng IDEA để dump thread
trực tiếp, vậy nên lúc này chúng ta phải dùng đến các công cụ tích hợp của Java.
jstack & 888bets jps
Chẳng hạn như lệnh jstack
, nó thực sự đơn giản đến mức khó tin. Hãy xem thông tin trợ giúp (help)! Bạn chỉ cần thêm tham số -l
để hiển thị thêm thông tin về khóa (lock), sau đó điền ID tiến trình (PID) vào. Một câu hỏi thú vị sẽ nảy ra ở đây: "Làm thế nào để biết ID tiến trình của ứng dụng Java?" Câu trả lời nằm ở lệnh jps
. Nó cũng rất dễ sử dụng, bạn chỉ cần gõ jps
là đủ, hoặc bạn cũng có thể kiểm tra thêm thông tin bằng cách dùng lệnh jps -help
.
Ngoài ra, nếu thêm tham số -m
, bạn sẽ thấy các đối số được truyền cho phương thức main
. Ví dụ, nếu bạn cấu hình thêm tham số nào đó, bạn có thể kiểm tra nó bằng lệnh jps -m
. Nếu thêm tham số -v
, nó sẽ in ra các tham số của JVM mà bạn đã thiết lập. Sau khi hiểu rõ về jps
, chúng ta tiếp tục tìm hiểu về jstack
.
Để minh họa rõ hơn, tôi sẽ tạo một mua the game w88 o dau tình huống có chứa deadlock trong mã nguồn:
1public static void main(String[] args) throws InterruptedException {
2 SpringApplication.run(ThreadDumpDemoApplication.class, args);
3 ReentrantLock lock1 = new ReentrantLock();
4 ReentrantLock lock2 = new ReentrantLock();
5
6 Thread t1 = new Thread() {
7 @Override
8 public void run() {
9 try {
10 lock1.lock();
11 TimeUnit.SECONDS.sleep(1);
12 lock2.lock();
13 } catch (InterruptedException e) {
14 e.printStackTrace();
15 }
16 }
17 };
18
19 Thread t2 = new Thread() {
20 @Override
21 public void run() {
22 try {
23 lock2.lock();
24 TimeUnit.SECONDS.sleep(1);
25 lock1.lock();
26 } catch (InterruptedException e) {
27 e.printStackTrace();
28 }
29 }
30 };
31
32 t1.setName("mythread1");
33 t2.setName("mythread2");
34 t1.start();
35 t2.start();
36 Thread.sleep(10000);
37}
Kết quả từ jstack
sẽ trông như sau:
12020-08-02 21:50:32
2Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.201-b09 mixed mode):
3
4"DestroyJavaVM" #147 prio=5 os_prio=31 tid=0x00007fc9dd807000 nid=0x2603 waiting on condition [0x0000000000000000]
5 java.lang.Thread.State: RUNNABLE
6 Locked ownable synchronizers:
7 - None
8
9"mythread2" #140 prio=5 os_prio=31 tid=0x00007fc9dd877000 nid=0x9903 waiting on condition [0x0000700006fb9000]
10 java.lang.Thread.State: WAITING (parking)
11 at sun.misc.Unsafe.park(Native Method)
12 - parking to wait for <0x000000076f5d4330> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
13 at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
14 at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
15 ...
16 Locked ownable synchronizers:
17 - <0x000000076f5d4360> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
18
19"mythread1" #139 prio=5 os_prio=31 tid=0x00007fc9de873800 nid=0x9a03 waiting on condition [0x0000700006eb6000]
20 java.lang.Thread.State: WAITING (parking)
21 at sun.misc.Unsafe.park(Native Method)
22 - parking to wait for <0x000000076f5d4360> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
23 at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
24 at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
25 ...
26 Locked ownable synchronizers:
27 - <0x000000076f5d4330> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
28
29... [Các luồng khác] ...
30
31Found one Java-level deadlock:
32=============================
33"mythread2":
34 waiting for ownable synchronizer 0x000000076f5d4330, (a java.util.concurrent.locks.ReentrantLock$NonfairSync), which is held by "mythread1"
35"mythread1":
36 waiting for ownable synchronizer 0x000000076f5d4360, (a java.util.concurrent.locks.ReentrantLock$NonfairSync), which is held by "mythread2"
37
38Java stack information for the threads listed above:
39===================================================
40"mythread2":
41 at sun.misc.Unsafe.park(Native Method)
42 - parking to wait for <0x000000076f5d4330> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
43 at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
44 at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
45 ...
46"mythread1":
47 at sun.misc.Unsafe.park(Native Method)
48 - parking to wait for <0x000000076f5d4360> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
49 at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
50 at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
51 ...
52
53Found 1 deadlock.
54``` [bong da doi thuong bang the cao](/post/bab1ff1d1435b774.html)