第一步:在終端運(yùn)行Java程序
創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供石門網(wǎng)站建設(shè)、石門做網(wǎng)站、石門網(wǎng)站設(shè)計(jì)、石門網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、石門企業(yè)網(wǎng)站模板建站服務(wù),十年石門做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
第二步:通過命令 pidof java 找到已經(jīng)啟動的java進(jìn)程的ID,選擇需要查看的java程序的進(jìn)程ID
第三步:使用命令 kill -3 java進(jìn)行的 pid 打印出java程序的線程堆棧信息
第四步:通常情況下運(yùn)行的項(xiàng)目可能會比較大,那么這個時候打印的堆棧信息可能會有幾千到幾萬行,為了方便查看,我們往往需要將輸出內(nèi)容進(jìn)行重定向
使用linux下的重定向命令方式即可:例如: demo.sh run.log 21 將輸出信息重定向到 run.log中。
注:在操作系統(tǒng)中,0 1 2分別對應(yīng)著不同的含義, 如下:
0 : 標(biāo)準(zhǔn)輸入,即:C中的stdin , java中的System.in
1 : 標(biāo)準(zhǔn)輸出, 即: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 [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)
----------------------------------------------------------------------------------------------------------------------------
上面的信息中包含了當(dāng)前JVM中所有運(yùn)行的線程信息,其中在示例中我們啟動的線程為main線程,其余的都是JVM自己創(chuàng)建的。
在打印的信息中,我們可以清楚的看見當(dāng)前線程的調(diào)用上下文,可以很清楚的知道程序的運(yùn)行情況。
并且我們在最后面還能看見當(dāng)前虛擬機(jī)中的內(nèi)存使用情況,青年世代,老年世代的信息等等...
PS: 在JDK1.5以上,我們可以通過在Java程序中調(diào)用Thread.getStackTrace()方法來進(jìn)行堆棧的自動打印,使得線程堆棧的打印時機(jī)可編程控制。
文章知識點(diǎn)與官方知識檔案匹配
Java技能樹首頁概覽
89841 人正在系統(tǒng)學(xué)習(xí)中
點(diǎn)擊閱讀全文
打開CSDN,閱讀體驗(yàn)更佳
jstack-查看Java進(jìn)程的線程堆棧信息,鎖定高消耗資源代碼
jstack主要用來查看某個Java進(jìn)程內(nèi)的線程堆棧信息。語法格式如下: jstack[option]pid jstack[option]executable core jstack[option][server-id@]remote-hostname-or-ip 命令行參數(shù)選項(xiàng)說明如下: ...
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堆棧信息實(shí)際生產(chǎn)中,可能由于開發(fā)以及測試未能全面覆蓋的代碼質(zhì)量、性能問題,而引致線程掛起甚至崩潰??赡芫托枰榭炊褩P畔砼挪閱栴}了。jps -lvmjps -lvm 用于查看當(dāng)前機(jī)器上運(yùn)行的java進(jìn)程。C:\Users\Administratorjps -lvm 7348 -Dosgi.requiredJavaVersion=1.8 -Dosgi.instance.area.defa
繼續(xù)訪問
Java多線程——查看線程堆棧信息
Java多線程——查看線程堆棧信息 摘要:本文主要介紹了查看線程堆棧信息的方法。 使用Thread類的getAllStackTraces()方法 方法定義 可以看到getAllStackTraces()方法的返回值是一個Map對象,key是Thread的實(shí)例,value是一個StackTraceElement實(shí)例數(shù)組: 1 public static MapThread, S...
繼續(xù)訪問
java堆棧常用排查指令
java 異常排查四板斧 1、查看java 堆棧線程信息 說明 jstack命令打印指定Java進(jìn)程、核心文件或遠(yuǎn)程調(diào)試服務(wù)器的Java線程的Java堆棧跟蹤信息。 對于每個Java框架,完整的類名,方法名, 字節(jié)碼索引(BCI)和行號(如果有的話)被打印出來。 使用-m選項(xiàng),jstack命令打印程序中所有線程的Java和本機(jī)幀 計(jì)數(shù)器(PC)。 對于每個本機(jī)幀,當(dāng)可用時,將打印離PC最近的本機(jī)符號。 c++亂碼的名字不會被修改。 要demangle c++名稱,輸出這個 命令可以管道到c++filt。 當(dāng)
繼續(xù)訪問
java診斷工具-Arthas(thread命令)查看當(dāng)前線程堆棧
cpu使用率與linux 命令top -H -p pid的線程CPU類似 1、支持一鍵展示當(dāng)前最忙的前N個線程并打印堆棧 thread -n 3 沒有線程ID,包含[Internal]表示為JVM內(nèi)部線程,參考dashboard命令的介紹。 cpuUsage為采樣間隔時間內(nèi)線程的CPU使用率,與dashboard命令的數(shù)據(jù)一致。 deltaTime為采樣間隔時間內(nèi)線程的增量CPU時間,小于1ms時被取整顯示為0ms。 time線程運(yùn)行總CPU...
繼續(xù)訪問
java查看線程的堆棧信息
通過使用jps 命令獲取需要監(jiān)控的進(jìn)程的pid,然后使用jstackpid 命令查看線程的堆棧信息。 通過jstack命令可以獲取當(dāng)前進(jìn)程的所有線程信息。 每個線程堆中信息中,都可以查看到線程ID、線程的狀態(tài)(wait、sleep、running 等狀態(tài))、是否持有鎖信息等。 jstack -l pid jvm_listlocks.txt 轉(zhuǎn)...
繼續(xù)訪問
java 查看線程堆棧信息_Java多線程——查看線程堆棧信息
java多線程——查看線程堆棧信息摘要:本文主要介紹了查看線程堆棧信息的方法。使用thread類的getallstacktraces()方法方法定義可以看到getallstacktraces()方法的返回值是一個map對象,key是thread的實(shí)例,value是一個stacktraceelement實(shí)例數(shù)組:1 public static map getallstacktraces()使用可以使...
繼續(xù)訪問
java線程堆棧信息分析
java堆棧信息分析
繼續(xù)訪問
java 查看堆棧_javap 命令查看堆棧中信息
javap命令是對.java文件進(jìn)行反編譯,通過這個命令可以看到堆棧中是怎么壓棧和出棧的已經(jīng)執(zhí)行順序,這里簡單解釋下javap的簡單的使用,下面舉個例子:題目:i++ 和++i的區(qū)別解釋:簡單點(diǎn)說 這個問題都不難回答,這里就不說了,但是實(shí)際上堆棧中區(qū)別也是老大了(這里就用到了javap命令), 步驟:1.在任意一個盤下面建一個名為Test.java的文件(文件名可以隨意命名)代碼如下:public...
繼續(xù)訪問
java 查看線程堆棧信息_jstack-查看Java進(jìn)程的線程堆棧信息,鎖定高消耗資源代碼。...
jstack主要用來查看某個Java進(jìn)程內(nèi)的線程堆棧信息。語法格式如下:jstack[option]pidjstack[option]executablecorejstack[option][server-id@]remote-hostname-or-ip命令行參數(shù)選項(xiàng)說明如下:-llonglistings,會打印出額外的鎖信息,在發(fā)生死鎖時可以用jstack-lpid來觀察...
繼續(xù)訪問
java堆棧信息怎么看_線程堆棧信息怎么看? - cs_person的個人空間 - OSCHINA - 中文開源技術(shù)交流社區(qū)...
一條線程堆棧信息大概長成下面這個樣子: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...
繼續(xù)訪問
線程堆棧信息怎么看?
一條線程堆棧信息大概長成下面這個樣子: RMI TCP Connection(267865)-172.16.5.25" daemon prio=10 tid=0x00007fd508371000 nid=0x55ae waiting for monitor entry [0x00007fd...
繼續(xù)訪問
java的棧和堆
棧與堆都是Java用來在Ram中存放數(shù)據(jù)的地方。與C++不同,Java自動管理?xiàng):投?,程序員不能直接地設(shè)置棧或堆。 Java 的堆是一個運(yùn)行時數(shù)據(jù)區(qū),類的(對象從中分配空間。這些對象通過new、newarray、anewarray和multianewarray等指令建立,它們不需要程序代碼來顯式的釋放。堆是由垃圾回收來負(fù)責(zé)的,堆的優(yōu)勢是可以動態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,因?yàn)樗窃?..
繼續(xù)訪問
查看java線程_【JAVA】Java線程堆棧信息查看
如何獲得線程的堆棧信息?線上服務(wù)器cpu 100%了,該如何排查問題?1.top命令查詢哪個pid進(jìn)程占用cpu高(ps -ef|grep java 獲取PID號)2.通過 top -Hp pid 可以查看該進(jìn)程下各個線程的cpu使用情況,獲取占用cpu高的線程id3.執(zhí)行命令:printf "%X\n" 線程tid(用于獲取占用cpu高的線程id的16進(jìn)制數(shù))4.執(zhí)行命令:jstack pid ...
繼續(xù)訪問
kill -3 java_kill -3 PID命令獲取java應(yīng)用堆棧信息
一、應(yīng)用場景:當(dāng)linux服務(wù)器出現(xiàn)異常情況(響應(yīng)緩慢,負(fù)載持續(xù)飆升)并且服務(wù)器沒有安裝對應(yīng)的包而無法使用jstack等命令時,可以使用linux的kill相關(guān)命令打印堆棧信息。命令格式:kill -3 PID二、執(zhí)行步驟:2.1、獲取java進(jìn)程的PIDps -ef|grep java結(jié)果的第二列數(shù)字就是進(jìn)程對應(yīng)的pid。2.2、kill -3 PID(1)如果項(xiàng)目通過Tomcat進(jìn)行發(fā)布(普通...
繼續(xù)訪問
jstack 工具 查看JVM堆棧信息
1|0介紹 jstack是java虛擬機(jī)自帶的一種堆棧跟蹤工具。jstack用于打印出給定的java進(jìn)程ID或corefile或遠(yuǎn)程調(diào)試服務(wù)的Java堆棧信息,如果是在64位機(jī)器上,需要指定選項(xiàng)"-J-d64",Windows的jstack使用方式只支持以下的這種方式: jstack [-l] pid 主要分為兩個功能: a. 針對活著的進(jìn)程做本地的或遠(yuǎn)程的線程dump; b. 針對core文件做線程dump。 jstack用于生成java虛擬機(jī)當(dāng)前時刻的線程快照。線程快照是...
繼續(xù)訪問
linux查看java堆棧
1、查看JAVA進(jìn)程JVM參數(shù) jinfo -flags pid(進(jìn)程號) -XX:CICompilerCount=2 最大的并行編譯數(shù) -XX:InitialHeapSize=16777216 JVM 的初始堆內(nèi)存大小 -XX:MaxHeapSize=257949696 JVM 的最大堆內(nèi)存大小 -XX:MaxNewSize=85983232 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=5570560 -XX:OldSize=11206656 2、JVM 查看.
繼續(xù)訪問
Linux 如何查看一個進(jìn)程的堆棧
有兩種方法:第一種:pstack 進(jìn)程ID第二種,使用gdb 然后attach 進(jìn)程ID,然后再使用命令 thread apply all bt 兩種方法都可以列出進(jìn)程所有的線程的當(dāng)前的調(diào)用棧。不過,使用gdb的方法,還可以查看某些信息,例如局部變量,指針等。不過,如果只看調(diào)用棧的話,pstack還是很方便的。
繼續(xù)訪問
JAVA獲取堆棧信息
1. 通過Throwable獲取 StackTraceElement[] stackTrace = new Throwable().getStackTrace(); 2. 通過Thread獲取 StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
繼續(xù)訪問
java 查看線程棧大小_基于 Java 線程棧的問題排查
除日志外,還有沒有別的方式跟蹤線上服務(wù)問題呢?或者,跟蹤并排除日志里無法發(fā)現(xiàn)的問題?方法當(dāng)然是有的,就是通過現(xiàn)場快照定位并發(fā)現(xiàn)問題。我們所說的現(xiàn)場,主要指這兩方面:Java 線程棧。線程棧是Java線程工作的快照,可以獲得當(dāng)前線程在做什么;Java 內(nèi)存堆。堆是JVM的內(nèi)存快照,可以獲取內(nèi)存分配相關(guān)信息。
打印堆棧是調(diào)試的常用方法,一般在系統(tǒng)異常時,我們可以將異常情況下的堆棧打印出來,這樣十分方便錯誤查找。實(shí)際上還有另外一個非常有用的功能:分析代碼的行為。android代碼太過龐大復(fù)雜了,完全的靜態(tài)分析經(jīng)常是無從下手,因此通過打印堆棧的動態(tài)分析也十分必要。
Android打印堆棧的方法,簡單歸類一下
1. zygote的堆棧dump
實(shí)際上這個可以同時dump java線程及native線程的堆棧,對于java線程,java堆棧和native堆棧都可以得到。
使用方法很簡單,直接在adb shell或串口中輸入:
[plain] view plaincopy
kill -3 pid
輸出的trace會保存在 /data/anr/traces.txt文件中。這個需要注意,如果沒有 /data/anr/這個目錄或/data/anr/traces.txt這個文件,需要手工創(chuàng)建一下,并設(shè)置好讀寫權(quán)限。
如果需要在代碼中,更容易控制堆棧的輸出時機(jī),可以用以下命令獲取zygote的core dump:
[java] view plaincopy
Process.sendSignal(pid, Process.SIGNAL_QUIT);
原理和命令行是一樣的。
不過需要注意兩點(diǎn):
adb shell可能會沒有權(quán)限,需要root。
android 4.2中關(guān)閉了native thread的堆棧打印,詳見 dalvik/vm/Thread.cpp的dumpNativeThread方法:
[cpp] view plaincopy
dvmPrintDebugMessage(target,
"\"%s\" sysTid=%d nice=%d sched=%d/%d cgrp=%s\n",
name, tid, getpriority(PRIO_PROCESS, tid),
schedStats.policy, schedStats.priority, schedStats.group);
dumpSchedStat(target, tid);
// Temporarily disabled collecting native stacks from non-Dalvik
// threads because sometimes they misbehave.
//dvmDumpNativeStack(target, tid);
Native堆棧的打印被關(guān)掉了!不過對于大多數(shù)情況,可以直接將這個注釋打開。
不是打印到堆棧,而是打印棧信息,因?yàn)槌绦驁?zhí)行的時候,最終還是要靠01二進(jìn)制代碼執(zhí)行,運(yùn)行在堆棧里面,所以出錯或拋出異常時能被捕獲到
SLF4J 1.6.0 以前的版本,如果打印異常堆棧信息,必須用
log.error(Stringmsg,Throwablet)
log.info等對應(yīng)方法.
如果msg含有變量,一般用String.format方法格式化msg.
如果用
error(Stringformat,Object...arguments)
等其它方法,異常堆棧信息會丟失.
幸好,SLF4J 1.6.0以后的版本對這個不友好的異常信息log 改進(jìn)了.
error(Stringformat,Object…arguments) 這個方法也會打印異常堆棧信息,只不過規(guī)定throwable對象必須為
最后一個參數(shù).如果不遵守這個規(guī)定,異常堆棧信息不會log出來.