導航:首頁 > 編程語言 > java問題排查

java問題排查

發布時間:2022-09-03 21:04:52

『壹』 怎樣使用jstack診斷java應用程序故障

如果單靠通過查看代碼是很難去發現這個問題,在這一次故障排查中,我也學到了怎樣更好的使用jvm監控工具來進行診斷,主要用到了jstack和jmap命令,jmap上次已經講過就不再講了,下面就一個例子來講怎麼使用jstack來對的Java程序進行診斷。
首先讓我們來了解一下jstack這個命令的作用,jstack 是一個可以返回在應用程序上運行的各種各樣線程的一個完整轉儲的實用程序,您可以使用它查明問題。jstack [-l] <pid>,jpid可以通過使用jps命令來查看當前Java程序的jpid值,-l是可選參數,它可以顯示線程阻塞/死鎖情況。

/**
* 死鎖例子
* @author crane.ding
* @since 2011-3-20
*/
public class DeadLock {

public static void main(String[] args) {
final Object obj_1 = new Object(), obj_2 = new Object();

Thread t1 = new Thread("t1"){
@Override
public void run() {
synchronized (obj_1) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}

synchronized (obj_2) {
System.out.println("thread t1 done.");
}
}
}
};

Thread t2 = new Thread("t2"){
@Override
public void run() {
synchronized (obj_2) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}

synchronized (obj_1) {
System.out.println("thread t2 done.");
}
}
}
};

t1.start();
t2.start();
}

}

以上DeadLock類是一個死鎖的例子,假使在我們不知情的情況下,運行DeadLock後,發現等了N久都沒有在屏幕列印線程完成信息。這個時候我們就可以使用jps查看該程序的jpid值和使用jstack來生產堆棧結果問題。
$ java -cp deadlock.jar DeadLock &
$

$ jps
3076 Jps
448 DeadLock
$ jstack -l 448 > deadlock.jstack

結果文件deadlock.jstack內容如下:
2011-03-20 23:05:20
Full thread mp Java HotSpot(TM) Client VM (19.1-b02 mixed mode, sharing):

"DestroyJavaVM" prio=6 tid=0x00316800 nid=0x9fc waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"t2" prio=6 tid=0x02bcf000 nid=0xc70 waiting for monitor entry [0x02f6f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.demo.DeadLock$2.run(DeadLock.java:40)
- waiting to lock <0x22a297a8> (a java.lang.Object)
- locked <0x22a297b0> (a java.lang.Object)

Locked ownable synchronizers:
- None

"t1" prio=6 tid=0x02bce400 nid=0xba0 waiting for monitor entry [0x02f1f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.demo.DeadLock$1.run(DeadLock.java:25)
- waiting to lock <0x22a297b0> (a java.lang.Object)
- locked <0x22a297a8> (a java.lang.Object)

Locked ownable synchronizers:
- None

"Low Memory Detector" daemon prio=6 tid=0x02bb9400 nid=0xa6c runnable [0x00000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"CompilerThread0" daemon prio=10 tid=0x02bb2800 nid=0xcb8 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"Attach Listener" daemon prio=10 tid=0x02bb1000 nid=0x7f4 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"Signal Dispatcher" daemon prio=10 tid=0x02bd2800 nid=0xd80 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"Finalizer" daemon prio=8 tid=0x02bab000 nid=0xe1c in Object.wait() [0x02d3f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x229e1148> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
- locked <0x229e1148> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

Locked ownable synchronizers:
- None

"Reference Handler" daemon prio=10 tid=0x02ba6800 nid=0xbe0 in Object.wait() [0x02cef000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x229e1048> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:485)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <0x229e1048> (a java.lang.ref.Reference$Lock)

Locked ownable synchronizers:
- None

"VM Thread" prio=10 tid=0x02b6a400 nid=0x568 runnable

"VM Periodic Task Thread" prio=10 tid=0x02bc8400 nid=0x75c waiting on condition

JNI global references: 878

Found one Java-level deadlock:
=============================
"t2":
waiting to lock monitor 0x02baaeec (object 0x22a297a8, a java.lang.Object),
which is held by "t1"
"t1":
waiting to lock monitor 0x02baa2bc (object 0x22a297b0, a java.lang.Object),
which is held by "t2"

Java stack information for the threads listed above:
===================================================
"t2":
at com.demo.DeadLock$2.run(DeadLock.java:40)
- waiting to lock <0x22a297a8> (a java.lang.Object)
- locked <0x22a297b0> (a java.lang.Object)
"t1":
at com.demo.DeadLock$1.run(DeadLock.java:25)
- waiting to lock <0x22a297b0> (a java.lang.Object)
- locked <0x22a297a8> (a java.lang.Object)

Found 1 deadlock.

從這個結果文件我們一看到發現了一個死鎖,具體是線程t2在等待線程t1,而線程t1在等待線程t2造成的,同時也記錄了線程的堆棧和代碼行數,通過這個堆棧和行數我們就可以去檢查對應的代碼塊,從而發現問題和解決問題。

『貳』 java項目上線前程序沒問題,上線後出bug,怎麼排查錯誤

看tomcat下的日誌 會拋出異常

『叄』 Java程序報錯怎麼解決

一般是由於你的程序需要訪問的文件的許可權問題,查看訪問的文件的屬性,看看許可權,是不是為只讀許可權,然後修改許可權,設置為完全控制最好,然後再次運行程序就可以啦。

如果還是報錯拒絕訪問,可能就是由於那個文件所在的文件位置的訪問許可權問題,這個時候,只要把你所要訪問的那個文件移到D盤或者其他盤(C盤以外的其他盤都可以),然後再次運行程序,就可以啦。

『肆』 java瀏覽器卡頓白屏排查方法

先確保網路連接順暢。
先確保網路連接順暢,再檢查URL地址是否錯誤,打開控制台查看是否有報錯信息,查看介面訪問是否有請求,查看路由是否有path錯誤,導致載入了不存在的頁面,排除了網路問題以後如果還是白屏,那一般都是css和js載入造成的,css和js會造成阻塞渲染,比如不正確的引入css和js,就會導致它們的載入速度過長,從而導致白屏現象。

『伍』 java內存溢出的問題如何排查

java程序大家都知道,內存溢出是經常見的錯誤,下面從基本的開始分析!
內存溢出是由於沒被引用的對象(垃圾)過多造成JVM沒有及時回收,造成的內存溢出。如果出現這種現象可行代碼排查:
一)是否App中的類中和引用變數過多使用了Static修飾 如public staitc Student s;在類中的屬性中使用 static修飾的最好只用基本類型或字元串。如public static int i = 0; //public static String str;
二)是否App中使用了大量的遞歸或無限遞歸(遞歸中用到了大量的建新的對象)
三)是否App中使用了大量循環或死循環(循環中用到了大量的新建的對象)
四)檢查App中是否使用了向資料庫查詢所有記錄的方法。即一次性全部查詢的方法,如果數據量超過10萬多條了,就可能會造成內存溢出。所以在查詢時應採用「分頁查詢」。
五)檢查是否有數組,List,Map中存放的是對象的引用而不是對象,因為這些引用會讓對應的對象不能被釋放。會大量存儲在內存中。
六)檢查是否使用了「非字面量字元串進行+」的操作。因為String類的內容是不可變的,每次運行"+"就會產生新的對象,如果過多會造成新String對象過多,從而導致JVM沒有及時回收而出現內存溢出。
如String s1 = "My name";
String s2 = "is";
String s3 = "xuwei";
String str = s1 + s2 + s3 +.........;這是會容易造成內存溢出的
但是String str = "My name" + " is " + " xuwei" + " nice " + " to " + " meet you"; //但是這種就不會造成內存溢出。因為這是」字面量字元串「,在運行"+"時就會在編譯期間運行好。不會按照JVM來執行的。
在使用String,StringBuffer,StringBuilder時,如果是字面量字元串進行"+"時,應選用String性能更好;如果是String類進行"+"時,在不考慮線程安全時,應選用StringBuilder性能更好。
知道原因了,解決起來就非常簡單了。

『陸』 【java】初學者,寫了個鏈棧,報錯貌似是棧溢出,排查了幾遍找不到問題怎麼改,求大佬解答,謝謝!

不會調試,竟然能寫出這么多代碼?

『柒』 java出現這樣的錯誤

有時候是真的有問題(確實有錯不能運行),有時候是因為import後沒有刷新(沒錯但是不能運行),有時候單純是eclipse環境出錯(其實可以運行),以下是排查過程:
1、先build project,然後右鍵項目->maven->update project
pom還是有問題就到這個目錄,打開命令行,mvn clean->mvn eclipse:clean->mvn eclipse:eclipse 基本就可以啦
去項目的目錄下,按shirt加右鍵,打開powershell,輸入mvn clean 然後update project 就可以了。
2、直接在pom.xml文件中修改對應依賴的版本號,換一個存在的版本號就行。
比如mybatis的3.2.5報錯,可以換成3.2.8的
3、上面都解決不了
項目- >右鍵->buildpath->configure build path->java build path->libraries查看具體是哪個jar包報錯,這個報錯的jar包沒載入全,刪除這個jar包,到網上直接下載一個替換下,就ok了。
PS,你的情況,應該是第一種就解決了。
PS2,以上都是建立在你其他配置都正常的情況的,假如你連jdk都沒有配好(比如很多人裝好eclipse就導入項目,jre都沒有換成jdk,默認Runtime一直是jre,那當然導入啥都跑不起來)。

閱讀全文

與java問題排查相關的資料

熱點內容
衣服壓縮袋手泵原理 瀏覽:712
通達信編程書籍 瀏覽:979
車用壓縮天然氣瓶閥 瀏覽:969
鞋的程序員 瀏覽:259
車的壓縮比是什麼意思 瀏覽:200
網站源碼怎麼傳到文件夾 瀏覽:912
海南壓縮機在哪裡 瀏覽:491
電腦文件夾清晰的文件結構 瀏覽:839
如何把蘋果手機的app轉到安卓 瀏覽:305
java同步並發 瀏覽:249
fw壓縮圖片 瀏覽:258
淘寶申請源碼靠譜嗎 瀏覽:874
androidupdater 瀏覽:635
c2d游戲源碼大全可復製版 瀏覽:771
電腦怎樣重置網關命令 瀏覽:411
winftplinux 瀏覽:335
推特app界面如何設置成中文 瀏覽:452
太空工程師轉子編程屬性 瀏覽:32
windowscmd關機命令 瀏覽:342
雲桌面只要伺服器裝一套軟體 瀏覽:247