1. 程式人生 > >java中出現內存溢出的幾種情況

java中出現內存溢出的幾種情況

xss 除了 占用 memory 兩個 存在 text spa 調用

情況一:java.lang.OutOfMemoryError: Java heap space

原因:java堆內存不足,可能是真的不足,也可能是程序中有死循環

方案:1、調整JVM參數-Xms2048m -Xmx2048m

2、定位死循環代碼

情況二:java.lang.OutOfMemoryError: GC overhead limit exceeded

原因:JDK6新增錯誤類型,當GC為釋放很小空間占用大量時間時拋出;一般是因為堆太小,導致異常的原因,沒有足夠的內存

方案:1、查看系統中是否有使用大內存的代碼或者死循環

2、添加jvm參數配置,來限制使用內存:-XX:-UseGCOverheadLimit

情況三:java.lang.OutOfMemoryError: PermGen space

原因:Perm區的內存不足

方案:-XX:MaxPermSize=128m -XX:PermSize=128m

情況四:java.lang.OutOfMemoryError: Direct buffer memory

原因:調整-XX:MaxDirectMemorySize= 參數

方案:-XX:MaxDirectMemorySize=128m

情況五:java.lang.OutOfMemoryError: unable to create new native thread

原因:Stack空間不足以創建額外的線程,要麽是創建的線程過多,要麽是Stack空間確實小了

方案:由於JVM沒有提供參數設置總的stack空間大小,但可以設置單個線程棧的大小;而系統的用戶空間一共是3G,除了Text/Data/BSS /MemoryMapping幾個段之外,Heap和Stack空間的總量有限,是此消彼長的。因此遇到這個錯誤,可以通過兩個途徑解決:1.通過 -Xss啟動參數減少單個線程棧大小,這樣便能開更多線程(當然不能太小,太小會出現StackOverflowError);2.通過-Xms -Xmx 兩參數減少Heap大小,將內存讓給Stack(前提是保證Heap空間夠用)

情況六:java.lang.StackOverflowError

原因:這也內存溢出錯誤的一種,即線程棧的溢出,要麽是方法調用層次過多(比如存在無限遞歸調用),要麽是線程棧太小

方案:優化程序設計,減少方法調用層次;調整-Xss參數增加線程棧大小

java中出現內存溢出的幾種情況