內存溢出的原因及解決辦法:參考: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可以設置這塊區域。
