今天說說煩人的Java內存溢出問題

作為一個開發人員最不想看到的就是BUG,可見性的問題可能還不是最關鍵的,至少我們可以找到問題,很快解決,一般BUG也不會重複出現;但今天要學習的內存溢出就不一樣的,很難從根本上解決;因它與各方面的環境有關係,比如計算機內存過低、代碼寫的不健壯、運行內存設置不合理等等。

今天說說煩人的Java內存溢出問題

網絡配圖

常見的Java內存溢出類型,你知道哪些?

下面列出開發和運行過程中3種常見的內存溢出類型:

1、java.lang.OutOfMemoryError: PermGen space

通常Java虛擬機(JVM)管理著類內存,堆和非堆。堆是給開發人員使用的,只有在JVM啟動時才會創建;非堆則是JVM留給自己使用的,用來放類的信息;非堆在運行生命週期內GC(垃圾收集,回收)是不會主動釋放空間。如果我們開發的應用程序代碼量很大或用到的第三方Jar包量比較大,而Tomcat的MaxPermSize設置不合理,這時就很可能報這個錯誤,當然這不一定是馬上呈現出來,可能一天、二天或多少天后,你發現程序無法訪問,到服務器一看就是這個錯在做怪。

2、java.lang.OutOfMemoryError: Java heap space

這種內存是這們開發中最常見的錯誤之一,產生的主要原因是:

(1)、本身設置的內存參數過小(Xms/Xmx,NewSize/MaxNewSize);

(2)、程序自身的問題。Heap space的默認空間(-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4,這是個通用標準,我們可以根據系統環境進行重新設置;如果我們系統的內存剩餘不到40%,JVM就會增大Xmx設置的值,內存剩餘超過70%,JVM就會減少Xms設置的值。因此服務器的Xmx和Xms設置的值一般應該是相同的,這樣可以有效避免每次GC(回收)後都要調整虛擬機堆的大小。需要注意的是設置的值不能超過物理內存或操作系統的最大限制,這樣會導致起服務器無法啟動。

今天說說煩人的Java內存溢出問題

網絡配圖

3、java.lang.OutOfMemoryError: c heap space

系統對於C Heap沒有任何限制,所以C Heap發生時,java進程所佔用的內存會不斷增長,直到死機,唯一的解決方法就是殺掉進程或重啟計算機。

今天說說煩人的Java內存溢出問題

網絡配圖

我們學習的目的是要解決問題,下面看看怎麼避免以上錯誤的發生。

以下是我總結的6種解決方案,如果不全,大家補充一下:

1、寫代碼時儘早釋放無用對象的引用。好的辦法是使用臨時變量的時候,讓引用變量在使用完成後,自動設置為null;

2、我們在程序中涉及字符串處理時,盡理不要使用String,應該使用StringBuffer;

3、儘可能少用靜態變量,因為靜態變量是全局性的,GC不會主動回收;

4、不要集中創建對象尤其是大對象;

5、儘量運用對象池技術以提高系統性能;

6、不要在經常調用的方法中創建對象。

小夥伴們有什麼不同看法,可以提哦!!!

相關推薦

推薦中...