對(duì)于Java程序來(lái)說(shuō),內(nèi)存大體上是分兩個(gè)部分的。堆和棧。堆放對(duì)象和字符串,因?yàn)镾tring也是一個(gè)類(lèi)。棧放基本的數(shù)據(jù)類(lèi)型,例如int,short,float等等。還有第三個(gè)部分是從棧里面分出來(lái)的,叫靜態(tài)堆棧區(qū)(好像是這個(gè)名),是放用static定義的變量的。
創(chuàng)新互聯(lián)公司主營(yíng)龍海網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP軟件開(kāi)發(fā),龍海h5小程序制作搭建,龍海網(wǎng)站營(yíng)銷(xiāo)推廣歡迎龍海等地區(qū)企業(yè)咨詢(xún)
首先從主方法開(kāi)始,內(nèi)存開(kāi)辟了一個(gè)堆區(qū),這個(gè)堆里面放的是Test對(duì)象的實(shí)例,然后又開(kāi)辟了一個(gè)棧區(qū),棧里面放的是Test對(duì)象的引用t,這個(gè)t就是指向了堆里面的Test對(duì)象。堆里面的Test實(shí)例有三個(gè)方法,在這里我更愿意用重載來(lái)解釋這三個(gè)方法的關(guān)系,這樣更準(zhǔn)確,因?yàn)槎鄳B(tài)的概念太大了,這里確實(shí)也有多態(tài)的特性,但是多態(tài)用于解釋接口和實(shí)現(xiàn)類(lèi)之間的關(guān)系應(yīng)該更好吧。回歸正題,這三個(gè)方法被放在了堆里面,但是這三個(gè)方法都有參數(shù),這些參數(shù)就是局部變量,是放在棧里的。每次調(diào)用一個(gè)方法時(shí),程序給這些參數(shù)創(chuàng)建幾個(gè)臨時(shí)變量,一旦方法調(diào)用完畢這些變量就會(huì)被銷(xiāo)毀。對(duì)于定義在主方法中的變量,是在主方法調(diào)用完畢后銷(xiāo)毀的。另外,由于t存放在棧中,t指向的Test對(duì)象是存放在堆中的,所以主方法調(diào)用完畢先會(huì)銷(xiāo)毀t,然后垃圾回收器發(fā)現(xiàn)沒(méi)有變量指向Test對(duì)象了,就會(huì)在棧中把Test銷(xiāo)毀。
建議樓主看一下馬士兵的java基礎(chǔ)視頻教程,前面講內(nèi)存講的很詳細(xì)。
使用java自帶的性能分析工具jvisualvm , 可以方便的查看內(nèi)存, 對(duì)象, 線(xiàn)程等多種信息.
win+R????然后輸入???jvisualvm??回車(chē)即可
效果如下圖
對(duì)于每一個(gè)java進(jìn)程來(lái)說(shuō)都有自己的內(nèi)存池和使用空間,而這也就意味著會(huì)出現(xiàn)內(nèi)存使用錯(cuò)誤等問(wèn)題,而這時(shí)候我們就需要對(duì)java內(nèi)存進(jìn)行診斷分析,今天云南java培訓(xùn)就一起來(lái)了就一下,在進(jìn)行內(nèi)存診斷上都有哪些軟件可以使用。
Java堆:分析診斷數(shù)據(jù)
堆轉(zhuǎn)儲(chǔ)分析
堆轉(zhuǎn)儲(chǔ)可以使用如下的工具進(jìn)行分析:
EclipseMAT(內(nèi)存分析工具,MemoryAnalyzerTool)是一個(gè)社區(qū)開(kāi)發(fā)的分析堆轉(zhuǎn)儲(chǔ)的工具。它提供了一些很棒的特性,包括:
可疑的泄漏點(diǎn):它能探測(cè)堆轉(zhuǎn)儲(chǔ)中可疑的泄露點(diǎn),報(bào)告持續(xù)占有大量?jī)?nèi)存的對(duì)象;
直方圖:列出每個(gè)類(lèi)的對(duì)象數(shù)量、淺大小(shallow)以及這些對(duì)象所持有的堆。直方圖中的對(duì)象可以很容易地使用正則表達(dá)式進(jìn)行排序和過(guò)濾。這樣有助于放大并集中我們懷疑存在泄露的對(duì)象。它還能夠?qū)Ρ葍蓚€(gè)堆轉(zhuǎn)儲(chǔ)的直方圖,展示每個(gè)類(lèi)在實(shí)例數(shù)量方面的差異。這樣能夠幫助我們查找Java堆中增長(zhǎng)快的對(duì)象,并進(jìn)一步探查確定在堆中持有這些對(duì)象的根;
不可達(dá)的對(duì)象:MAT有一個(gè)非常棒的功能,那就是它允許在它的工作集對(duì)象中包含或排除不可達(dá)/死對(duì)象。如果你不想查看不可達(dá)的對(duì)象,也就是那些會(huì)在下一次GC周期中收集掉的對(duì)象,只關(guān)心可達(dá)的對(duì)象,那么這個(gè)特性是非常便利的;
重復(fù)的類(lèi):展現(xiàn)由多個(gè)類(lèi)加載器所加載的重復(fù)的類(lèi);
到GC根的路徑:能夠展示到GC根(JVM本身保持存活的對(duì)象)的引用鏈,這些GC根負(fù)責(zé)持有堆中的對(duì)象;
OQL:我們可以使用對(duì)象查詢(xún)語(yǔ)言(ObjectQueryLanguage)來(lái)探查堆轉(zhuǎn)儲(chǔ)中的對(duì)象。它豐富了OQL的基礎(chǔ)設(shè)施,能夠編寫(xiě)復(fù)雜的查詢(xún),幫助我們深入了解轉(zhuǎn)儲(chǔ)的內(nèi)部。
JavaVisualVM:監(jiān)控、分析和排查Java語(yǔ)言的一站式工具。它可以作為JDK工具的一部分來(lái)使用,也可以從GitHub上下載。它所提供的特性之一就是堆轉(zhuǎn)儲(chǔ)分析。它能夠?yàn)檎诒O(jiān)控的應(yīng)用創(chuàng)建堆轉(zhuǎn)儲(chǔ),也可以加載和解析它們。從堆轉(zhuǎn)儲(chǔ)中,它可以展現(xiàn)類(lèi)的直方圖、類(lèi)的實(shí)例,也能查找特定實(shí)例的GC根;
jhat命令工具(在/bin文件夾中)提供了堆轉(zhuǎn)儲(chǔ)分析的功能,它能夠在任意的瀏覽器中展現(xiàn)堆轉(zhuǎn)儲(chǔ)中的對(duì)象。默認(rèn)情況下,Web服務(wù)器會(huì)在7000端口啟動(dòng)。jhat支持范圍廣泛的預(yù)定義查詢(xún)和對(duì)象查詢(xún)語(yǔ)言,以便于探查堆轉(zhuǎn)儲(chǔ)中的對(duì)象;
Java任務(wù)控制(JavaMissionControl)的JOverflow插件:這是一個(gè)實(shí)驗(yàn)性的插件,能夠讓Java任務(wù)控制執(zhí)行簡(jiǎn)單的堆轉(zhuǎn)儲(chǔ)分析并報(bào)告哪里可能存在內(nèi)存浪費(fèi);
Yourkit是一個(gè)商業(yè)的Javaprofiler,它有一個(gè)堆轉(zhuǎn)儲(chǔ)分析器,具備其他工具所提供的幾乎所有特性。除此之外,YourKit還提供了:
可達(dá)性的范圍(reachabilityscope):它不僅能夠列出可達(dá)和不可達(dá)的對(duì)象,還能按照它們的可達(dá)性范圍顯示它們的分布,也就是,強(qiáng)可達(dá)、弱/軟可達(dá)或不可達(dá);
內(nèi)存探查:YourKit內(nèi)置了一組全面的查詢(xún),而不是使用ad-hoc查詢(xún)功能,YourKit的查詢(xún)能夠探查內(nèi)存,查找反模式并為常見(jiàn)的內(nèi)存問(wèn)題分析產(chǎn)生原因和提供解決方案。
hi:
虛擬機(jī)的內(nèi)存情況查看,使用Runtime類(lèi)進(jìn)行。如下:
//虛擬機(jī)內(nèi)存使用量查詢(xún)
class RamRun implements Runnable{
private Runtime runtime;
public void run(){
try{
runtime=Runtime.getRuntime();
System.out.println("處理器的數(shù)目"+runtime.availableProcessors());
System.out.println("空閑內(nèi)存量:"+runtime.freeMemory()/ 1024L/1024L + "M av");
System.out.println("使用的最大內(nèi)存量:"+runtime.maxMemory()/ 1024L/1024L + "M av");
System.out.println("內(nèi)存總量:"+runtime.totalMemory()/ 1024L/1024L + "M av");
}catch(Exception e){
e.printStackTrace();
}
}
}
你可以先用內(nèi)存監(jiān)控工具,進(jìn)行監(jiān)控,看看這個(gè)功能到底用多少內(nèi)存。如果不多,其實(shí)都不需要實(shí)現(xiàn)你說(shuō)的代碼監(jiān)控的。如果你要使用代碼監(jiān)控,你可是使用Runtime類(lèi)的幾個(gè)屬性,MaxMemory、FreeMemory、TotalMemory。然后實(shí)現(xiàn)個(gè)線(xiàn)程,在下載pdf功能前開(kāi)啟線(xiàn)程,然后完畢時(shí)關(guān)閉線(xiàn)程,如果內(nèi)存即將溢出(設(shè)定個(gè)閾值,比如說(shuō)15%),就報(bào)錯(cuò),跳轉(zhuǎn)到錯(cuò)誤頁(yè)面。
分享題目:java分析代碼內(nèi)存,java程序內(nèi)存分析
文章源于:http://chinadenli.net/article38/hedhpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、ChatGPT、企業(yè)網(wǎng)站制作、App設(shè)計(jì)、標(biāo)簽優(yōu)化、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)