創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!
成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括丹徒網(wǎng)站建設(shè)、丹徒網(wǎng)站制作、丹徒網(wǎng)頁(yè)制作以及丹徒網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,丹徒網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到丹徒省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!Java內(nèi)存中出現(xiàn)OOM的原因有哪些?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
一,jvm內(nèi)存區(qū)域
1,程序計(jì)數(shù)器
一塊很小的內(nèi)存空間,作用是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。
2,java棧
與程序計(jì)數(shù)器一樣,java棧(虛擬機(jī)棧)也是線程私有的,其生命周期與線程相同。通常存放基本數(shù)據(jù)類型,對(duì)象引用(一個(gè)指向?qū)ο笃鹗嫉刂返囊弥羔樆蛞粋€(gè)代表對(duì)象的句柄),reeturnAddress類型(指向一條字節(jié)碼指令的地址)
棧區(qū)域有兩種異常類型:如果線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度,將拋StrackOverflowError異常;如果虛擬機(jī)棧可以動(dòng)態(tài)擴(kuò)展(大部分虛擬機(jī)都可動(dòng)態(tài)擴(kuò)展),當(dāng)擴(kuò)展時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存時(shí)會(huì)拋出OutOfMemoryError異常。
3,本地方法棧
與虛擬機(jī)棧作用很相似,區(qū)別是虛擬機(jī)棧為虛擬機(jī)執(zhí)行java方法服務(wù),而本地方法棧則是為虛擬機(jī)用到的Native方法服務(wù)。和虛擬機(jī)棧一樣可能拋出StackOverflowError和OutOfMemoryError異常。
4,java堆
java Heap是jvm所管理的內(nèi)存中大的區(qū)域。JavaHeap是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。主要存放對(duì)象實(shí)例。JavaHeap是垃圾收集器管理的主要區(qū)域,其可細(xì)分為新生代和老年代。如果在堆中沒(méi)有內(nèi)存完成實(shí)例分配,并且也無(wú)法再擴(kuò)展時(shí),會(huì)拋出OutOfMemoryError異常。
5,方法區(qū)
與javaHeap一樣是各個(gè)線程共享的內(nèi)存區(qū)域,用于存放已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、及時(shí)編譯器編譯后的代碼等數(shù)據(jù)。當(dāng)方法區(qū)無(wú)法滿足內(nèi)存分配的需求時(shí),將拋出OutOfMemoryError異常。方法同時(shí)包含常聽(tīng)說(shuō)的運(yùn)行時(shí)常量池,用于存放編譯期生成的各種字面量和符號(hào)引用。
6,直接內(nèi)存
直接內(nèi)存并不是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,也不是java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域,是jvm外部的內(nèi)存區(qū)域,這部分區(qū)域也可能導(dǎo)致OutOfMemoryError異常。
二,jvm參數(shù)
-Xss(StackSpace)棧空間
-Xms ,-Xmx(heap memory space)堆空間:Heap是大家最為熟悉的區(qū)域,他是jvm用來(lái)存儲(chǔ)對(duì)象實(shí)例的區(qū)域,Heap在32位的系統(tǒng)中大為2G,其大小通過(guò)-Xms和-Xmx來(lái)控制,-Xms為jvm啟動(dòng)時(shí)申請(qǐng)的最小Heap內(nèi)存,默認(rèn)為物理內(nèi)存的1/64,但小于1G,-Xmx為jvm可申請(qǐng)的大的Heap內(nèi)存,默認(rèn)為物理內(nèi)存的1/4,一般也小于1G,默認(rèn)當(dāng)空余堆內(nèi)存小于40%時(shí),jvm會(huì)大Heap的大小到-Xmx指定大小,可通過(guò)-XX:MinHeapFreeRatio來(lái)指定這個(gè)比例,當(dāng)空余堆內(nèi)存大于70%時(shí),JVM會(huì)將Heap的大小往-Xms指定的大小調(diào)整,可通過(guò)-XX:MaxHeapFreeRatio來(lái)指定這個(gè)比例,但通常為了避免頻繁調(diào)整HeapSize的大小,將-Xms和-Xmx的值設(shè)為相同。
-XX:PermSize -XX:MaxPermSize :方法區(qū)持久代大?。?方法區(qū)域也是全局共享的,在一定的條件下它也會(huì)被 GC ,當(dāng)方法區(qū)域需要使用的內(nèi)存超過(guò)其允許的大小時(shí),會(huì)拋出 OutOfMemory 的錯(cuò)誤信息。
三,常見(jiàn)內(nèi)存溢出錯(cuò)誤解決辦法
除了程序計(jì)數(shù)器外,虛擬機(jī)內(nèi)存的其他幾個(gè)運(yùn)行時(shí)區(qū)域都有發(fā)生OutOfMemoryError(OOM)異常的可能,
1,Java Heap 溢出
一般的異常信息:java.lang.OutOfMemoryError:Java heap spacess
java堆用于存儲(chǔ)對(duì)象實(shí)例,我們只要不斷的創(chuàng)建對(duì)象,并且保證GC Roots到對(duì)象之間有可達(dá)路徑來(lái)避免垃圾回收機(jī)制清除這些對(duì)象,就會(huì)在對(duì)象數(shù)量達(dá)到大堆容量限制后產(chǎn)生內(nèi)存溢出異常。
出現(xiàn)這種異常,一般手段是先通過(guò)內(nèi)存映像分析工具(如Eclipse Memory Analyzer)對(duì)dump出來(lái)的堆轉(zhuǎn)存快照進(jìn)行分析,重點(diǎn)是確認(rèn)內(nèi)存中的對(duì)象是否是必要的,先分清是因?yàn)閮?nèi)存泄漏(Memory Leak)還是內(nèi)存溢出(Memory Overflow)。
如果是內(nèi)存泄漏,可進(jìn)一步通過(guò)工具(如Jrockit等工具)查看泄漏對(duì)象到GC Roots的引用鏈。于是就能找到泄漏對(duì)象時(shí)通過(guò)怎樣的路徑與GC Roots相關(guān)聯(lián)并導(dǎo)致垃圾收集器無(wú)法自動(dòng)回收。
如果不存在泄漏,那就應(yīng)該檢查虛擬機(jī)的參數(shù)(-Xmx與-Xms)的設(shè)置是否適當(dāng)。
2,虛擬機(jī)棧和本地方法棧溢出
如果線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的大深度,將拋出StackOverflowError異常。
如果虛擬機(jī)在擴(kuò)展棧時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存空間,則拋出OutOfMemoryError異常
這里需要注意當(dāng)棧的大小越大可分配的線程數(shù)就越少。
3,運(yùn)行時(shí)常量池溢出
異常信息:java.lang.OutOfMemoryError:PermGen space
如果要向運(yùn)行時(shí)常量池中添加內(nèi)容,最簡(jiǎn)單的做法就是使用String.intern()這個(gè)Native方法。該方法的作用是:如果池中已經(jīng)包含一個(gè)等于此String的字符串,則返回代表池中這個(gè)字符串的String對(duì)象;否則,將此String對(duì)象包含的字符串添加到常量池中,并且返回此String對(duì)象的引用。由于常量池分配在方法區(qū)內(nèi),我們可以通過(guò)-XX:PermSize和-XX:MaxPermSize限制方法區(qū)的大小,從而間接限制其中常量池的容量。
4,方法區(qū)溢出
方法區(qū)用于存放Class的相關(guān)信息,如類名、訪問(wèn)修飾符、常量池、字段描述、方法描述等。
異常信息:java.lang.OutOfMemoryError:PermGen space
方法區(qū)溢出也是一種常見(jiàn)的內(nèi)存溢出異常,一個(gè)類如果要被垃圾收集器回收,判定條件是很苛刻的。在經(jīng)常動(dòng)態(tài)生成大量Class的應(yīng)用中,要特別注意這點(diǎn)。
看完上述內(nèi)容,你們掌握J(rèn)ava內(nèi)存中出現(xiàn)OOM的原因有哪些的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!