一、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