linux 線程查看 (proc命令)與Jvm棧線程ID(jstack命令)

一、proc查看進程和線程

該方法是個人最爲推薦,也最喜歡的一種方法。進程文件下,有幾種方式可以獲取目前進程開啓的進程數。

查看status文件:

# cat /proc/5877/status
Name: mysqld
State: S (sleeping)
Tgid: 5877
Pid: 5877
PPid: 1
……………………省略
Threads: 107
……………………省略

上面的threads 就是mysqld進程(這裏pid是5877)開啓的線程數,爲107個。

解讀/proc/$PID/status中各種參數:https://my.oschina.net/aiguozhe/blog/125477

查看sched文件:

# cat /proc/5877/sched
mysqld (5877, #threads: 107)
---------------------------------------------------------
se.exec_start : 3493311530.012024
se.vruntime : 11069857.718492
se.sum_exec_runtime : 193606.973849
se.statistics.wait_start : 0.000000
………………省略

第一行就指出了mysqld的pid和總線程數。

查看線程的具體情況:

# ls /proc/5877/task
12134 17039 22613 22619 22626 22631 22636 22641 22646 22653 22661 22671 22681 22690 22699 22725 22741 29749 5891 5896 5920 9441
12142 17161 22614 22621 22627 22632 22637 22642 22648 22654 22663 22673 22683 22692 22701 22727 22743 30458 5892 5897 5921 9764
12290 17163 22615 22622 22628 22633 22638 22643 22649 22655 22665 22675 22684 22693 22703 22735 22745 5877 5893 5898 5930
12352 17253 22616 22624 22629 22634 22639 22644 22650 22656 22667 22676 22687 22695 22705 22738 22747 5889 5894 5918 644
12874 22612 22617 22625 22630 22635 22640 22645 22652 22658 22669 22679 22689 22697 22723 22740 2708 5890 5895 5919 9318

task下是以線程id 值命名的目錄,可以使用ls |wc 統計出的值和上面兩種方式查出的結果一樣。進入各線程id的目錄,可以查看具體線程的資源信息。

 

二、Jvm棧線程ID對應

拿到進程 pid 後,可以使用 top 命令,來看是什麼線程佔用了 CPU。
top -p 12309 -H

-p 用於指定進程,-H 用於獲取每個線程的信息,從 top 輸出的內容,可以看到有四個線程佔用了非常高的 CPU:

到這裏可以拿到12313、12312、12311、12314這四個線程id。爲了確定這些是什麼線程,需要使用 jstack 命令來查看這幾個是什麼線程。高佔用CPU的是什麼線程?

 

通過jstack 命令查看棧信息

jstack 是 Java 虛擬機自帶的一種堆棧跟蹤工具,用於打印出給定的 Java 進程 ID 或 core file 或遠程調試服務的 Java 堆棧信息。使用下面命令,將 Java 進程的堆棧信息打印到文件中:
jstack -l 12309 > stack.log

"pool-1-thread-1" daemon prio=10 tid=0x00007fdd94037800 nid=0x65ec waiting on condition [0x00007fddf04be000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000c8025c40> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
        at java.lang.Thread.run(Thread.java:662

總結:java棧中, 第一行裏,"

pool-1-thread-1"是 Thread Name 
tid指Java Thread id。
nid指native線程的id。
prio是線程優先級。
指線程在0x00000000c8025c40 這個地址上等待。
waiting on condition [0x00007fddf04be000]  線程棧起始地址
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章