Java常见的几种内存溢出及解决方法
生活随笔
收集整理的這篇文章主要介紹了
Java常见的几种内存溢出及解决方法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Java常見的幾種內(nèi)存溢出及解決方法【情況一】:
java.lang.OutOfMemoryError:Javaheapspace:這種是java堆內(nèi)存不夠,一個原因是真不夠(如遞歸的層數(shù)太多等),另一個原因是程序中有死循環(huán);
如果是java堆內(nèi)存不夠的話,可以通過調(diào)整JVM下面的配置來解決:
-Xms3062m
-Xmx3062m
【情況二】
java.lang.OutOfMemoryError:GCoverheadlimitexceeded
【解釋】:JDK6新增錯誤類型,當(dāng)GC為釋放很小空間占用大量時(shí)間時(shí)拋出;一般是因?yàn)槎烟?#xff0c;導(dǎo)致異常的原因,沒有足夠的內(nèi)存。
【解決方案】:
1、查看系統(tǒng)是否有使用大內(nèi)存的代碼或死循環(huán);
2、通過添加JVM配置,來限制使用內(nèi)存:
-XX:-UseGCOverheadLimit
【情況三】:
java.lang.OutOfMemoryError:PermGenspace:這種是P區(qū)內(nèi)存不夠,可通過調(diào)整JVM的配置:
-XX:MaxPermSize=128m
-XXermSize=128m
【注】:
JVM的Perm區(qū)主要用于存放Class和Meta信息的,Class在被Loader時(shí)就會被放到PermGenspace,這個區(qū)域成為年老代,GC在主程序運(yùn)行期間不會對年老區(qū)進(jìn)行清理,默認(rèn)是64M大小,當(dāng)程序需要加載的對象比較多時(shí),超過64M就會報(bào)這部分內(nèi)存溢出了,需要加大內(nèi)存分配,一般128m足夠。
【情況四】:
java.lang.OutOfMemoryError:Directbuffermemory
調(diào)整-XX:MaxDirectMemorySize=參數(shù),如添加JVM配置:
-XX:MaxDirectMemorySize=128m
【情況五】:
java.lang.OutOfMemoryError:unabletocreatenewnativethread
【原因】:Stack空間不足以創(chuàng)建額外的線程,要么是創(chuàng)建的線程過多,要么是Stack空間確實(shí)小了。
【解決】:由于JVM沒有提供參數(shù)設(shè)置總的stack空間大小,但可以設(shè)置單個線程棧的大小;而系統(tǒng)的用戶空間一共是3G,除了Text/Data/BSS/MemoryMapping幾個段之外,Heap和Stack空間的總量有限,是此消彼長的。因此遇到這個錯誤,可以通過兩個途徑解決:1.通過-Xss啟動參數(shù)減少單個線程棧大小,這樣便能開更多線程(當(dāng)然不能太小,太小會出現(xiàn)StackOverflowError);2.通過-Xms-Xmx兩參數(shù)減少Heap大小,將內(nèi)存讓給Stack(前提是保證Heap空間夠用)。
【情況六】:
java.lang.StackOverflowError
【原因】:這也內(nèi)存溢出錯誤的一種,即線程棧的溢出,要么是方法調(diào)用層次過多(比如存在無限遞歸調(diào)用),要么是線程棧太小。
【解決】:優(yōu)化程序設(shè)計(jì),減少方法調(diào)用層次;調(diào)整-Xss參數(shù)增加線程棧大小。
java.lang.OutOfMemoryError:Javaheapspace:這種是java堆內(nèi)存不夠,一個原因是真不夠(如遞歸的層數(shù)太多等),另一個原因是程序中有死循環(huán);
如果是java堆內(nèi)存不夠的話,可以通過調(diào)整JVM下面的配置來解決:
-Xms3062m
-Xmx3062m
【情況二】
java.lang.OutOfMemoryError:GCoverheadlimitexceeded
【解釋】:JDK6新增錯誤類型,當(dāng)GC為釋放很小空間占用大量時(shí)間時(shí)拋出;一般是因?yàn)槎烟?#xff0c;導(dǎo)致異常的原因,沒有足夠的內(nèi)存。
【解決方案】:
1、查看系統(tǒng)是否有使用大內(nèi)存的代碼或死循環(huán);
2、通過添加JVM配置,來限制使用內(nèi)存:
-XX:-UseGCOverheadLimit
【情況三】:
java.lang.OutOfMemoryError:PermGenspace:這種是P區(qū)內(nèi)存不夠,可通過調(diào)整JVM的配置:
-XX:MaxPermSize=128m
-XXermSize=128m
【注】:
JVM的Perm區(qū)主要用于存放Class和Meta信息的,Class在被Loader時(shí)就會被放到PermGenspace,這個區(qū)域成為年老代,GC在主程序運(yùn)行期間不會對年老區(qū)進(jìn)行清理,默認(rèn)是64M大小,當(dāng)程序需要加載的對象比較多時(shí),超過64M就會報(bào)這部分內(nèi)存溢出了,需要加大內(nèi)存分配,一般128m足夠。
【情況四】:
java.lang.OutOfMemoryError:Directbuffermemory
調(diào)整-XX:MaxDirectMemorySize=參數(shù),如添加JVM配置:
-XX:MaxDirectMemorySize=128m
【情況五】:
java.lang.OutOfMemoryError:unabletocreatenewnativethread
【原因】:Stack空間不足以創(chuàng)建額外的線程,要么是創(chuàng)建的線程過多,要么是Stack空間確實(shí)小了。
【解決】:由于JVM沒有提供參數(shù)設(shè)置總的stack空間大小,但可以設(shè)置單個線程棧的大小;而系統(tǒng)的用戶空間一共是3G,除了Text/Data/BSS/MemoryMapping幾個段之外,Heap和Stack空間的總量有限,是此消彼長的。因此遇到這個錯誤,可以通過兩個途徑解決:1.通過-Xss啟動參數(shù)減少單個線程棧大小,這樣便能開更多線程(當(dāng)然不能太小,太小會出現(xiàn)StackOverflowError);2.通過-Xms-Xmx兩參數(shù)減少Heap大小,將內(nèi)存讓給Stack(前提是保證Heap空間夠用)。
【情況六】:
java.lang.StackOverflowError
【原因】:這也內(nèi)存溢出錯誤的一種,即線程棧的溢出,要么是方法調(diào)用層次過多(比如存在無限遞歸調(diào)用),要么是線程棧太小。
【解決】:優(yōu)化程序設(shè)計(jì),減少方法調(diào)用層次;調(diào)整-Xss參數(shù)增加線程棧大小。
總結(jié)
以上是生活随笔為你收集整理的Java常见的几种内存溢出及解决方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JDK内置工具使用
- 下一篇: Java编写代理服务器(Burp拦截De