內存溢出是怎麼回事

首行推薦——http://www.jianshu.com/p/ba0fdee47cb4java

爲何會內存溢出?優化

由於裝滿了,裝不下了...spa

好吧,其實提到內存溢出,不得再也不提到另外一個概念。線程

內存泄露。設計

內存泄露

什麼是內存泄露,由於執行程序指令,引入數據,裝載數據等等,都是須要內存空間的,內存空間也是有限的。
正常的程序執行,確定是開闢內存空間,運行程序指令(輸入、輸出),程序結束,釋放空間。這樣能夠保證內存的往復利用。對象

可是,有時候程序設計有漏洞或是不夠嚴謹的話,致使佔用的內存沒有獲得釋放,那麼這一塊內存就沒辦法再利用了,這就是內存泄露。遞歸

當不斷出現內存泄露的時候,被佔用的內存空間愈來愈多,最終到下一次須要使用內存空間的時候就會這樣——空間不夠了,溢出了。內存

Java的內存溢出

對於Java,內存溢出分三種狀況。get

一、OutOfMemoryError: PermGen space虛擬機

Permanent Generation space 這個區域主要用來保存加來的Class的一些信息,在程序運行期間屬於永久佔用的,Java的GC不會對他進行釋放,因此若是啓動的程序加載的信息比較大,超出了這個空間的大小,就會發生溢出錯誤;

解決的辦法無非就是增長空間分配了——增長java虛擬機中的XX:PermSize和XX:MaxPermSize參數的大小,其中XX:PermSize是初始永久保存區域大小,XX:MaxPermSize是最大永久保存區域大小。

二、OutOfMemoryError:Java heap space

heap 是Java內存中的堆區,主要用來存放對象,當對象太多超出了空間大小,GC又來不及釋放的時候,就會發生溢出錯誤。

Java中對象的建立是可控的,可是對象的回收是由GC自動的,通常來講,當已存在對象沒有引用(即不可達)的時候,GC就會定時的來回收對象,釋放空間。可是由於程序的設計問題,致使對象可達可是又沒有用(即前文提到的內存泄露),當這種狀況愈來愈多的時候,問題就來了。

針對這個問題,咱們須要作一下兩點:
一、檢查程序,減小大量重複建立對象的死循環,減小內存泄露。
二、增長Java虛擬機中Xms(初始堆大小)和Xmx(最大堆大小)參數的大小。

三、StackOverFlowError

stack是Java內存中的棧空間,主要用來存放方法中的變量,參數等臨時性的數據的,發生溢出通常是由於分配空間過小,或是執行的方法遞歸層數太多建立了佔用了太多棧幀致使溢出。

針對這個問題,除了修改配置參數-Xss參數增長線程棧大小以外,優化程序是尤爲重要。

關於內存的問題,淺見如上。

做者:艾爾歐惟伊 連接:https://www.jianshu.com/p/8c31ef19983a 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。

相關文章
相關標籤/搜索