內(nèi)存溢出詳列

內(nèi)存溢出java.lang.OutOfMemoryError: Java heap space
Java堆用于存儲(chǔ)對(duì)象實(shí)例,對(duì)象數(shù)量達(dá)到最大容量后產(chǎn)生內(nèi)存溢出
-verbose:gc -Xms20M -Xmx20M -Xmm10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
處理:①用內(nèi)存映像分析工具如Eclipse Memory Analyzer對(duì)dump出來(lái)的堆轉(zhuǎn)儲(chǔ)快照進(jìn)行分析,確定內(nèi)存中的對(duì)象是否是必要的,也就是到底是內(nèi)存泄漏(Memory Leak)還是內(nèi)存溢出(Memory Overflow) ②如果是內(nèi)存泄漏,那么查看泄漏對(duì)象到GC Roots的引用鏈(對(duì)象與GC Roots的關(guān)聯(lián)路徑,有這條路徑在,GC就不會(huì)去清理這個(gè)對(duì)象),再定位到泄漏代碼 ③如果是內(nèi)存溢出,那么檢查JVM參數(shù)是否可以加大,檢查代碼上是否存在某些生命周期過(guò)長(zhǎng)的情況以及其他減少運(yùn)行期內(nèi)存的方法
滿棧java.lang.StackOverflowError
棧存儲(chǔ)的是局部變量,當(dāng)局部變量過(guò)多,棧深度大于虛擬機(jī)允許的深度時(shí)報(bào)異常
-Xss128k(每個(gè)線程棧分配的內(nèi)存)
內(nèi)存溢出java.lang.OutOfMemoryError: unable to create new native thread
線程擴(kuò)展時(shí)無(wú)法申請(qǐng)空間,導(dǎo)致無(wú)法創(chuàng)建更多的線程|-Xss128k|通過(guò)減少最大堆和減少棧容量(線程大小)來(lái)?yè)Q取更多的線程
3. 方法區(qū)(共享)運(yùn)行時(shí)常量池溢出java.lang.OutOfMemoryError: PermGen space
常量池存儲(chǔ)的是常量和靜態(tài)變量
-XX:PermSize和-XX:MaxPermSize
方法區(qū)溢出java.lang.OutOfMemoryError: PermGen space
方法區(qū)存儲(chǔ)的是Class相關(guān)的信息,一般是動(dòng)態(tài)生成大量Class的應(yīng)用中會(huì)遇到
4. 本機(jī)直接內(nèi)存內(nèi)存溢出java.lang.OutOfMemoryError
JVM 進(jìn)程空間中,Java Heap 以外的內(nèi)存空間稱為 JVM 的 native memory。進(jìn)程的很多資源都是存儲(chǔ)在 JVM 的 native memory 中,例如載入的代碼映像,線程的堆棧,線程的管理控制塊,JVM 的靜態(tài)數(shù)據(jù)、全局?jǐn)?shù)據(jù)等等。也包括 JNI 程序中 native code 分配到的資源。
-XX:MaxDirectMemorySize
OutOfMemoryError 后面不接是哪個(gè)內(nèi)存塊,那就是直接內(nèi)存溢出
