診斷java(診斷學)

本文目錄一覽:

java內存診斷軟體?

對於每一個java進程來說都有自己的內存池和使用空間,而這也就意味著會出現內存使用錯誤等問題,而這時候我們就需要對java內存進行診斷分析,今天雲南java培訓就一起來了就一下,在進行內存診斷上都有哪些軟體可以使用。

Java堆:分析診斷數據

堆轉儲分析

堆轉儲可以使用如下的工具進行分析:

EclipseMAT(內存分析工具,MemoryAnalyzerTool)是一個社區開發的分析堆轉儲的工具。它提供了一些很棒的特性,包括:

可疑的泄漏點:它能探測堆轉儲中可疑的泄露點,報告持續佔有大量內存的對象;

直方圖:列出每個類的對象數量、淺大小(shallow)以及這些對象所持有的堆。直方圖中的對象可以很容易地使用正則表達式進行排序和過濾。這樣有助於放大並集中我們懷疑存在泄露的對象。它還能夠對比兩個堆轉儲的直方圖,展示每個類在實例數量方面的差異。這樣能夠幫助我們查找Java堆中增長快的對象,並進一步探查確定在堆中持有這些對象的根;

不可達的對象:MAT有一個非常棒的功能,那就是它允許在它的工作集對象中包含或排除不可達/死對象。如果你不想查看不可達的對象,也就是那些會在下一次GC周期中收集掉的對象,只關心可達的對象,那麼這個特性是非常便利的;

重複的類:展現由多個類載入器所載入的重複的類;

到GC根的路徑:能夠展示到GC根(JVM本身保持存活的對象)的引用鏈,這些GC根負責持有堆中的對象;

OQL:我們可以使用對象查詢語言(ObjectQueryLanguage)來探查堆轉儲中的對象。它豐富了OQL的基礎設施,能夠編寫複雜的查詢,幫助我們深入了解轉儲的內部。

JavaVisualVM:監控、分析和排查Java語言的一站式工具。它可以作為JDK工具的一部分來使用,也可以從GitHub上下載。它所提供的特性之一就是堆轉儲分析。它能夠為正在監控的應用創建堆轉儲,也可以載入和解析它們。從堆轉儲中,它可以展現類的直方圖、類的實例,也能查找特定實例的GC根;

jhat命令工具(在/bin文件夾中)提供了堆轉儲分析的功能,它能夠在任意的瀏覽器中展現堆轉儲中的對象。默認情況下,Web伺服器會在7000埠啟動。jhat支持範圍廣泛的預定義查詢和對象查詢語言,以便於探查堆轉儲中的對象;

Java任務控制(JavaMissionControl)的JOverflow插件:這是一個實驗性的插件,能夠讓Java任務控制執行簡單的堆轉儲分析並報告哪裡可能存在內存浪費;

Yourkit是一個商業的Javaprofiler,它有一個堆轉儲分析器,具備其他工具所提供的幾乎所有特性。除此之外,YourKit還提供了:

可達性的範圍(reachabilityscope):它不僅能夠列出可達和不可達的對象,還能按照它們的可達性範圍顯示它們的分布,也就是,強可達、弱/軟可達或不可達;

內存探查:YourKit內置了一組全面的查詢,而不是使用ad-hoc查詢功能,YourKit的查詢能夠探查內存,查找反模式並為常見的內存問題分析產生原因和提供解決方案。

如何診斷 Java 中的內存泄露

先用下面的命令監視進程:

while ( sleep 1 ) ; do ps -p $PID -o %cpu,%mem,rss ; done

如果看到內存上升很快,可能是因為虛擬機設置。如果沒有明確指定JVM的內存設置,它將設置默認值給他們。要獲得默認值,使用以下命令:

java -XX:+PrintFlagsFinal -version | grep -i HeapSize

如果這些都不符合希望的,那麼就需要指定JVM的內存設置。可以用下面的命令設置最小和最大堆大小:

java -Xms128m -Xmx256m

儘管有了合理的內存設置,也可以監控進程,但你仍然可能看到內存隨時間增加。為了進一步探究原因,可以使用下面的命令查看對象實例的直方圖:

jmap -histo $PID

如果仍然沒有足夠的信息,那麼可以用以下命令進行堆轉儲:

jmap -dump:format=b,file=/tmp/dump1.hprof $PID

通常,會用兩個堆轉儲,然後使用下面的jhat命令比較它們:

jhat -baseline /tmp/dump1.hprof /tmp/dump2.hprof

這個命令會啟動一個HTTP伺服器,可以用它來探索這兩個堆轉儲之間的差值。在默認情況下,HTTP伺服器啟動7000埠,可以在瀏覽器中訪問該埠。

如果有防火牆,可以通過SSH訪問,那麼可以通過如下命令連接該埠:

ssh -L 7000:localhost:7000 $HOST

昭通java培訓學校告訴你java內存診斷軟體?

對於每一個java進程來說都有自己的內存池和使用空間,而這也就意味著會出現內存使用錯誤等問題,而這時候我們就需要對java內存進行診斷分析,今天昭通java培訓就一起來了就一下,在進行內存診斷上都有哪些軟體可以使用。

Java堆:分析診斷數據

堆轉儲分析

堆轉儲可以使用如下的工具進行分析:

EclipseMAT(內存分析工具,MemoryAnalyzerTool)是一個社區開發的分析堆轉儲的工具。它提供了一些很棒的特性,包括:

可疑的泄漏點:它能探測堆轉儲中可疑的泄露點,報告持續佔有大量內存的對象;

直方圖:列出每個類的對象數量、淺大小(shallow)以及這些對象所持有的堆。直方圖中的對象可以很容易地使用正則表達式進行排序和過濾。這樣有助於放大並集中我們懷疑存在泄露的對象。它還能夠對比兩個堆轉儲的直方圖,展示每個類在實例數量方面的差異。這樣能夠幫助我們查找Java堆中增長快的對象,並進一步探查確定在堆中持有這些對象的根;

不可達的對象:MAT有一個非常棒的功能,那就是它允許在它的工作集對象中包含或排除不可達/死對象。如果你不想查看不可達的對象,也就是那些會在下一次GC周期中收集掉的對象,只關心可達的對象,那麼這個特性是非常便利的;

重複的類:展現由多個類載入器所載入的重複的類;

到GC根的路徑:能夠展示到GC根(JVM本身保持存活的對象)的引用鏈,這些GC根負責持有堆中的對象;

OQL:我們可以使用對象查詢語言(ObjectQueryLanguage)來探查堆轉儲中的對象。它豐富了OQL的基礎設施,能夠編寫複雜的查詢,幫助我們深入了解轉儲的內部。

JavaVisualVM:監控、分析和排查Java語言的一站式工具。它可以作為JDK工具的一部分來使用,也可以從GitHub上下載。它所提供的特性之一就是堆轉儲分析。它能夠為正在監控的應用創建堆轉儲,也可以載入和解析它們。從堆轉儲中,它可以展現類的直方圖、類的實例,也能查找特定實例的GC根;

jhat命令工具(在/bin文件夾中)提供了堆轉儲分析的功能,它能夠在任意的瀏覽器中展現堆轉儲中的對象。默認情況下,Web伺服器會在7000埠啟動。jhat支持範圍廣泛的預定義查詢和對象查詢語言,以便於探查堆轉儲中的對象;

Java任務控制(JavaMissionControl)的JOverflow插件:這是一個實驗性的插件,能夠讓Java任務控制執行簡單的堆轉儲分析並報告哪裡可能存在內存浪費;

Yourkit是一個商業的Javaprofiler,它有一個堆轉儲分析器,具備其他工具所提供的幾乎所有特性。除此之外,YourKit還提供了:

可達性的範圍(reachabilityscope):它不僅能夠列出可達和不可達的對象,還能按照它們的可達性範圍顯示它們的分布,也就是,強可達、弱/軟可達或不可達;

內存探查:YourKit內置了一組全面的查詢,而不是使用ad-hoc查詢功能,YourKit的查詢能夠探查內存,查找反模式並為常見的內存問題分析產生原因和提供解決方案。

北大青鳥java培訓:java內存診斷軟體?

對於每一個java進程來說都有自己的內存池和使用空間,而這也就意味著會出現內存使用錯誤等問題,而這時候我們就需要對java內存進行診斷分析,今天甘肅java培訓就一起來了就一下,在進行內存診斷上都有哪些軟體可以使用。

Java堆:分析診斷數據堆轉儲分析堆轉儲可以使用如下的工具進行分析:EclipseMAT(內存分析工具,MemoryAnalyzerTool)是一個社區開發的分析堆轉儲的工具。

它提供了一些很棒的特性,包括:可疑的泄漏點:它能探測堆轉儲中可疑的泄露點,報告持續佔有大量內存的對象;直方圖:列出每個類的對象數量、淺大小(shallow)以及這些對象所持有的堆。

直方圖中的對象可以很容易地使用正則表達式進行排序和過濾。

這樣有助於放大並集中我們懷疑存在泄露的對象。

它還能夠對比兩個堆轉儲的直方圖,展示每個類在實例數量方面的差異。

這樣能夠幫助我們查找Java堆中增長快的對象,並進一步探查確定在堆中持有這些對象的根;不可達的對象:MAT有一個非常棒的功能,那就是它允許在它的工作集對象中包含或排除不可達/死對象。

如果你不想查看不可達的對象,也就是那些會在下一次GC周期中收集掉的對象,只關心可達的對象,那麼這個特性是非常便利的;重複的類:展現由多個類載入器所載入的重複的類;到GC根的路徑:能夠展示到GC根(JVM本身保持存活的對象)的引用鏈,這些GC根負責持有堆中的對象;OQL:我們可以使用對象查詢語言(ObjectQueryLanguage)來探查堆轉儲中的對象。

它豐富了OQL的基礎設施,能夠編寫複雜的查詢,幫助我們深入了解轉儲的內部。

JavaVisualVM:監控、分析和排查Java語言的一站式工具。

它可以作為JDK工具的一部分來使用,也可以從GitHub上下載。

它所提供的特性之一就是堆轉儲分析。

它能夠為正在監控的應用創建堆轉儲,也可以載入和解析它們。

從堆轉儲中,它可以展現類的直方圖、類的實例,也能查找特定實例的GC根;jhat命令工具(在/bin文件夾中)提供了堆轉儲分析的功能,它能夠在任意的瀏覽器中展現堆轉儲中的對象。

默認情況下,Web伺服器會在7000埠啟動。

jhat支持範圍廣泛的預定義查詢和對象查詢語言,以便於探查堆轉儲中的對象;Java任務控制(JavaMissionControl)的JOverflow插件:這是一個實驗性的插件,能夠讓Java任務控制執行簡單的堆轉儲分析並報告哪裡可能存在內存浪費;Yourkit是一個商業的Javaprofiler,它有一個堆轉儲分析器,具備其他工具所提供的幾乎所有特性。

除此之外,YourKit還提供了:可達性的範圍(reachabilityscope):它不僅能夠列出可達和不可達的對象,還能按照它們的可達性範圍顯示它們的分布,也就是,強可達、弱/軟可達或不可達;內存探查:YourKit內置了一組全面的查詢,而不是使用ad-hoc查詢功能,YourKit的查詢能夠探查內存,查找反模式並為常見的內存問題分析產生原因和提供解決方案。

如何診斷 Java 中的內存泄露 – 碼農網

先用下面的命令監視進程:

while ( sleep 1 ) ; do ps -p $PID -o %cpu,%mem,rss ; done

如果看到內存上升很快,可能是因為虛擬機設置。如果沒有明確指定JVM的內存設置,它將設置默認值給他們。要獲得默認值,使用以下命令:

java -XX:+PrintFlagsFinal -version | grep -i HeapSize

如果這些都不符合希望的,那麼就需要指定JVM的內存設置。可以用下面的命令設置最小和最大堆大小:

java -Xms128m -Xmx256m

儘管有了合理的內存設置,也可以監控進程,但你仍然可能看到內存隨時間增加。為了進一步探究原因,可以使用下面的命令查看對象實例的直方圖:

jmap -histo $PID

如果仍然沒有足夠的信息,那麼可以用以下命令進行堆轉儲:

jmap -dump:format=b,file=/tmp/dump1.hprof $PID

通常,會用兩個堆轉儲,然後使用下面的jhat命令比較它們:

jhat -baseline /tmp/dump1.hprof /tmp/dump2.hprof

這個命令會啟動一個HTTP伺服器,可以用它來探索這兩個堆轉儲之間的差值。在默認情況下,HTTP伺服器啟動7000埠,可以在瀏覽器中訪問該埠。

如果有防火牆,可以通過SSH訪問,那麼可以通過如下命令連接該埠:

ssh -L 7000:localhost:7000 $HOST

怎樣使用jstack診斷Java應用程序故障

如:

jstack [-l] pid

提供一個測試的例子:

/**

* 死鎖例子

* @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.java。以上DeadLock類是一個死鎖的例子,假使在咱們不知情的情況下,運行DeadLock後,發現等了N久都沒有在屏幕列印線程完成信息。這個時候咱們就可以使用ps –ef|grep xxx查看該程序的pid值和使用jstack來生產堆棧結果問題。

javac DeadLock.java

jar cvf deadlock.jar DeadLock*.class

java -cp deadlock.jar DeadLock

ps –ef|grep deadlock.jar #獲取deadlock.jar進程的pid為1448

jstack -l 1448 deadlock.jstack

結果文件deadlock.jstack內容就會被列印出來,這樣就可以根據列印出的結果進行判斷了

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/193390.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-01 15:01
下一篇 2024-12-01 15:01

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論