JAVA內(nèi)存泄露專題

JAVA內(nèi)存泄露專題

ID:38198147

大小:373.51 KB

頁數(shù):16頁

時間:2019-06-07

JAVA內(nèi)存泄露專題_第1頁
JAVA內(nèi)存泄露專題_第2頁
JAVA內(nèi)存泄露專題_第3頁
JAVA內(nèi)存泄露專題_第4頁
JAVA內(nèi)存泄露專題_第5頁
資源描述:

《JAVA內(nèi)存泄露專題》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。

1、內(nèi)存泄露與內(nèi)存溢出1定義1、內(nèi)存泄漏:一般可以理解為系統(tǒng)資源(各方面的資源,堆、棧、線程等)在錯誤使用的情況下,導(dǎo)致使用完畢的資源無法回收(或沒有回收),從而造成那部分內(nèi)存不可用的情況。2、內(nèi)存溢出:指內(nèi)存不夠使用而拋出異常,內(nèi)存泄露是其形成的原因之一。2危害會導(dǎo)致新的資源分配請求無法完成,引起系統(tǒng)錯誤,最后導(dǎo)致系統(tǒng)崩潰。3內(nèi)存泄漏分類類型描述常發(fā)性內(nèi)存泄漏發(fā)生內(nèi)存泄漏的代碼會被多次執(zhí)行到,每次被執(zhí)行的時候都會導(dǎo)致一塊內(nèi)存泄漏偶發(fā)性內(nèi)存泄漏發(fā)生內(nèi)存泄漏的代碼只有在某些特定環(huán)境或操作過程下才會發(fā)生。常發(fā)性和偶發(fā)性是相對的。對于特定的環(huán)境,偶發(fā)性的也許就變成了常發(fā)性的一次性內(nèi)存泄漏發(fā)生內(nèi)存泄漏的

2、代碼只會被執(zhí)行一次,或者由于算法上的缺陷,導(dǎo)致總會有一塊僅且一塊內(nèi)存發(fā)生泄漏。比如,在類的構(gòu)造函數(shù)中分配內(nèi)存,在析構(gòu)函數(shù)中卻沒有釋放該內(nèi)存,所以內(nèi)存泄漏只會發(fā)生一次隱式內(nèi)存泄漏程序在運行過程中不停的分配內(nèi)存,但是直到結(jié)束的時候才釋放內(nèi)存。嚴格的說這里并沒有發(fā)生內(nèi)存泄漏,因為最終程序釋放了所有申請的內(nèi)存。但是對于一個服務(wù)器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內(nèi)存也可能導(dǎo)致最終耗盡系統(tǒng)的所有內(nèi)存。所以,我們稱這類內(nèi)存泄漏為隱式內(nèi)存泄漏4內(nèi)存泄露/溢出發(fā)生的區(qū)域??內(nèi)存區(qū)域發(fā)生情況備注程序計數(shù)器不可能虛擬機棧Y本地方法棧Y非堆內(nèi)存Y即方法區(qū)、持久代運行時常量池

3、imeConstantPool>Y本機直接內(nèi)存Y堆內(nèi)存Y1內(nèi)存溢出異常內(nèi)存區(qū)域異常虛擬機棧java.lang.StackOverflowError本地方法棧java.lang.OutOfMemoryError:unabletocreatenewnativethread非堆內(nèi)存java.lang.OutOfMemoryError:PermGenspace運行時常量池java.lang.OutOfMemoryError:?PermGen?space本機直接內(nèi)存java.lang.O

4、utOfMemoryError堆內(nèi)存java.lang.OutOfMemoryError:Javaheapspace2內(nèi)存溢出常見原因異常常見原因解決辦法java.lang.StackOverflowError線程棧的溢出,要么是方法調(diào)用層次過多(比如存在無限遞歸調(diào)用),要么是線程棧太小1、增大線程棧2、優(yōu)化程序設(shè)計,減少方法調(diào)用層次java.lang.OutOfMemoryError:unabletocreatenewnativethreadStack空間不足以創(chuàng)建額外的線程,要么是創(chuàng)建的線程過多,要么是Stack空間確實小1.通過-Xss啟動參數(shù)減少單個線程棧大小,這樣便能開更多線程(當

5、然不能太小,太小會出現(xiàn)StackOverflowError)2.通過-Xms-Xmx兩參數(shù)減少Heap大小,將內(nèi)存讓給Stack(前提是保證Heap空間夠用)java.lang.OutOfMemoryError:PermGenspacePermanentGeneration空間不足,不能加載額外的類,可能為運行時常量池溢出或持久代溢出。大量動態(tài)反射生成的類不斷被加載可導(dǎo)致此錯誤調(diào)整PermGen內(nèi)存java.lang.OutOfMemoryError有可能本機直接內(nèi)存不夠用java.lang.OutOfMemoryError:Javaheapspace1、內(nèi)存泄露2、堆內(nèi)存分配不合理引起溢出

6、3、創(chuàng)建一個占用內(nèi)存過大的對象1、調(diào)整堆內(nèi)存2、根據(jù)垃圾回收前后情況對比,同時根據(jù)對象引用情況(常見的集合對象引用)分析,基本都可以找到泄漏點,然后修改程序錯誤?3發(fā)生內(nèi)存泄露的情形Java內(nèi)存泄露根本原因是什么呢?答:長生命周期的對象持有短生命周期對象的引用就很可能發(fā)生內(nèi)存泄露,盡管短生命周期對象已經(jīng)不再需要,但是因為長生命周期對象持有它的引用而導(dǎo)致不能被回收,這就是java中內(nèi)存泄露的發(fā)生場景。具體主要有如下幾大類:?1.1靜態(tài)集合類引起內(nèi)存泄露?像HashMap、Vector等的使用最容易出現(xiàn)內(nèi)存泄露,這些靜態(tài)變量的生命周期和應(yīng)用程序一致,他們所引用的所有的對象Object也不能被釋放

7、,因為他們也將一直被Vector等引用著。?例:?importjava.util.Vector;/***@authorleijp*/publicclassVectorMemoryOOM{publicstaticvoidmain(String[]args){Vectorvobj=newVector(10);for(inti=0;i<100;i++){Objectobj=newObject();//注意此處Jav

當前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。