資源描述:
《java理解和探查內(nèi)存不足內(nèi)存泄漏.ppt》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、理解和探查內(nèi)存不足/內(nèi)存泄漏OutOfMemoryError/MemoryLeakAnalyze&UtilitiesDemonstrateII(AIX)理解和探查內(nèi)存不足/內(nèi)存泄漏聽完這次Webinar,您將能夠:了解Java基本內(nèi)存管理基本概念了解發(fā)生內(nèi)存不足/內(nèi)存泄漏錯誤的原因和癥狀了解如何解決內(nèi)存不足/內(nèi)存泄漏錯誤MENUJava內(nèi)存管理的基本概念內(nèi)存不足和內(nèi)存泄漏錯誤的原因和癥狀使用分析工具解決內(nèi)存不足和內(nèi)存泄漏錯誤預(yù)防內(nèi)存不足和內(nèi)存泄漏OutOfMemory分析實(shí)例3Java內(nèi)存管理的基本概念Java內(nèi)存Java
2、堆內(nèi)存(heap)Java堆內(nèi)存(heap):是JVM用于分配Java對象的內(nèi)存,包含活動對象和不可用對象堆大小通常是在服務(wù)器啟動時使用java命令中的–Xms(最小)–Xmx(最大)標(biāo)志來定義。4Java內(nèi)存管理的基本概念本地內(nèi)存(nativememory):是JVM用于其內(nèi)部操作的本地內(nèi)存(非Java內(nèi)存)JNI代碼和第三方本地模塊(例如,本地JDBC驅(qū)動程序)也使用本地內(nèi)存最大本地內(nèi)存大小取決于以下因素:操作系統(tǒng)進(jìn)程內(nèi)存大小限制已經(jīng)指定用于Java堆的內(nèi)存進(jìn)程內(nèi)存大?。?2位操作系統(tǒng),理論最大值2的32次方=4G
3、進(jìn)程內(nèi)存=Java內(nèi)存+本地內(nèi)存+加載的可執(zhí)行文件和庫+操作系統(tǒng)保留內(nèi)存5Java內(nèi)存管理的基本概念垃圾回收(GarbageCollection,GC):JVM自動檢測和釋放不再使用的內(nèi)存。Java運(yùn)行時JVM會執(zhí)行GC,這樣程序員不再需要顯式釋放對象。通常在空閑內(nèi)存降低到某一水平或內(nèi)存分配達(dá)到某一數(shù)量后自動觸發(fā)。以下OutOfMemory簡稱OOM以下MemoryLeak簡稱MLHeap簡稱“堆”6Java內(nèi)存問題的兩種表現(xiàn)形式Java內(nèi)存問題的兩種表現(xiàn)形式:內(nèi)存不足錯誤內(nèi)存泄漏錯誤內(nèi)存不足錯誤--明確顯示出java
4、.lang.OutOfMemoryError沒有空閑內(nèi)存可供JVM或本地代碼用于分配新對象或內(nèi)存塊在Java堆或本地內(nèi)存中都可能發(fā)生內(nèi)存泄漏錯誤--沒有錯誤信息,但是內(nèi)存幾乎耗盡已經(jīng)分配好的內(nèi)存或?qū)ο螅?dāng)不再需要,沒有得到釋放內(nèi)存曲線是一條斜向上的曲線對Java堆或本地內(nèi)存都可能產(chǎn)生這個問題通常最終的狀態(tài)就會導(dǎo)致OOM錯誤通常內(nèi)存泄漏ML會導(dǎo)致OOM錯誤,因此兩者的探查方法完全相同!7Java內(nèi)存問題的兩個主要發(fā)生區(qū)段Java內(nèi)存問題的兩個主要發(fā)生區(qū)段:Java內(nèi)存--包括heap堆內(nèi)存和permanent區(qū)本地內(nèi)存--包
5、括JVM進(jìn)程內(nèi)存和java使用的第三方本地代碼Java內(nèi)存不足Java堆內(nèi)存heap不足,無法再分配新對象或內(nèi)存塊permanent區(qū)內(nèi)存不足,無法再加載類到內(nèi)存中(Sun&HpJDK)本地內(nèi)存不足物理內(nèi)存不夠,無法再得到內(nèi)存第三方本地代碼有內(nèi)存泄漏的Bug,例如oracleocidriver本地代碼JVM的JIT或者JVM本身的Bug8MENUJava內(nèi)存管理的基本概念內(nèi)存不足和內(nèi)存泄漏錯誤的原因和癥狀使用分析工具解決內(nèi)存不足和內(nèi)存泄漏錯誤預(yù)防內(nèi)存不足和內(nèi)存泄漏OutOfMemory/MemoryLeak錯誤實(shí)例9內(nèi)存不
6、足和內(nèi)存泄漏錯誤的典型原因(1)物理內(nèi)存不足物理內(nèi)存有限,例如只有1G物理內(nèi)存很大,但是應(yīng)用很多,占用太多內(nèi)存Swap區(qū)大小不夠WeblogicServer壓力太大并發(fā)用戶太多大數(shù)據(jù)量分配應(yīng)用,例如統(tǒng)計(jì)報(bào)表Permanent區(qū)太小用戶代碼內(nèi)存不釋放httpsession放置了大量對象在內(nèi)存分配大量數(shù)據(jù)用戶自己創(chuàng)建太多線程調(diào)用AWT等畫圖接口用戶代碼內(nèi)存泄漏問題jdbc連接沒有close分配好的對象沒有close和釋放10內(nèi)存不足和內(nèi)存泄漏錯誤的典型原因(2)WeblogicServer配置不當(dāng)給heap分配的內(nèi)存太少ses
7、siontimeout時間太長EJBpool和Cache的太大第三方Java應(yīng)用的內(nèi)存問題第三方Java應(yīng)用也存在內(nèi)存不足或者泄漏問題第三方本地代碼的內(nèi)存泄漏問題第二類JDBC驅(qū)動的內(nèi)存泄漏,例如OracleOciDriver其他第三方本地代碼的內(nèi)存泄漏JVM本身的內(nèi)存問題JIT技術(shù)需要消耗更多的本地內(nèi)存JVM本身的Bug,例如GC的Bug11在Java堆中發(fā)生的OOM的故障癥狀如果Java堆發(fā)生OOM/ML:WeblogicServer運(yùn)行緩慢,響應(yīng)速度很慢(JVM在頻繁的做GC,Java進(jìn)程占用比較多的CPU)從con
8、sole的內(nèi)存監(jiān)控曲線看,一直徘徊在頂部最終JVM拋出java.lang.OutOfMemoryError異常,stdout或stderr中將顯示這則消息通過threaddump可以看到大部分時間所有線程都在wait,只有GC線程在工作很多線程都在申請內(nèi)存線程可能會異常退出(即在ThreadDump中看