OOM情況與原因

OOM,全稱“Out Of Memory”,翻譯成中文就是“內存用完了”,來源於java.lang.OutOfMemoryError
爲什麼會OOM?
1)分配的少了:比如虛擬機本身可使用的內存(一般通過啓動時的VM參數指定)太少。
 
2)應用用的太多,並且用完沒釋放,浪費了。此時就會造成內存泄露或者內存溢出。

內存泄露:申請使用完的內存沒有釋放,導致虛擬機不能再次使用該內存,此時這段內存就泄露了,因爲申請者不用了,而又不能被虛擬機分配給別人用。
內存溢出:申請的內存超出了JVM能提供的內存大小,此時稱之爲溢出。
最常見的OOM情況有以下三種:
java.lang.OutOfMemoryError: Java heap space ——>java堆內存溢出,此種情況最常見,一般由於內存泄露或者堆的大小設置不當引起。對於內存泄露,需要通過內存監控軟件查找程序中的泄露代碼,而堆大小可以通過虛擬機參數-Xms,-Xmx等修改。
java.lang.OutOfMemoryError: PermGen space ——>java永久代溢出,即方法區溢出了,一般出現於大量Class或者jsp頁面,或者採用cglib等反射機制的情況,因爲上述情況會產生大量的Class信息存儲於方法區。此種情況可以通過更改方法區的大小來解決,使用類似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,過多的常量尤其是字符串也會導致方法區溢出。
java.lang.StackOverflowError ——> 不會拋OOM error,但也是比較常見的Java內存溢出。JAVA虛擬機棧溢出,一般是由於程序中存在死循環或者深度遞歸調用造成的,棧大小設置太小也會出現此種溢出。可以通過虛擬機參數-Xss來設置棧的大小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章