本文目錄一覽:
- 1、java內存診斷軟件?
- 2、如何診斷 Java 中的內存泄露
- 3、昭通java培訓學校告訴你java內存診斷軟件?
- 4、北大青鳥java培訓:java內存診斷軟件?
- 5、如何診斷 Java 中的內存泄露 – 碼農網
- 6、怎樣使用jstack診斷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-hk/n/193390.html
微信掃一掃
支付寶掃一掃