當前位置:編程學習大全網 - 編程語言 - java.lang內存溢出怎麽解決

java.lang內存溢出怎麽解決

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.lang.StackOverflowError

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

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

  • 上一篇:個人的遊戲是怎麽開發的
  • 下一篇:怎麽修改網卡MAC地址
  • copyright 2024編程學習大全網