Java常見的幾種記憶體溢位及解決方法【情況一】:
java.lang.OutOfMemoryError:Javaheapspace:這種是java堆記憶體不夠,一個原因是真不夠(如遞迴的層數太多等),另一個原因是程式中有死迴圈;
如果是java堆記憶體不夠的話,可以透過調整JVM下面的配置來解決:
-Xms3062m
-Xmx3062m
【情況二】
java.lang.OutOfMemoryError:GCoverheadlimitexceeded
【解釋】:JDK6新增錯誤型別,當GC為釋放很小空間佔用大量時間時丟擲;一般是因為堆太小,導致異常的原因,沒有足夠的記憶體。
【解決方案】:
1、檢視系統是否有使用大記憶體的程式碼或死迴圈;
2、透過新增JVM配置,來限制使用記憶體:
-XX:-UseGCOverheadLimit
【情況三】:
java.lang.OutOfMemoryError:PermGenspace:這種是P區記憶體不夠,可透過調整JVM的配置:
-XX:MaxPermSize=128m
-XXermSize=128m
【注】:
JVM的Perm區主要用於存放Class和Meta資訊的,Class在被Loader時就會被放到PermGenspace,這個區域成為年老代,GC在主程式執行期間不會對年老區進行清理,預設是64M大小,當程式需要載入的物件比較多時,超過64M就會報這部分記憶體溢位了,需要加大記憶體分配,一般128m足夠。
【情況四】:
java.lang.OutOfMemoryError:Directbuffermemory
調整-XX:MaxDirectMemorySize=引數,如新增JVM配置:
-XX:MaxDirectMemorySize=128m
【情況五】:
java.lang.OutOfMemoryError:unabletocreatenewnativethread
【原因】:Stack空間不足以建立額外的執行緒,要麼是建立的執行緒過多,要麼是Stack空間確實小了。
【解決】:由於JVM沒有提供引數設定總的stack空間大小,但可以設定單個執行緒棧的大小;而系統的使用者空間一共是3G,除了Text/Data/BSS/MemoryMapping幾個段之外,Heap和Stack空間的總量有限,是此消彼長的。因此遇到這個錯誤,可以透過兩個途徑解決:1.透過-Xss啟動引數減少單個執行緒棧大小,這樣便能開更多執行緒(當然不能太小,太小會出現StackOverflowError);2.透過-Xms-Xmx兩引數減少Heap大小,將記憶體讓給Stack(前提是保證Heap空間夠用)。
Java常見的幾種記憶體溢位及解決方法【情況一】:
java.lang.OutOfMemoryError:Javaheapspace:這種是java堆記憶體不夠,一個原因是真不夠(如遞迴的層數太多等),另一個原因是程式中有死迴圈;
如果是java堆記憶體不夠的話,可以透過調整JVM下面的配置來解決:
-Xms3062m
-Xmx3062m
【情況二】
java.lang.OutOfMemoryError:GCoverheadlimitexceeded
【解釋】:JDK6新增錯誤型別,當GC為釋放很小空間佔用大量時間時丟擲;一般是因為堆太小,導致異常的原因,沒有足夠的記憶體。
【解決方案】:
1、檢視系統是否有使用大記憶體的程式碼或死迴圈;
2、透過新增JVM配置,來限制使用記憶體:
-XX:-UseGCOverheadLimit
【情況三】:
java.lang.OutOfMemoryError:PermGenspace:這種是P區記憶體不夠,可透過調整JVM的配置:
-XX:MaxPermSize=128m
-XXermSize=128m
【注】:
JVM的Perm區主要用於存放Class和Meta資訊的,Class在被Loader時就會被放到PermGenspace,這個區域成為年老代,GC在主程式執行期間不會對年老區進行清理,預設是64M大小,當程式需要載入的物件比較多時,超過64M就會報這部分記憶體溢位了,需要加大記憶體分配,一般128m足夠。
【情況四】:
java.lang.OutOfMemoryError:Directbuffermemory
調整-XX:MaxDirectMemorySize=引數,如新增JVM配置:
-XX:MaxDirectMemorySize=128m
【情況五】:
java.lang.OutOfMemoryError:unabletocreatenewnativethread
【原因】:Stack空間不足以建立額外的執行緒,要麼是建立的執行緒過多,要麼是Stack空間確實小了。
【解決】:由於JVM沒有提供引數設定總的stack空間大小,但可以設定單個執行緒棧的大小;而系統的使用者空間一共是3G,除了Text/Data/BSS/MemoryMapping幾個段之外,Heap和Stack空間的總量有限,是此消彼長的。因此遇到這個錯誤,可以透過兩個途徑解決:1.透過-Xss啟動引數減少單個執行緒棧大小,這樣便能開更多執行緒(當然不能太小,太小會出現StackOverflowError);2.透過-Xms-Xmx兩引數減少Heap大小,將記憶體讓給Stack(前提是保證Heap空間夠用)。