對于Java程序來說,內存大體上是分兩個部分的。堆和棧。堆放對象和字符串,因為String也是一個類。棧放基本的數據類型,例如int,short,float等等。還有第三個部分是從棧里面分出來的,叫靜態堆棧區(好像是這個名),是放用static定義的變量的。
創新互聯公司主營龍海網站建設的網絡公司,主營網站建設方案,重慶APP軟件開發,龍海h5小程序制作搭建,龍海網站營銷推廣歡迎龍海等地區企業咨詢
首先從主方法開始,內存開辟了一個堆區,這個堆里面放的是Test對象的實例,然后又開辟了一個棧區,棧里面放的是Test對象的引用t,這個t就是指向了堆里面的Test對象。堆里面的Test實例有三個方法,在這里我更愿意用重載來解釋這三個方法的關系,這樣更準確,因為多態的概念太大了,這里確實也有多態的特性,但是多態用于解釋接口和實現類之間的關系應該更好吧。回歸正題,這三個方法被放在了堆里面,但是這三個方法都有參數,這些參數就是局部變量,是放在棧里的。每次調用一個方法時,程序給這些參數創建幾個臨時變量,一旦方法調用完畢這些變量就會被銷毀。對于定義在主方法中的變量,是在主方法調用完畢后銷毀的。另外,由于t存放在棧中,t指向的Test對象是存放在堆中的,所以主方法調用完畢先會銷毀t,然后垃圾回收器發現沒有變量指向Test對象了,就會在棧中把Test銷毀。
建議樓主看一下馬士兵的java基礎視頻教程,前面講內存講的很詳細。
使用java自帶的性能分析工具jvisualvm , 可以方便的查看內存, 對象, 線程等多種信息.
win+R????然后輸入???jvisualvm??回車即可
效果如下圖
對于每一個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的查詢能夠探查內存,查找反模式并為常見的內存問題分析產生原因和提供解決方案。
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();
}
}
}
你可以先用內存監控工具,進行監控,看看這個功能到底用多少內存。如果不多,其實都不需要實現你說的代碼監控的。如果你要使用代碼監控,你可是使用Runtime類的幾個屬性,MaxMemory、FreeMemory、TotalMemory。然后實現個線程,在下載pdf功能前開啟線程,然后完畢時關閉線程,如果內存即將溢出(設定個閾值,比如說15%),就報錯,跳轉到錯誤頁面。
分享題目:java分析代碼內存,java程序內存分析
文章源于:http://vcdvsql.cn/article38/hedhpp.html
成都網站建設公司_創新互聯,為您提供小程序開發、ChatGPT、企業網站制作、App設計、標簽優化、服務器托管
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯