1. 程式人生 > 其它 >jvm記憶體溢位原因及解決方案

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可以設定這塊區域。