欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報激活碼778899分享:JVM之jstack命令解析

柚子快報激活碼778899分享:JVM之jstack命令解析

http://yzkb.51969.com/

?命令介紹:

??????? jstack全稱叫Java Stack Trace,Java的堆棧跟蹤工具,用于生成java虛擬機當前時刻的線程快照。功能主要有兩個,1.分析死鎖;2.分析CPU過高問題。

線程快照里留意下面幾種狀態(tài)

死鎖,Deadlock(重點關(guān)注)等待資源,Waiting on condition(重點關(guān)注)等待獲取管程,Waiting on monitor entry(重點關(guān)注) 阻塞,Blocked(重點關(guān)注) 執(zhí)行中,Runnable暫停,Suspended對象等待中,Object.wait() 或 TIMED_WAITING停止,Parked

Jstack 命令格式如下

jstack [ option ] pid 查看當前時間點,指定進程的dump堆棧信息。

jstack [ option ] pid > 文件 將當前時間點的指定進程的dump堆棧信息,寫入到指定文件中。# 注:若該文件不存在,則會自動生成; 若該文件存在,則會覆蓋源文件。

jstack [ option ] executable core 查看當前時間點,core文件的dump堆棧信息。

jstack [ option ] [server_id@] 查看當前時間點,遠程機器的dump堆棧信息。

option 參數(shù)如下:

-F 當正常輸出的請求不被響應(yīng)時,強制輸出線程堆棧 -m 打印java和native c/c++框架的所有棧信息??梢源蛴VM的堆棧,以及Native的棧幀,一般應(yīng)用排查不需要使用。 -l 除堆棧外,顯示關(guān)于鎖的附加信息,在發(fā)生死鎖時可以用jstack -l pid來觀察鎖持有情況

參數(shù)解釋:

executable: 產(chǎn)生core dump的java可執(zhí)行程序core: 將被打印信息的core dump文件remote-hostname-or-IP: 遠程debug服務(wù)的主機名或ipserver-id: 唯一id,假如一臺主機上多個遠程debug服務(wù)

以下用兩個實戰(zhàn)案例來分析這兩種情況:

實戰(zhàn)案例1:jstack分析死鎖

案例代碼

public class DeadLockTest {

private static Object lock1 = new Object();

private static Object lock2 = new Object();

public static void main(String[] args) {

new Thread(() -> {

synchronized (lock1) {

try {

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

Thread.sleep(6000);

} catch (InterruptedException e) {

}

synchronized (lock2) {

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

}

}

}).start();

new Thread(() -> {

synchronized (lock2) {

try {

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

Thread.sleep(6000);

} catch (InterruptedException e) {

}

synchronized (lock1) {

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

}

}

}).start();

System.out.println("main thread end");

}

}

排查命令

jstack 進程ID

jstack 進程ID| grep 'BLOCKED' -A 15 --color

結(jié)果分析:

??????? 通過結(jié)果可以看出Thread-3線程鎖住了0x00000000f6360238,然后在等待0x00000000f6360228,而Thread-2卻卻相反,從下面每個線程的第一行ThreadController.java:42可以看到死鎖的代碼在哪個地方,進而排查出問題所在。

"Thread-3":

at com.example.threaddemo.ThreadController.lambda$getThread$1(ThreadController.java:42)

- waiting to lock <0x00000000f6360228> (a java.lang.Object)

- locked <0x00000000f6360238> (a java.lang.Object)

at com.example.threaddemo.ThreadController$$Lambda$464/550716470.run(Unknown Source)

at java.lang.Thread.run(Thread.java:750)

"Thread-2":

at com.example.threaddemo.ThreadController.lambda$getThread$0(ThreadController.java:30)

- waiting to lock <0x00000000f6360238> (a java.lang.Object)

- locked <0x00000000f6360228> (a java.lang.Object)

at com.example.threaddemo.ThreadController$$Lambda$463/1326723928.run(Unknown Source)

at java.lang.Thread.run(Thread.java:750)

但用jstack分析死鎖的話,在調(diào)用鏈很長的情況下,也很難定位,這時可以用使用Arthas進行分析

thread -b

?可以準確知道: 死鎖在代碼的中的第幾行

實戰(zhàn)案例2:jstack分析CPU過高問題

?案例代碼

public class CpuMath{

public static final int initData = 666;

public static User user = new User();

public int compute() {

int a = 1;

int b = 2;

int c = (a + b) * 100;

return c;

}

public static void main(String[] args) {

CpuMath cpuMath= new CpuMath();

while (true){

cpuMath.compute();

}

}

}

排查命令流程

1. top

????????獲取各個進程的CPU和內(nèi)存情況,并且找到CPU飆高的進程ID,比如進程ID=10843

2. top -p 進程ID

??????? 顯示你的java進程的CPU和內(nèi)存占用情況

3. H

??????? 按H,可以獲取每個線程的CPU和內(nèi)存占用情況,如果線程ID=46915

4.? jstack 進程ID | grep -A 10? 十六進制的線程ID

??????? 通過上面的命令,可以得到線程的堆棧信息后10行信息,從堆棧中可以發(fā)現(xiàn)導(dǎo)致CPU飆高的調(diào)用方法。從打印的堆棧信息可以看出,導(dǎo)致CPU飚高的代碼在ThreadController類getThread方法的第21行

柚子快報激活碼778899分享:JVM之jstack命令解析

http://yzkb.51969.com/

精彩文章

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19344270.html

發(fā)布評論

您暫未設(shè)置收款碼

請在主題配置——文章設(shè)置里上傳

掃描二維碼手機訪問

文章目錄