Ⅰ 如何分析java Thread DUMP
一、Thread Dump介紹
1.1什麼是Thread Dump?
Thread Dump是非常有用的診斷Java應用問題的工具。每一個Java虛擬機都有及時生成所有線程在某一點狀態的thread-mp的能力,雖然各個 Java虛擬機列印的thread mp略有不同,但是大多都提供了當前活動線程的快照,及JVM中所有Java線程的堆棧跟蹤信息,堆棧信息一般包含完整的類名及所執行的方法,如果可能的話還有源代碼的行數。
1.2 Thread Dump特點
1. 能在各種操作系統下使用
2. 能在各種Java應用伺服器下使用
3. 可以在生產環境下使用而不影響系統的性能
4. 可以將問題直接定位到應用程序的代碼行上
1.3 Thread Dump 能診斷的問題
1. 查找內存泄露,常見的是程序里load大量的數據到緩存;
2. 發現死鎖線程;
1.4如何抓取Thread Dump
一般當伺服器掛起,崩潰或者性能底下時,就需要抓取伺服器的線程堆棧(Thread Dump)用於後續的分析. 在實際運行中,往往一次 mp的信息,還不足以確認問題。為了反映線程狀態的動態變化,需要接連多次做threadmp,每次間隔10-20s,建議至少產生三次 mp信息,如果每次 mp都指向同一個問題,我們才確定問題的典型性。
有很多方式可用於獲取ThreadDump, 下面列出一部分獲取方式:
操作系統命令獲取ThreadDump:
Windows:
1.轉向伺服器的標准輸出窗口並按下Control + Break組合鍵, 之後需要將線程堆棧復制到文件中;
UNIX/ Linux:
首先查找到伺服器的進程號(process id), 然後獲取線程堆棧.
1. ps –ef | grep java
2. kill -3 <pid>
注意:一定要謹慎, 一步不慎就可能讓伺服器進程被殺死。kill -9 命令會殺死進程。
JVM 自帶的工具獲取線程堆棧:
JDK自帶命令行工具獲取PID,再獲取ThreadDump:
1. jps 或 ps –ef|grepjava (獲取PID)
2. jstack [-l ]<pid> | tee -a jstack.log (獲取ThreadDump)
二、java線程的狀態轉換介紹(為後續分析做准備)
2.1 新建狀態(New)
用new語句創建的線程處於新建狀態,此時它和其他Java對象一樣,僅僅在堆區中被分配了內存。
2.2 就緒狀態(Runnable)
當一個線程對象創建後,其他線程調用它的start()方法,該線程就進入就緒狀態,Java虛擬機會為它創建方法調用棧和程序計數器。處於這個狀態的線程位於可運行池中,等待獲得CPU的使用權。
2.3 運行狀態(Running)
處於這個狀態的線程佔用CPU,執行程序代碼。只有處於就緒狀態的線程才有機會轉到運行狀態。
2.4 阻塞狀態(Blocked)
阻塞狀態是指線程因為某些原因放棄CPU,暫時停止運行。當線程處於阻塞狀態時,Java虛擬機不會給線程分配CPU。直到線程重新進入就緒狀態,它才有機會轉到運行狀態。
阻塞狀態可分為以下3種:
1)位於對象等待池中的阻塞狀態(Blocked in object』s wait pool):當線程處於運行狀態時,如果執行了某個對象的wait()方法,Java虛擬機就會把線程放到這個對象的等待池中,這涉及到「線程通信」的內容。
2)位於對象鎖池中的阻塞狀態(Blocked in object』s lock pool):當線程處於運行狀態時,試圖獲得某個對象的同步鎖時,如果該對象的同步鎖已經被其他線程佔用,Java虛擬機就會把這個線程放到這個對象的鎖池中,這涉及到「線程同步」的內容。
Ⅱ java怎麼獲取當前windows進程pid
Runtime.getRuntime()可以獲取java運行時的所有信息;java中有Process類,但是Process是用來處理子進程的。
Ⅲ java如何過去外設pidvid
java過去外設pidvid:VID和PID都是兩個位元組長,其中,供應商ID(VID)由供應商向USB執行論壇申請,每個供應商的VID是唯一的,PID由供應商自行決定,理論上來說,不同的產品、相同產品的不同型號、相同型號的不同設計的產品最好採用不同的PID。
根據USB規范的規定,所有的USB設備都有供應商ID(VID)和產品識別碼(PID),主機通過不同的VID和PID來區別不同的設備,VID和PID都是兩個位元組長。其中,供應商ID(VID)由供應商向USB執行論壇申請,每個供應商的VID是唯一的。
編程環境:
是一個編寫Java的Applet小程序和應用程序的程序開發環境。JDK是整個Java的核心,包括了Java運行環境(Java Runtime Environment),一些Java工具和Java的核心類庫(Java API)。不論什麼Java應用伺服器實質都是內置了某個版本的JDK。
主流的JDK是Sun公司發布的JDK,除了Sun之外,還有很多公司和組織都開發了自己的JDK,例如,IBM公司開發的JDK,BEA公司的Jrocket,還有GNU組織開發的JDK。
Ⅳ 通過bat啟動java程序,如何在console的標題欄輸出這個java進程的pid
進入cmd,輸入jvisualvm進入VisualVM工作台
Ⅳ java jconsole的pid是什麼
PID(Process ID)操作系統里指進程ID號,也就是進程標識符。操作系統里每打開一個程序都會創建一個進程ID,即PID。
PID(進程式控制制符)英文全稱為Process Identifier,它也屬於電工電子類技術術語。
PID是各進程的代號,每個進程有唯一的PID編號。它是進程運行時系統隨機分配的,並不代表專門的進程。在運行時PID是不會改變標識符的,但是你終止程序後再運行PID標識符就會被系統回收,就可能會被繼續分配給新運行的程序。
含義
只要運行一程序,系統會自動分配一個標識!
是暫時唯一:進程中止後,這個號碼就會被回收,並可能被分配給另一個新進程。
只要沒有成功運行其他程序,這個pid會繼續分配給當前要運行的程序!
如果成功運行一個程序,然後再運行別的程序時,系統會自動分配另一個pid!
PID值越小越好。
Ⅵ 如何獲取剛在java程序中啟動的進程的PID
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
class StreamDrainer implements Runnable {
private InputStream ins;
public StreamDrainer(InputStream ins) {
this.ins = ins;
}
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
ins));
String line = null;
while ((line = reader.readLine()) != null) {
//這判斷你的進程
if(line.indexOf("QQ.exe")!=-1){
System.out.println("有QQ");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class TestRunCmd {
public static void main(String[] args) {
String[] cmd = new String[] { "cmd.exe", "/C", "wmic process get name" };
try {
Process process = Runtime.getRuntime().exec(cmd);
new Thread(new StreamDrainer(process.getInputStream())).start();
new Thread(new StreamDrainer(process.getErrorStream())).start();
process.getOutputStream().close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
試試這樣,我用的線程來做,你改run方法裡面的進程名就好了
Ⅶ java中,通過Runtime.getRuntime().exec建立起的進程,如何獲得其PID
exec()方法返回一個Process對象,所以下面這樣是不是能滿足你的需求?
Process process = Runtime.getRuntime().exec(command)
process.destroy()
Ⅷ 總結:腳本中,如何查看正在運行的進程的pid
如果是找出java程序的進程PID,pidof就無能為力了,可以使用ps -ef|grep java或jps -l來查看java進程的信息。通常找出進程PID的目的是確認程序是否在運行、或者為了把它殺掉、或者發送一個信號給它。常用參數格式:pidof program
找出program程序的進程PID,如果有多個就會全部列出,program不能是shell腳本名稱。
格式:pidof -s program
找出program程序的進程PID,只列出一個。(Single shot - this instructs the program to only return one pid.)
格式:pidof -x script
找出shell腳本script的進程PID。
參數:-o omitpid
參數:-o omitpid1 -o omitpid2
在列出的進程PID中忽略omitpid。可以有多個。參數:-s只列出一個。
Ⅸ 如何用javaAPI取得java進程的PID
String name = ManagementFactory.getRuntimeMXBean().getName();
System.out.println(name);
// get pid
String pid = name.split("@")[0];
System.out.println("Pid is:" + pid);
Ⅹ java怎麼獲取已安裝的USB口驅動信息(包含信息:驅動名,pid,vid等)
這個可以通過JAVA 的JNI 去調用操作系統的API去獲取已安裝的USB介面驅動的問題.
至於java的JNI是怎樣工作的,以及其工作的原理可以參考下面這篇文章:
IT技術社區:http://www.itskillzone.com/forum.php?mod=viewthread&tid=47&extra=
JAVA基礎之理解JNI原理