天天看點

java jstack 分析工具_java記憶體分析工具jstack

記憶體溢出,CPU居高不下,死鎖,我們怎麼去分析呢,如果使用C或者C++,有gdb,java有嗎,當然,那就是jstack 下面我寫個死循環的例子,如下 JavaApplication1.java

public class JavaApplication1 {

public static void main(String[] args) throws Exception {

// TODO code application logic here

System.out.println("Programe begin");

User u = new User();

u.GetUser();

System.out.println("Programe end");

}

}

User.java

public class User {

public void GetUser() throws InterruptedException{

boolean isGetUser =false;

while(!isGetUser){

Thread.sleep(2000);

System.out.println("loop get user info");

}

}

很容易看到User中的GetUser是個死循環,當然我們開發實踐中産生死循環的場景要複雜的多。那麼我想定位到while代碼塊的位置怎麼辦呢?要是我們能看到jvm正在執行的堆棧是不是就迎刃而解了呢

jps #列印正在運作的java程式,第一列為pid,第二列程式名稱

32064 Main

33681 Jps

33614 JavaApplication1

jstack 33614 #列印目前程序的堆棧,很容易我們就發現了如下資訊

"main" #1 prio=5 os_prio=31 tid=0x00007fe0a7802800 nid=0x1c03 waiting on condition [0x000070000fc73000]

java.lang.Thread.State: TIMED_WAITING (sleeping)

at java.lang.Thread.sleep(Native Method)

at javaapplication1.User.GetUser(User.java:16)

at javaapplication1.JavaApplication1.main(JavaApplication1.java:22)