十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
這篇文章主要介紹了OOM有什么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了孫吳免費(fèi)建站歡迎大家使用!
一、OOM含義:
OOM,全稱“Out Of Memory”,意思是“內(nèi)存用完了”。 它來(lái)源于java.lang.OutOfMemoryError。
二、為什么會(huì)出現(xiàn)java.lang.OutOfMemoryError:即OOM:
官方介紹為當(dāng)JVM因?yàn)闆](méi)有足夠的內(nèi)存來(lái)為對(duì)象分配空間并且垃圾回收器也已經(jīng)沒(méi)有空間可回收時(shí),就會(huì)拋出 java.lang.OutOfMemoryError :··· (注意:這是個(gè)很嚴(yán)重的問(wèn)題,因?yàn)檫@個(gè)問(wèn)題已經(jīng)嚴(yán)重到不足以被應(yīng)用處理)。
具體原因大致為兩方面:
1、自身原因:比如虛擬機(jī)本身可使用的內(nèi)存太少。
2、外在原因:如應(yīng)用使用的太多,且用完沒(méi)釋放,浪費(fèi)了內(nèi)存。此時(shí)就會(huì)造成內(nèi)存泄露或者內(nèi)存溢出。
內(nèi)存泄露:申請(qǐng)使用完的內(nèi)存沒(méi)有釋放,導(dǎo)致虛擬機(jī)不能再次使用該內(nèi)存,此時(shí)這段內(nèi)存就泄露了,因?yàn)樯暾?qǐng)者不用了,而又不能被虛擬機(jī)分配給別人用。
內(nèi)存溢出:申請(qǐng)的內(nèi)存超出了JVM能提供的內(nèi)存大小,此時(shí)稱之為溢出。
三、OOM的error類型
首先說(shuō)一下JAVA虛擬機(jī)運(yùn)行時(shí)會(huì)管理的內(nèi)存區(qū)域吧:
1. 程序計(jì)數(shù)器:當(dāng)前線程執(zhí)行的字節(jié)碼的行號(hào)指示器,線程私有
2. JAVA虛擬機(jī)棧:Java方法執(zhí)行的內(nèi)存模型,每個(gè)Java方法的執(zhí)行對(duì)應(yīng)著一個(gè)棧幀的進(jìn)棧和出棧的操作。
3. 本地方法棧:類似“ JAVA虛擬機(jī)棧 ”,但是為native方法的運(yùn)行提供內(nèi)存環(huán)境。
4. JAVA堆:對(duì)象內(nèi)存分配的地方,內(nèi)存垃圾回收的主要區(qū)域,所有線程共享。可分為新生代,老生代。
5. 方法區(qū):用于存儲(chǔ)已經(jīng)被JVM加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。Hotspot中的“永久代”。
6. 運(yùn)行時(shí)常量池:方法區(qū)的一部分,存儲(chǔ)常量信息,如各種字面量、符號(hào)引用等。
7. 直接內(nèi)存:并不是JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分, 可直接訪問(wèn)的內(nèi)存, 比如NIO會(huì)用到這部分。
所以除了程序計(jì)數(shù)器不會(huì)拋出OOM外,其他各個(gè)內(nèi)存區(qū)域都可能會(huì)拋出OOM。
常見(jiàn)OOM情況:
1. java.lang.OutOfMemoryError: Java heap space ------>java堆內(nèi)存溢出,此種情況最常見(jiàn),一般由于內(nèi)存泄露或者堆的大小設(shè)置不當(dāng)引起。對(duì)于內(nèi)存泄露,需要通過(guò)內(nèi)存監(jiān)控軟件查找程序中的泄露代碼,而堆大小可以通過(guò)虛擬機(jī)參數(shù)-Xms,-Xmx等修改。
2. java.lang.OutOfMemoryError: PermGen space ------>java永久代溢出,即方法區(qū)溢出了,一般出現(xiàn)于大量Class或者jsp頁(yè)面,或者采用cglib等反射機(jī)制的情況,因?yàn)樯鲜銮闆r會(huì)產(chǎn)生大量的Class信息存儲(chǔ)于方法區(qū)。當(dāng)出現(xiàn)此種情況時(shí)可以通過(guò)更改方法區(qū)的大小來(lái)解決,使用類似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。注意,過(guò)多的常量尤其是字符串也會(huì)導(dǎo)致方法區(qū)溢出。
3. java.lang.StackOverflowError ------> 不會(huì)拋OOM error,但也是比較常見(jiàn)的Java內(nèi)存溢出。JAVA虛擬機(jī)棧溢出,一般是由于程序中存在死循環(huán)或者深度遞歸調(diào)用造成的,棧大小設(shè)置太小也會(huì)出現(xiàn)此種溢出??梢酝ㄟ^(guò)虛擬機(jī)參數(shù)-Xss來(lái)設(shè)置棧的大小。
四、OOM分析
Heap Dump(堆轉(zhuǎn)儲(chǔ)文件)它是一個(gè)Java進(jìn)程在某個(gè)時(shí)間點(diǎn)上的內(nèi)存快照。Heap Dump是有著多種類型的。不過(guò)總體上heap dump在觸發(fā)快照的時(shí)候都保存了java對(duì)象和類的信息。通常在寫(xiě)heap dump文件前會(huì)觸發(fā)一次FullGC,所以heap dump文件中保存的是FullGC后留下的對(duì)象信息。
通過(guò)設(shè)置如下的JVM參數(shù),可以在發(fā)生OutOfMemoryError后獲取到一份HPROF二進(jìn)制Heap Dump文件:
-XX:+HeapDumpOnOutOfMemoryError
生成的文件會(huì)直接寫(xiě)入到工作目錄。
注意:該方法需要JDK5以上版本。
轉(zhuǎn)存堆內(nèi)存信息后,需要對(duì)文件進(jìn)行分析,從而找到OOM的原因??梢允褂靡韵路绞剑?/p>
mat: eclipse memory analyzer, 基于eclipse RCP的內(nèi)存分析工具。具體使用參考:http://www.eclipse.org/mat/,推薦使用。
jhat:JDK自帶的java heap analyze tool,可以將堆中的對(duì)象以html的形式顯示出來(lái),包括對(duì)象的數(shù)量,大小等等,并支持對(duì)象查詢語(yǔ)言O(shè)QL,分析相關(guān)的應(yīng)用后,可以通過(guò)http://localhost:7000來(lái)訪問(wèn)分析結(jié)果。不推薦使用。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“OOM有什么用”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!