java outofmemory是什么,讓我們一起了解一下?
out of memory(內(nèi)存溢出)是一個(gè)程序員常見的錯(cuò)誤類型,通常是開啟應(yīng)用程序過多所導(dǎo)致。一般是由于電腦內(nèi)存不足,配置過低,電腦開啟的應(yīng)用程序過多,導(dǎo)致內(nèi)存不足或者游戲客戶端的問題。
Java中OutOfMemoryError(內(nèi)存溢出)出現(xiàn)的情況和解決辦法是什么?
第一種OutOfMemoryError: PermGenspace。發(fā)生這種問題的原意是程序中使用了大量的jar或class,使java虛擬機(jī)裝載類的空間不夠,與PermanentGeneration space有關(guān)。解決這類問題有以下兩種辦法:?1、增加java虛擬機(jī)中的XX:PermSize和XX:MaxPermSize參數(shù)的大小,其中XX:PermSize是初始永久保存區(qū)域大小,XX:MaxPermSize是最大永久保存區(qū)域大小。如針對(duì)tomcat6.0,在catalina.sh或catalina.bat文件中一系列環(huán)境變量名說明結(jié)束處(大約在70行左右) 增加一行:?JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m" 。如果是windows服務(wù)器還可以在系統(tǒng)環(huán)境變量中設(shè)置。感覺用tomcat發(fā)布sprint+struts+hibernate架構(gòu)的程序時(shí)很容易發(fā)生這種內(nèi)存溢出錯(cuò)誤。2、清理應(yīng)用程序中web-inf/lib下的jar,如果tomcat部署了多個(gè)應(yīng)用,很多應(yīng)用都使用了相同的jar,可以將共同的jar移到tomcat共同的lib下,減少類的重復(fù)加載。這種方法是網(wǎng)上部分人推薦的,我沒試過,但感覺減少不了太大的空間,最靠譜的還是第一種方法。?
第二種OutOfMemoryError:?Java heap space?。發(fā)生這種問題的原因是java虛擬機(jī)創(chuàng)建的對(duì)象太多,在進(jìn)行垃圾回收之間,虛擬機(jī)分配的到堆內(nèi)存空間已經(jīng)用滿了,與Heapspace有關(guān)。解決這類問題有兩種思路:?1、檢查程序,看是否有死循環(huán)或不必要地重復(fù)創(chuàng)建大量對(duì)象。找到原因后,修改程序和算法。?寫一個(gè)使用K-Means文本聚類算法對(duì)幾萬(wàn)條文本記錄(每條記錄的特征向量大約10來個(gè))進(jìn)行文本聚類時(shí),由于程序細(xì)節(jié)上有問題,就導(dǎo)致了Javaheap space的內(nèi)存溢出問題,后來通過修改程序得到了解決。?2、增加Java虛擬機(jī)中Xms(初始堆大小)和Xmx(最大堆大小)參數(shù)的大小。如:set JAVA_OPTS= -Xms256m-Xmx1024m。
實(shí)戰(zhàn)操作,本機(jī)內(nèi)存溢出代碼如下:
package?DirectMemory; import?sun.misc.Unsafe; import?java.lang.reflect.Field; /** ?*?VM?Args:?-Xmx20M?-XX:MaxDirectMemorySize=10M ?*?DirectByteBuffer分配內(nèi)存也會(huì)拋出內(nèi)存溢出異常,但它拋出異常時(shí)沒有真正向系統(tǒng)申請(qǐng)分配內(nèi)存,而是通過計(jì)算得知內(nèi)存 ?*?無法分配,于是手動(dòng)拋出異常。有點(diǎn)類似操作系統(tǒng)的銀行家算法(避免死鎖) ?*/ public?class?DirectMemoryOOM?{ ????private?static?final?int?_1MB?=?1024*1024; ????public?static?void?main(String[]?args)?throws?IllegalAccessException?{ ????????Field?unsafeField?=?Unsafe.class.getDeclaredFields()[0];????????//獲取類中第一個(gè)變量 ????????unsafeField.setAccessible(true);???????????????????????????????//設(shè)置是否可反射訪問private變量 ????????Unsafe?unsafe?=?(Unsafe)?unsafeField.get(null);?????????????//獲取靜態(tài)對(duì)象 ????????while?(true){ ????????????unsafe.allocateMemory(_1MB);????????????????????????????//申請(qǐng)分配內(nèi)存 ????????} ????} }
以上就是小編今天的分享了,希望可以幫助到大家。