導航:首頁 > 操作系統 > linux查看線程的堆棧

linux查看線程的堆棧

發布時間:2023-12-03 10:03:29

㈠ kill-3生成的線程堆棧怎麼查看

第一步:在終端運行java程序
第二步:通過命令 pidof java 找到已經啟動的java進程的ID,選擇需要查看的java程序的進程ID
第三步:使用命令 kill -3 <java進行的 pid> 列印出java程序的線程堆棧信息
第四步:通常情況下運行的項目可能會比較大,那麼這個時候列印的堆棧信息可能會有幾千到幾萬行,為了方便查看,我們往往需要將輸出內容進行重定向
使用linux下的重定向命令方式即可:例如: demo.sh > run.log 2>&1 將輸出信息重定向到 run.log中。
註:在操作系統中,0 1 2分別對應著不同的含義, 如下:
0 : 標准輸入,即:C中的stdin , java中的System.in
1 : 標准輸出, 即:C中的stdout ,java中的System.out
2 : 錯誤輸出, 即:C中的stderr , java中的System.err

Demo:
----------------------------------------------------------------------------------------------
Sources Code :
public class PrintThreadTrace {

Object obj1 = new Object();
Object obj2 = new Object();

public void func1(){
synchronized (obj1){
func2();
}
}

public void func2(){
synchronized (obj2){
while(true){
System.out.print("");
}
}
}

public static void main(String[] args){
PrintThreadTrace ptt = new PrintThreadTrace();
ptt.func1();
}
}

----------------------------------------------------------------------------------------------------------------
按照步驟操作後的列印輸出信息:

Full thread mp Java HotSpot(TM) 64-Bit Server VM (24.79-b02 mixed mode):

"Service Thread" daemon prio=10 tid=0x00007fdc880a9000 nid=0x12a4 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=10 tid=0x00007fdc880a7000 nid=0x12a3 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=10 tid=0x00007fdc880a4000 nid=0x12a2 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"JDWP Command Reader" daemon prio=10 tid=0x00007fdc50001000 nid=0x1299 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"JDWP Event Helper Thread" daemon prio=10 tid=0x00007fdc880a1800 nid=0x1298 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"JDWP Transport Listener: dt_socket" daemon prio=10 tid=0x00007fdc8809e000 nid=0x1297 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x00007fdc88091000 nid=0x1296 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x00007fdc88071800 nid=0x1295 in Object.wait() [0x00007fdc77ffe000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000ecb04858> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x00000000ecb04858> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

"Reference Handler" daemon prio=10 tid=0x00007fdc8806f800 nid=0x1294 in Object.wait() [0x00007fdc7c10b000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000ecb04470> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
- locked <0x00000000ecb04470> (a java.lang.ref.Reference$Lock)

"main" prio=10 tid=0x00007fdc8800b800 nid=0x128e runnable [0x00007fdc8fef7000]
java.lang.Thread.State: RUNNABLE
at com.wenchain.study.PrintThreadTrace.func2(PrintThreadTrace.java:20)
- locked <0x00000000ecc04b20> (a java.lang.Object)
at com.wenchain.study.PrintThreadTrace.func1(PrintThreadTrace.java:13)
- locked <0x00000000ecc04b10> (a java.lang.Object)
at com.wenchain.study.PrintThreadTrace.main(PrintThreadTrace.java:27)

"VM Thread" prio=10 tid=0x00007fdc8806b000 nid=0x1293 runnable

"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007fdc88021000 nid=0x128f runnable

"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007fdc88023000 nid=0x1290 runnable

"GC task thread#2 (ParallelGC)" prio=10 tid=0x00007fdc88024800 nid=0x1291 runnable

"GC task thread#3 (ParallelGC)" prio=10 tid=0x00007fdc88026800 nid=0x1292 runnable

"VM Periodic Task Thread" prio=10 tid=0x00007fdc880b3800 nid=0x12a5 waiting on condition

JNI global references: 1391

Heap
PSYoungGen total 17920K, used 1270K [0x00000000ecb00000, 0x00000000ede80000, 0x0000000100000000)
eden space 15872K, 8% used [0x00000000ecb00000,0x00000000ecc3d898,0x00000000eda80000)
from space 2048K, 0% used [0x00000000edc80000,0x00000000edc80000,0x00000000ede80000)
to space 2048K, 0% used [0x00000000eda80000,0x00000000eda80000,0x00000000edc80000)
ParOldGen total 39424K, used 0K [0x00000000c6200000, 0x00000000c8880000, 0x00000000ecb00000)
object space 39424K, 0% used [0x00000000c6200000,0x00000000c6200000,0x00000000c8880000)
PSPermGen total 21504K, used 2619K [0x00000000c1000000, 0x00000000c2500000, 0x00000000c6200000)
object space 21504K, 12% used [0x00000000c1000000,0x00000000c128edd8,0x00000000c2500000)

----------------------------------------------------------------------------------------------------------------------------
上面的信息中包含了當前JVM中所有運行的線程信息,其中在示例中我們啟動的線程為main線程,其餘的都是JVM自己創建的。
在列印的信息中,我們可以清楚的看見當前線程的調用上下文,可以很清楚的知道程序的運行情況。
並且我們在最後面還能看見當前虛擬機中的內存使用情況,青年世代,老年世代的信息等等...

PS: 在JDK1.5以上,我們可以通過在Java程序中調用Thread.getStackTrace()方法來進行堆棧的自動列印,使得線程堆棧的列印時機可編程控制。
文章知識點與官方知識檔案匹配
Java技能樹首頁概覽
89841 人正在系統學習中
點擊閱讀全文
打開CSDN,閱讀體驗更佳

jstack-查看Java進程的線程堆棧信息,鎖定高消耗資源代碼
jstack主要用來查看某個Java進程內的線程堆棧信息。語法格式如下: jstack[option]pid jstack[option]executable core jstack[option][server-id@]remote-hostname-or-ip 命令行參數選項說明如下: ...
011Java並發包018查看線程堆棧信息_執筆未來的博客
java.util.concurrent.ScheledThreadPoolExecutor$DelayedWorkQueue.take(ScheledThreadPoolExecutor.java:1088) java.util.concurrent.ScheledThreadPoolExecutor$DelayedWorkQueue.take(ScheledThreadPoolExecutor.java:809) java.util.concurre...
最新發布 jstack -- java堆棧常用排查指令
jstack -- java堆棧常用排查指令
繼續訪問

熱門推薦 jstack 命令查看JAVA線程堆棧
JAVA堆棧信息實際生產中,可能由於開發以及測試未能全面覆蓋的代碼質量、性能問題,而引致線程掛起甚至崩潰。可能就需要查看堆棧信息來排查問題了。jps -lvmjps -lvm 用於查看當前機器上運行的java進程。C:\Users\Administrator>jps -lvm 7348 -Dosgi.requiredJavaVersion=1.8 -Dosgi.instance.area.defa
繼續訪問
Java多線程——查看線程堆棧信息
Java多線程——查看線程堆棧信息 摘要:本文主要介紹了查看線程堆棧信息的方法。 使用Thread類的getAllStackTraces()方法 方法定義 可以看到getAllStackTraces()方法的返回值是一個Map對象,key是Thread的實例,value是一個StackTraceElement實例數組: 1 public static Map<Thread, S...
繼續訪問
java堆棧常用排查指令
java 異常排查四板斧 1、查看java 堆棧線程信息 說明 jstack命令列印指定Java進程、核心文件或遠程調試伺服器的Java線程的Java堆棧跟蹤信息。 對於每個Java框架,完整的類名,方法名, 位元組碼索引(BCI)和行號(如果有的話)被列印出來。 使用-m選項,jstack命令列印程序中所有線程的Java和本機幀 計數器(PC)。 對於每個本機幀,當可用時,將列印離PC最近的本機符號。 c++亂碼的名字不會被修改。 要demangle c++名稱,輸出這個 命令可以管道到c++filt。 當
繼續訪問
java診斷工具-Arthas(thread命令)查看當前線程堆棧
cpu使用率與linux 命令top -H -p <pid>的線程CPU類似 1、支持一鍵展示當前最忙的前N個線程並列印堆棧 thread -n 3 沒有線程ID,包含[Internal]表示為JVM內部線程,參考dashboard命令的介紹。 cpuUsage為采樣間隔時間內線程的CPU使用率,與dashboard命令的數據一致。 deltaTime為采樣間隔時間內線程的增量CPU時間,小於1ms時被取整顯示為0ms。 time線程運行總CPU...
繼續訪問

java查看線程的堆棧信息
通過使用jps 命令獲取需要監控的進程的pid,然後使用jstackpid 命令查看線程的堆棧信息。 通過jstack命令可以獲取當前進程的所有線程信息。 每個線程堆中信息中,都可以查看到線程ID、線程的狀態(wait、sleep、running 等狀態)、是否持有鎖信息等。 jstack -l <pid> >jvm_listlocks.txt 轉...
繼續訪問
java 查看線程堆棧信息_Java多線程——查看線程堆棧信息
java多線程——查看線程堆棧信息摘要:本文主要介紹了查看線程堆棧信息的方法。使用thread類的getallstacktraces()方法方法定義可以看到getallstacktraces()方法的返回值是一個map對象,key是thread的實例,value是一個stacktraceelement實例數組:1 public static map getallstacktraces()使用可以使...
繼續訪問
java線程堆棧信息分析
java堆棧信息分析
繼續訪問

java 查看堆棧_javap 命令查看堆棧中信息
javap命令是對.java文件進行反編譯,通過這個命令可以看到堆棧中是怎麼壓棧和出棧的已經執行順序,這里簡單解釋下javap的簡單的使用,下面舉個例子:題目:i++ 和++i的區別解釋:簡單點說 這個問題都不難回答,這里就不說了,但是實際上堆棧中區別也是老大了(這里就用到了javap命令), 步驟:1.在任意一個盤下面建一個名為Test.java的文件(文件名可以隨意命名)代碼如下:public...
繼續訪問
java 查看線程堆棧信息_jstack-查看Java進程的線程堆棧信息,鎖定高消耗資源代碼。...
jstack主要用來查看某個Java進程內的線程堆棧信息。語法格式如下:jstack[option]pidjstack[option]executablecorejstack[option][server-id@]remote-hostname-or-ip命令行參數選項說明如下:-llonglistings,會列印出額外的鎖信息,在發生死鎖時可以用jstack-lpid來觀察...
繼續訪問
java堆棧信息怎麼看_線程堆棧信息怎麼看? - cs_person的個人空間 - OSCHINA - 中文開源技術交流社區...
一條線程堆棧信息大概長成下面這個樣子:RMI TCP Connection(267865)-172.16.5.25" daemon prio=10 tid=0x00007fd508371000 nid=0x55ae waiting for monitor entry [0x00007fd4f8684000]java.lang.Thread.State: BLOCKED (on object m...
繼續訪問
線程堆棧信息怎麼看?
一條線程堆棧信息大概長成下面這個樣子: RMI TCP Connection(267865)-172.16.5.25" daemon prio=10 tid=0x00007fd508371000 nid=0x55ae waiting for monitor entry [0x00007fd...
繼續訪問
java的棧和堆
棧與堆都是Java用來在Ram中存放數據的地方。與C++不同,Java自動管理棧和堆,程序員不能直接地設置棧或堆。 Java 的堆是一個運行時數據區,類的(對象從中分配空間。這些對象通過new、newarray、anewarray和multianewarray等指令建立,它們不需要程序代碼來顯式的釋放。堆是由垃圾回收來負責的,堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,因為它是在...
繼續訪問
查看java線程_【JAVA】Java線程堆棧信息查看
如何獲得線程的堆棧信息?線上伺服器cpu 100%了,該如何排查問題?1.top命令查詢哪個pid進程佔用cpu高(ps -ef|grep java 獲取PID號)2.通過 top -Hp pid 可以查看該進程下各個線程的cpu使用情況,獲取佔用cpu高的線程id3.執行命令:printf "%X\n" 線程tid(用於獲取佔用cpu高的線程id的16進制數)4.執行命令:jstack pid ...
繼續訪問
kill -3 java_kill -3 PID命令獲取java應用堆棧信息
一、應用場景:當linux伺服器出現異常情況(響應緩慢,負載持續飆升)並且伺服器沒有安裝對應的包而無法使用jstack等命令時,可以使用linux的kill相關命令列印堆棧信息。命令格式:kill -3 PID二、執行步驟:2.1、獲取java進程的PIDps -ef|grep java結果的第二列數字就是進程對應的pid。2.2、kill -3 PID(1)如果項目通過Tomcat進行發布(普通...
繼續訪問
jstack 工具 查看JVM堆棧信息
1|0介紹 jstack是java虛擬機自帶的一種堆棧跟蹤工具。jstack用於列印出給定的java進程ID或corefile或遠程調試服務的Java堆棧信息,如果是在64位機器上,需要指定選項"-J-d64",Windows的jstack使用方式只支持以下的這種方式: jstack [-l] pid 主要分為兩個功能: a. 針對活著的進程做本地的或遠程的線程mp; b. 針對core文件做線程mp。 jstack用於生成java虛擬機當前時刻的線程快照。線程快照是...
繼續訪問

linux查看java堆棧
1、查看JAVA進程JVM參數 jinfo -flags pid(進程號) -XX:CICompilerCount=2 最大的並行編譯數 -XX:InitialHeapSize=16777216 JVM 的初始堆內存大小 -XX:MaxHeapSize=257949696 JVM 的最大堆內存大小 -XX:MaxNewSize=85983232 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=5570560 -XX:OldSize=11206656 2、JVM 查看.
繼續訪問
Linux 如何查看一個進程的堆棧
有兩種方法:第一種:pstack 進程ID第二種,使用gdb 然後attach 進程ID,然後再使用命令 thread apply all bt 兩種方法都可以列出進程所有的線程的當前的調用棧。不過,使用gdb的方法,還可以查看某些信息,例如局部變數,指針等。不過,如果只看調用棧的話,pstack還是很方便的。
繼續訪問
JAVA獲取堆棧信息
1. 通過Throwable獲取 StackTraceElement[] stackTrace = new Throwable().getStackTrace(); 2. 通過Thread獲取 StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
繼續訪問
java 查看線程棧大小_基於 Java 線程棧的問題排查
除日誌外,還有沒有別的方式跟蹤線上服務問題呢?或者,跟蹤並排除日誌里無法發現的問題?方法當然是有的,就是通過現場快照定位並發現問題。我們所說的現場,主要指這兩方面:Java 線程棧。線程棧是Java線程工作的快照,可以獲得當前線程在做什麼;Java 內存堆。堆是JVM的內存快照,可以獲取內存分配相關信息。

㈡ 如何獲取內核指定線程的調用棧

方法一:可以通過/proc/線程ID/stack來獲取指定線程當前的調用棧,但是該方案存在限制:可能不能准確獲取出問題的時候該線程的調用棧

方法二:通過內核介面save_stack_trace_tsk和%pS,在程序檢測到異常的時候列印出對應的調用棧用於問題定位,具體的方法(從內核/proc文件系統處理列印調用棧的proc_pid_stack中簡單修改而來):

[cpp] view plain
static int kprink_stack(struct task_struct *task)
{
struct stack_trace trace;
unsigned long *entries;
int err;

entries = kmalloc(MAX_STACK_TRACE_DEPTH * sizeof(*entries), GFP_KERNEL);
if (!entries)
return -ENOMEM;

trace.nr_entries = 0;/*調用返回後,為記錄的調用棧中的有效符號的個數*/
trace.max_entries = MAX_STACK_TRACE_DEPTH;/*傳入的trace.entries的大小,save_stack_trace_tsk最多保持該數量的調用棧符號*/
trace.entries = entries;/*返回的符號地址保存在這里*/
trace.skip = 0;/*從調用棧的頂開始,忽略的調用棧符號數量*/

err = lock_trace(task);
if (!err) {
save_stack_trace_tsk(task, &trace);

for (i = 0; i < trace.nr_entries; i++) {
printk(m, "[<%pK>] %pS\n",
(void *)entries[i], (void *)entries[i]);
}
unlock_trace(task);
}
kfree(entries);

return err;
}
說明:其中的%pS用於列印內核符號,內核的相關處理見printk--->vprintk--->vscnprintf-->vsnprintf-->symbol_string的處理

㈢ Linux裡面cpu佔用太高排查思路是什麼

思路就是top查看是什麼進程佔用高,一般是應用或者資料庫,應用方面可以看看運行吐出日誌是否有報錯信息,查netstat連接應用埠的會話是不是有異常,資料庫進程高,可以使用自帶的檢查命令後台看是否有執行很久的sql事務,鎖等待頻繁,報錯日誌等,找到問題針對性的優化,一步一步解決。

㈣ JVM常用調試工具介紹

一、Linux ps (英文全拼:process status)命令用於顯示當前進程的狀態

ps aux 基本輸出

ps aux 列名解釋

註:優化機器資源主要從佔用機器cpu和mem高的程序入手

二、Linux top命令查看正在運行的進程和系統負載信息,包括cpu負載、內存使用、簡野各個進程所佔系統資源等

基本輸出

欄位解釋

三、Linux top -H -p pid。查看某個進程內部線程佔用情況

四、jps(Java Virtual Machine Process Status Tool) 是java提供的一個顯示當前所有java進程pid的命令

五、jinfo LVMID。可以用來查看 Java 進程運行的 JVM 參數

六、jstat(Java Virtual Machine statistics monitoring tool)主要利用JVM內建的指令對Java應用程序的資源和性能進行實時的命令行的監控,包括了對Heap size和垃圾回收狀況的監控。可見,Jstat是輕量級的、專門針對JVM的工具,非常適用

七、jstack(Java Stack Trace Tool)主要用於生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部隱備資源導致的長時間等待等。 線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在後台做什麼事情,灶咐毀或者等待什麼資源

八、jmap命令(Java Memory Map)是其中之一。主要用於列印指定Java進程(或核心文件、遠程調試伺服器)的共享對象內存映射或堆內存細節

九、MAT(Memory Analysis Tools)是一個分析 Java堆數據的專業工具,用它可以定位內存泄漏的原因

此次分享准備過程中,發現JDK調試工具在Root用戶下訪問Yarn用戶啟動的Java虛擬機,獲取不到信息,jstatck獲取到的還不全(沒有線程描述信息行)
可以使用 sudo -u yarn /usr/java/jdk1.8.0_181-cloudera/bin/jstack 這種方式獲取。

㈤ linux cpu使用率過高排查

方法一

第一步:使用

top命令,然後按shift+p按照CPU排序

找到佔用CPU過高的進程的pid

第二步:使用

top -H -p [進程id]

找到進程中消耗資源最高的線程的id

第三步:使用

echo 'obase=16;[線程id]' | bc或者printf "%x " [線程id]

將線程id轉換為16進制(字母要小寫)

bc是linux的計算器命令

第四步:執行

jstack [進程id] |grep -A 10 [線程id的16進制]」

查看線程狀態信息

方法二

第一步:使用

top命令,然後按shift+p按照CPU排序

找到佔用CPU過高的進程

第二步:使用

ps -mp pid -o THREAD,tid,time | sort -rn

獲取線程信息,並找到佔用CPU高的線程

第三步:使用

echo 'obase=16;[線程id]' | bc或者printf "%x " [線程id]

將需要的線程ID轉換為16進制格式

第四步:使用

jstack pid |grep tid -A 30 [線程id的16進制]

列印線程的堆棧信息

案例分析

場景描述

生產環境下JAVA進程高CPU佔用故障排查

解決過程

1、根據top命令,發現PID為2633的Java進程佔用CPU高達300%,出現故障。

2、找到該進程後,如何定位具體線程或代碼呢,首先顯示線程列表,並按照CPU佔用高的線程排序:

1

[root@localhost ~]# ps -mp 2633 -o THREAD,tid,time | sort -rn

顯示結果如下:

化主動為被動的方式,一方面減輕了運維工程師的工作,另一方面也減小了運維漏看或者忽略告警的情況發生。

閱讀全文

與linux查看線程的堆棧相關的資料

熱點內容
程序員的基本功 瀏覽:517
遺傳演算法排班 瀏覽:284
如何加密金融安全網 瀏覽:27
家裡的wifi太卡了怎麼樣自己加密 瀏覽:230
華為鏈路聚合命令 瀏覽:423
apache自動運行php 瀏覽:516
485和單片機 瀏覽:974
xp修復系統命令 瀏覽:519
微你app怎麼加好友 瀏覽:795
程序員轉正 瀏覽:208
應用隱私加密忘記密碼怎麼辦 瀏覽:683
2g視頻怎麼壓縮 瀏覽:609
康佳電視伺服器異常怎麼解決 瀏覽:840
怎麼用c語言編譯簡單的小游戲 瀏覽:814
伺服器如何以域用戶登錄 瀏覽:602
安卓os14怎麼默認桌面 瀏覽:551
應用市場下載在哪個文件夾 瀏覽:897
安卓上的谷歌地圖怎麼用 瀏覽:183
安卓命令行打包 瀏覽:518
編程文字與數字教學視頻 瀏覽:818