新聞中心
在Linux系統(tǒng)中,dump堆棧信息是一項非常重要的任務,它可以幫助程序員和系統(tǒng)管理員快速了解程序的運行情況,尤其是當程序出現(xiàn)異?;蛘弑罎r,dump堆棧信息可以有效地幫助我們定位問題的根源。本文將介紹在Linux系統(tǒng)中如何dump堆棧信息。

什么是堆棧?
在計算機科學中,堆棧是一種特殊的數(shù)據結構,它是一個先進后出(LIFO)的數(shù)據結構,在堆棧中,最后進入的元素是首先被處理的。堆棧常常被用來實現(xiàn)函數(shù)調用的過程,每個函數(shù)調用都會在堆棧中分配一定的空間,當函數(shù)調用結束后,這些空間會被釋放。
當程序出現(xiàn)異?;蛘弑罎r,堆棧信息可以非常有用,因為它可以顯示程序在崩潰前的調用棧信息,從而幫助我們確定程序崩潰的原因及其在代碼中的位置。
如何dump堆棧信息?
在Linux系統(tǒng)中,dump堆棧信息可以通過多種方式實現(xiàn),下面我們將介紹幾種常見的方法。
方法一、使用gdb調試器
gdb是Linux下著名的調試器,可以用來調試C語言、C++、Python等多種編程語言的程序。在gdb中,使用“bt”命令即可查看程序的堆棧信息,具體操作步驟如下:
1. 使用gdb啟動程序:
“`
gdb your_program
“`
2. 在gdb中執(zhí)行“run”命令啟動程序:
“`
(gdb) run
“`
3. 等程序出現(xiàn)異常或者崩潰后,在gdb中執(zhí)行“bt”命令查看堆棧信息:
“`
(gdb) bt
“`
方法二、使用pstack工具
pstack是Linux下的一個工具,它可以顯示當前進程的堆棧信息。具體操作步驟如下:
1. 執(zhí)行以下命令查看程序的PID:
“`
ps aux | grep your_program
“`
其中your_program是指要查看的程序名稱。
2. 使用pstack工具查看PID對應的進程的堆棧信息:
“`
pstack PID
“`
其中PID是上一步查詢到的程序的PID。
方法三、使用jstack工具
jstack是Java jdk自帶的一種工具,它可以用來查看Java虛擬機進程的堆棧信息。常常用來查看Java進程是否出現(xiàn)死鎖、線程阻塞等問題。具體操作步驟如下:
1. 執(zhí)行以下命令查看程序的PID:
“`
ps aux | grep java | grep your_program
“`
其中your_program是指要查看的Java程序名稱。
2. 使用jstack工具查看PID對應的進程的堆棧信息:
“`
jstack PID
“`
其中PID是上一步查詢到的Java程序的PID。
無論是對于程序員還是系統(tǒng)管理員來說,dump堆棧信息是一項非常重要的任務。通過對堆棧信息的分析,我們可以了解程序的整個調用過程,確定程序崩潰的原因及其在代碼中的位置。在Linux系統(tǒng)中,我們可以使用gdb、pstack、jstack等工具來dump堆棧信息。這些工具的使用方法不同,但其實現(xiàn)的目的是相同的,即通過查看程序的堆棧信息來幫助我們快速解決問題。
相關問題拓展閱讀:
- Linux里面什么是dump線程?
- kill-3生成的線程堆棧怎么查看
- linux內核內存泄露檢測
Linux里面什么是dump線程?
線程dump是非常有用的診斷java應用問題的工具,每一個java虛早旅擬機都有及時生成顯示所有線程在某一點狀態(tài)的線程dump能力。雖然每個java虛擬機線程dump打印輸出格式上略微有散睜陵一些不同,但是線程dump的信息包含線程基本信息、線沖戚程的運行狀態(tài)、標識、調用的堆棧;調用的堆棧包含完整的類名,所執(zhí)行的方法,如果可能的話還有源代碼的行數(shù)。
kill-3生成的線程堆棧怎么查看
之一步:在終端運行Java程序
第二步:通過命令 pidof java 找到已經啟動的java進程的ID,選擇需要查看的java程序的進程ID
第三步:使用命令 kill -3 打印出java程序的線程堆棧信息
第四步:通常情況下運行的項目可和賣迅能會比較大,那么這個時候打印的堆棧信息可能會有幾千到幾萬行,為了方便查看,我們往往需要將輸出內容進行重定向
使用linux下的重定向命令方式即可:例如: demo.sh > run.log 2>&1 將輸出信息重定向到 run.log中。
注:在操作系統(tǒng)中,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 dump Java HotSpot(TM) 64-Bit Server VM (24.79-b02 mixed mode):
“Service Thread” daemon prio=10 tid=0x00007fdc880a9000 nid=0x12a4 runnable
java.lang.Thread.State: RUNNABLE
“C2 CompilerThread1” daemon prio=10 tid=0x00007fdc880a7000 nid=0x12a3 waiting on condition
java.lang.Thread.State: RUNNABLE
“C2 CompilerThread0” daemon prio=10 tid=0x00007fdc880a4000 nid=0x12a2 waiting on condition
java.lang.Thread.State: RUNNABLE
“JDWP Command Reader” daemon prio=10 tid=0x00007fdcnid=0x1299 runnable
java.lang.Thread.State: RUNNABLE
“JDWP Event Helper Thread” daemon prio=10 tid=0x00007fdc880a1800 nid=0x1298 runnable
java.lang.Thread.State: RUNNABLE
“JDWP Transport Listener: dt_socket” daemon prio=10 tid=0x00007fdc8809e000 nid=0x1297 runnable
java.lang.Thread.State: RUNNABLE
“Signal Dispatcher” daemon prio=10 tid=0x00007fdcnid=0x1296 waiting on condition
java.lang.Thread.State: RUNNABLE
“Finalizer” daemon prio=10 tid=0x00007fdcnid=0x1295 in Object.wait()
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
– waiting on (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
– locked (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()
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
– waiting on (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 (a java.lang.ref.Reference$Lock)
“main” prio=10 tid=0x00007fdc8800b800 nid=0x128e runnable
java.lang.Thread.State: RUNNABLE
at com.wenchain.study.PrintThreadTrace.func2(PrintThreadTrace.java:20)
– locked (a java.lang.Object)
at com.wenchain.study.PrintThreadTrace.func1(PrintThreadTrace.java:13)
– locked (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=0x00007fdcnid=0x128f runnable
“GC task thread#1 (ParallelGC)” prio=10 tid=0x00007fdcnid=0x1290 runnable
“GC task thread#2 (ParallelGC)” prio=10 tid=0x00007fdcnid=0x1291 runnable
“GC task thread#3 (ParallelGC)” prio=10 tid=0x00007fdcnid=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
eden space 15872K, 8% used
from space 2023K, 0% used
to space 2023K, 0% used
ParOldGentotal 39424K, used 0K
object space 39424K, 0% used
PSPermGentotal 21504K, used 2619K
object space 21504K, 12% used
上面的信息中包含了當前JVM中所有運行的線程信息,其中在示例中我們啟動的線程為main線程,其余的都是JVM自己創(chuàng)建的。
在打印的信息中,我們可以清楚的看見當前線程的調用上下文,可以很清楚的知道程序的運行情況。
并且我們在最后面還能看見當前虛擬機中的內存使用情況,青年世代,老年世代的信息等等…
PS: 在JDK1.5以上,我們可以通過在Java程序中調用Thread.getStackTrace()方法來進行堆棧的自動打印,使得線程堆棧的打印時機可編程控制。
文章知識點與官方知識檔案匹配
Java技能樹首頁概覽
89841 人正在系統(tǒng)學習中
點擊閱讀全文
打開CSDN,閱讀體驗更佳
jstack-查看Java進程的線程堆棧信息,鎖定高消耗資源代碼
jstack主要用來查看某個Java進程內的線程堆棧信息。語法格式如下: jstackpid jstackexecutable core jstackremote-hostname-or-ip 命令行參數(shù)選項說明如下: …
011Java并發(fā)包018查看線程堆棧信息_執(zhí)筆未來的博客
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) java.util.concurre…
最新發(fā)布 jstack — java堆棧常用排查指令
jstack — java堆棧常用排查指令
繼續(xù)訪問
熱門推薦 jstack 命令查看JAVA線程堆棧
JAVA堆棧信息實際生產中,可能由于開發(fā)以及測試未能全面覆蓋的代碼質量、性能問題,而引致線程掛起甚至崩潰??赡芫托枰榭炊褩P畔砼挪閱栴}了。jps -lvmjps -lvm 用于查看當前機器上運行的java進程。C:\Users\Administrator>jps -lvmDosgi.requiredJavaVersion=1.8 -Dosgi.instance.area.defa
繼續(xù)訪問
Java多線程——查看線程堆棧信息
Java多線程——查看線程堆棧信息 摘要:本文主要介紹了查看線程堆棧信息的方法。 使用Thread類的getAllStackTraces()方法 方法定義 可以看到getAllStackTraces()方法的返回值是一個Map對象,key是Thread的實例,value是一個StackTraceElement實例數(shù)組: 1 public static Map的線程CPU類似 1、支持一鍵展示當前最忙的前N個線程并打印堆棧 thread -n 3 沒有線程ID,包含表示為JVM內部線程,參考dashboard命令的介紹。 cpuUsage為采樣間隔時間內線程的CPU使用率,與dashboard命令的數(shù)據一致。 deltaTime為采樣間隔時間內線程的增量CPU時間,小于1ms時被取整顯示為0ms。 time線程運行總CPU…
繼續(xù)訪問
java查看線程的堆棧信息
通過使用jps 命令獲取需要監(jiān)控的進程的pid,然后使用jstackpid 命令查看線程的堆棧信息。 通過jstack命令可以獲取當前進程的所有線程信息。 每個線程堆中信息中,都可以查看到線程ID、線程的狀態(tài)(wait、sleep、running 等狀態(tài))、是否持有鎖信息等。 jstack -l >jvm_listlocks.txt 轉…
繼續(xù)訪問
java 查看線程堆棧信息_Java多線程——查看線程堆棧信息
java多線程——查看線程堆棧信息摘要:本文主要介紹了查看線程堆棧信息的方法。使用thread類的getallstacktraces()方法方法定義可以看到getallstacktraces()方法的返回值是一個map對象,key是thread的實例,value是一個stacktraceelement實例數(shù)組:1 public static map getallstacktraces()使用可以使…
繼續(xù)訪問
java線程堆棧信息分析
java堆棧信息分析
繼續(xù)訪問
java 查看堆棧_javap 命令查看堆棧中信息
javap命令是對.java文件進行反編譯,通過這個命令可以看到堆棧中是怎么壓棧和出棧的已經執(zhí)行順序,這里簡單解釋下javap的簡單的使用,下面舉個例子:題目:i++ 和++i的區(qū)別解釋:簡單點說 這個問題都不難回答,這里就不說了,但是實際上堆棧中區(qū)別也是老大了(這里就用到了javap命令), 步驟:1.在任意一個盤下面建一個名為Test.java的文件(文件名可以隨意命名)代碼如下:public…
繼續(xù)訪問
java 查看線程堆棧信息_jstack-查看Java進程的線程堆棧信息,鎖定高消耗資源代碼?!?/p>
jstack主要用來查看某個Java進程內的線程堆棧信息。語法格式如下:jstackpidjstackexecutablecorejstackremote-hostname-or-ip命令行參數(shù)選項說明如下:-llonglistings,會打印出額外的鎖信息,在發(fā)生死鎖時可以用jstack-lpid來觀察…
繼續(xù)訪問
java堆棧信息怎么看_線程堆棧信息怎么看? – cs_person的個人空間 – OSCHINA – 中文開源技術交流社區(qū)…
一條線程堆棧信息大概長成下面這個樣子:RMI TCP Connection(267865)-172.16.5.25″ daemon prio=10 tid=0x00007fdnid=0x55ae waiting for monitor entry java.lang.Thread.State: BLOCKED (on object m…
繼續(xù)訪問
線程堆棧信息怎么看?
一條線程堆棧信息大概長成下面這個樣子: RMI TCP Connection(267865)-172.16.5.25″ daemon prio=10 tid=0x00007fdnid=0x55ae waiting for monitor entry
繼續(xù)訪問
java的棧和堆
棧與堆都是Java用來在Ram中存放數(shù)據的地方。與C++不同,Java自動管理棧和堆,程序員不能直接地設置棧或堆。 Java 的堆是一個運行時數(shù)據區(qū),類的(對象從中分配空間。這些對象通過new、newarray、anewarray和multianewarray等指令建立,它們不需要程序代碼來顯式的釋放。堆是由垃圾回收來負責的,堆的優(yōu)勢是可以動態(tài)地分配內存大小,生存期也不必事先告訴編譯器,因為它是在…
繼續(xù)訪問
查看java線程_【JAVA】Java線程堆棧信息查看
如何獲得線程的堆棧信息?線上服務器cpu 100%了,該如何排查問題?1.top命令查詢哪個pid進程占用cpu高(ps -ef|grep java 獲取PID號)2.通過 top -Hp pid 可以查看該進程下各個線程的cpu使用情況,獲取占用cpu高的線程id3.執(zhí)行命令:printf “%X\n” 線程tid(用于獲取占用cpu高的線程id的16進制數(shù))4.執(zhí)行命令:jstack pid …
繼續(xù)訪問
kill -3 java_kill -3 PID命令獲取java應用堆棧信息
一、應用場景:當linux服務器出現(xiàn)異常情況(響應緩慢,負載持續(xù)飆升)并且服務器沒有安裝對應的包而無法使用jstack等命令時,可以使用linux的kill相關命令打印堆棧信息。命令格式:kill -3 PID二、執(zhí)行步驟:2.1、獲取java進程的PIDps -ef|grep java結果的第二列數(shù)字就是進程對應的pid。2.2、kill -3 PID(1)如果項目通過Tomcat進行發(fā)布(普通…
繼續(xù)訪問
jstack 工具 查看JVM堆棧信息
1|0介紹 jstack是java虛擬機自帶的一種堆棧跟蹤工具。jstack用于打印出給定的java進程ID或corefile或遠程調試服務的Java堆棧信息,如果是在64位機器上,需要指定選項”-J-d64″,Windows的jstack使用方式只支持以下的這種方式: jstack pid 主要分為兩個功能: a. 針對活著的進程做本地的或遠程的線程dump; b. 針對core文件做線程dump。 jstack用于生成java虛擬機當前時刻的線程快照。線程快照是…
繼續(xù)訪問
linux查看java堆棧
1、查看JAVA進程JVM參數(shù) jinfo -flags pid(進程號) -XX:CICompilerCount=2 更大的并行編譯數(shù) -XX:InitialHeapSize=JVM 的初始堆內存大小 -XX:MaxHeapSize=JVM 的更大堆內存大小 -XX:MaxNewSize=XX:MinHeapDeltaBytes=XX:NewSize=XX:OldSize=、JVM 查看.
繼續(xù)訪問
Linux 如何查看一個進程的堆棧
有兩種方法:之一種:pstack 進程ID第二種,使用gdb 然后attach 進程ID,然后再使用命令 thread apply all bt 兩種方法都可以列出進程所有的線程的當前的調用棧。不過,使用gdb的方法,還可以查看某些信息,例如局部變量,指針等。不過,如果只看調用棧的話,pstack還是很方便的。
繼續(xù)訪問
JAVA獲取堆棧信息
1. 通過Throwable獲取 StackTraceElement stackTrace = new Throwable().getStackTrace(); 2. 通過Thread獲取 StackTraceElement stackTrace = Thread.currentThread().getStackTrace();
繼續(xù)訪問
java 查看線程棧大小_基于 Java 線程棧的問題排查
linux內核內存泄露檢測
經常碰到系統(tǒng)跑著跑著一段時間內存滿了,出現(xiàn)內存泄漏的問題,系統(tǒng)軟件太龐大,這類問題又不好直接從源碼中分析,所以需要借助工具來分析了,kmemleak就是這樣的一個工具。
在Kernel hacking中打開CONFIG_DEBUG_KMEMLEAK =y即使能了kmemleak,其實就是開了一個內核線程,該內核線程每10分鐘(默認值)掃描內存,并打印發(fā)現(xiàn)派耐新的未引用的對象的數(shù)量。kmemleak的原理其實就是通過kmalloc、vmalloc、kmem_cache_alloc等內存的分配,跟蹤其指針,連同其他的分配大小和堆棧跟蹤信息,存儲在PRIO搜索樹。如果存在相應的釋放函數(shù)調用跟蹤和指針,就會從kmemleak數(shù)據結構中移除塵毀春。下面我們看看具體的用法。
查看內核打印信息詳細過程如下:
1、掛載debugfs文件系統(tǒng)
mount -t debugfs nodev /sys/kernel/debug/
2、開啟內核自動檢測線程
echo scan > /sys/kernel/debug/kmemleak
3、查看打印信息
cat /sys/kernel/debug/kmemleak
4、清除內核檢測報告,新的內存泄露報告將重新寫入/sys/kernel/debug/kmemleak
echo clear > /sys/kernel/debug/kmemleak
內存掃描參數(shù)可以進行修改通過向/sys/kernel/debug/kmemleak 文件寫入。 參數(shù)使用如下:
off 禁用kmemleak(不可逆)
stack=on 啟用任務堆棧掃描(default)
stack=off 禁用任務堆棧掃描
scan=on 啟動自動記憶掃描線程(default)
scan=off 停止自動記憶掃描線程
scan= 設置n秒內自動記憶掃描,默認600s
scan 開啟內核掃描
clear 清除內存泄露報告
dump= 轉存信息對象在
通過“kmemleak = off”,也可以在啟動時禁用Kmemleak在內核命令行。在初始化kmemleak之前,內存的分配或釋放這些動作被存儲在余弊一個前期日志緩沖區(qū)。這個緩沖區(qū)的大小通過配CONFIG_DEBUG_KMEMLEAK_EAR_LOG_SIZE設置。
關于linux dump堆棧信息的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。
香港服務器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網服務提供商,擁有超過10年的服務器租用、服務器托管、云服務器、虛擬主機、網站系統(tǒng)開發(fā)經驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務器、香港云服務器、免備案服務器等。
網頁標題:Linux如何dump堆棧信息?(linuxdump堆棧信息)
網站地址:http://fisionsoft.com.cn/article/dpegohd.html


咨詢
建站咨詢
