Java常見的幾種內存溢出及解決方法

Java常見的幾種內存溢出及解決方法【狀況一】:
java.lang.OutOfMemoryError:Javaheapspace:這種是java堆內存不夠,一個緣由是真不夠(如遞歸的層數太多等),另外一個緣由是程序中有死循環;
  若是是java堆內存不夠的話,能夠經過調整JVM下面的配置來解決:
  -Xms3062m
  -Xmx3062m
【狀況二】
  java.lang.OutOfMemoryError:GCoverheadlimitexceeded
  【解釋】:JDK6新增錯誤類型,當GC爲釋放很小空間佔用大量時間時拋出;通常是由於堆過小,致使異常的緣由,沒有足夠的內存。
  【解決方案】:
  一、查看系統是否有使用大內存的代碼或死循環;
  二、經過添加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.lang.StackOverflowError
  【緣由】:這也內存溢出錯誤的一種,即線程棧的溢出,要麼是方法調用層次過多(好比存在無限遞歸調用),要麼是線程棧過小。
  【解決】:優化程序設計,減小方法調用層次;調整-Xss參數增長線程棧大小。java

相關文章
相關標籤/搜索