jvm內存溢出原因及解決方案


內存溢出的原因及解決辦法:參考:https://wenku.baidu.com/view/02e3040c0366f5335a8102d276a20029bd64630f.html
1.堆棧溢出
    報錯信息:java.lang.OutOfMemoryError:...java heap space...
    造成原因:要么是代碼問題(引用不當、一次從數據庫中取的數據太多、或申請大對象導致),要么是訪問量太多並且每個訪問的時間太長或數據太多,導致數據釋放不掉。
    解決方法:排查代碼,若代碼沒問題適當調整-Xmx和-Xms。
    注:這個在溢出之前可能會報 java.lang.OutOfMemoryError:GC over head limit exceeded ,系統處於高頻的GC狀態。

2.PermGen溢出或PermGen滿了
    報錯信息:java.lang.OutOfMemoryError:PermGen space
    造成原因:系統代碼非常多或使用第三方包非常多、代碼中使用大量的常量,或通過動態代碼加載等方法;
    解決方法:增加 -XX:PermSize 和 -XX:MaxPermSize 的大小。
    注:PermGen又稱永久代,是為長期對象保留的空間。

3.使用ByteBuffer中的allocateDirect()的時候
    報錯信息:java.lang.OutOfMemoryError:Direct buffer memory
    造成原因:在直接或間接使用 ByteBuffer 的 allocateDirect() 時,不做clear的操作,就會出現此問題。
    解決方法:設置參數 -XX:MaxDirectMemorySize 。
    注:很多javaNIO框架中會把 ByteBuffer 中的 allocateDirect()封裝成其他的方法。

4.線程內存不足
    報錯信息:java.lang.StackOverflowError
    造成原因:-Xss 太小了,代碼中申請了很多局部調用的棧針內容存放在當前用戶線程中。
    解決方法:增加 -Xss 的大小。
    注:線程在jdk1.4以前是256K,1.5以后是1M。

5.第五類錯誤
    報錯信息:java.lang.OutOfMemoryError:unable to create new native thread
    造成原因:這個錯誤是無法為線程分配一塊內存區域造成的;要么是本身內存就不夠,要么是heap的空間設置的太大,導致剩余的內存不夠。
    解決方法:增加內存或適當設置 -Xmx 和 -Xms 的大小。
    注:線程基本只占 heap 以外的內存區域。

6.地址空間不夠
    報錯信息:java.lang.OutOfMemoryError:request {} byte for {}out of swap
    造成原因:一般是由於地址空間不夠導致的。

以下是一些參數的含義:
    -Xmx:為Heap區域的最大值;
    -Xms:為Heap區域的初始值;注:線上環境需要與 -Xmx 一致,否則 capacity 的值會來回飄動。
    -Xss(或-ss):指一個線程的native空間;注:還有個參數 -XX:ThreadStackSize ,這兩個參數會沖突,一般誰在后面誰生效。
    -XX:PermSize與-XX:MaxPermSize:指class裝載空間或者說是方法區(但不是本地方法區);注:只有Hotspot可以設置這塊區域。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM