本文目錄一覽:
javacore怎麼樣分析內存使用情況
hi:
虛擬機的內存情況查看,使用Runtime類進行。如下:
//虛擬機內存使用量查詢
class RamRun implements Runnable{
private Runtime runtime;
public void run(){
try{
runtime=Runtime.getRuntime();
System.out.println(“處理器的數目”+runtime.availableProcessors());
System.out.println(“空閑內存量:”+runtime.freeMemory()/ 1024L/1024L + “M av”);
System.out.println(“使用的最大內存量:”+runtime.maxMemory()/ 1024L/1024L + “M av”);
System.out.println(“內存總量:”+runtime.totalMemory()/ 1024L/1024L + “M av”);
}catch(Exception e){
e.printStackTrace();
}
}
}
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棧和堆的內存分配,畫出內存分析圖!
程序一沒有涉及到堆內存。
程序二:
當new
Demo()時
在堆內存中開闢一個空間
空間內有一條屬性
為String類型的temp,初始化值為hello。
並把這個空間的地址賦給d1存在於棧內存中。這時d1就指向了new
Demo()
這個對象。當d1.temp=”world”時,改變了堆內存中temp的值為world。輸出語句列印出d1.temp的值。
調用fun()方法,d1作為參數傳入並把d1.temp的值改為MMM
。輸出語句列印出d1.temp改變後的值。
我是個新手,菜鳥。剛開始自學java
如果有說得不對的地方
請高手勿噴。
也希望有前輩能指點指點。希望找個老師來教我。感激不盡!
如何排查Java內存泄露
1.打開/tomcat_home/bin/catalina.bat文件
2.加上:set JAVA_OPTS=%JAVA_OPTS% -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump,這樣當內存溢出是就會在對應路徑下生成dump文件
運行程序打開jdk bin 文件夾下再帶的 jvisualvm.exe
選擇tomcat線程,打開實時監控頁面可以看到對應的堆棧線程和裝在類,內存的實時情況
運行程序打開jdk bin 文件夾下再帶的 jconsole.exe,可以概覽堆棧線程和裝在類,內存的全部運行時間情況
下載安裝mat,dump分析軟體,安裝後,點擊file open 導入dump文件
打開後,灰色區域為可能發生內存溢出的區域,下帶問題描述
選擇Histogram,點擊shallow列進行排序,找出實例最多的
右鍵實例最的選擇list objects-with incoming references,可在根據正則表達式輸入自己想查的類,搜索,後右鍵打開 path to gc root-exclude phantom/weak/soft etc. references 就可以查出 調用為回收的相關信息。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/198357.html