linux 線程查看 和 Jvm棧線程ID對應


一、proc查看進程和線程

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

查看status文件:

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

 

上面的threads 就是mysqld進程(這里pid是5877)開啟的線程數,為107個。

查看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對應

 查看負載高的線程id,以 26092 為例,轉換成16進制

 

[bppf_b@CSHJ_QZJK2 ~]$ echo 'obase=16;26092' | bc
65EC

 

3.通過jstack 命令查看棧信息

"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]  線程棧起始地址


參考:http://www.361way.com/linux-process-threads/3664.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM