資源描述:
《java內(nèi)存泄露模擬及分析解決方法》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、e-mail:derwee@qq.comderweeJava內(nèi)存泄露模擬及分析解決方法1.1實(shí)踐目標(biāo):1、使用JAVA代碼實(shí)現(xiàn)模擬內(nèi)存溢出2、分析JDK內(nèi)存溢出的原因3、總結(jié)存在bug的JAVA編碼實(shí)踐4、總結(jié)JVM優(yōu)化的方法1.2模擬內(nèi)存溢出:為了方便模擬內(nèi)存,特意把JVM的內(nèi)存參數(shù)指定為更?。ㄎ业谋颈緝?nèi)存是8G的)。修改eclipse參數(shù)文件eclipse.ini調(diào)用JVM參數(shù):-vmargs-Xms40m(原始是-Xms40m)-Xmx100m(原始是-Xmx384m)演示JAVA小程序?qū)崿F(xiàn)原理:使用集合類對(duì)象裝載大量的Persion對(duì)象,每次把new出來的對(duì)
2、象加入集合類對(duì)象后,更改對(duì)象的屬性,再從集合類對(duì)象中刪除該對(duì)象。會(huì)出現(xiàn)該刪除的對(duì)象沒有被刪掉,Persion類對(duì)象不斷占用內(nèi)存,導(dǎo)致分配給JVM的內(nèi)存被耗光。packagecom.derwee.collection.memory;importjava.util.*;/****@ClassName:OutOfMemory*@Description:內(nèi)存溢出模擬,提出解決方法*@authoryangdw*@date2012-3-25下午6:58:49*/publicclassOutOfMemory{publicstaticvoidmain(String[]args){C
3、ollectioncollection=newHashSet();for(inti=0;i<900000000;i++){Persionper=newPersion(i,"yangdw");collection.add(per);//把new出來的對(duì)象加到集合里去per.setName("hundsun");//把剛new出來的對(duì)象的名字改為hundsuncollection.remove(per);//把剛加到集合里的對(duì)象刪除//System.gc();//手工調(diào)用垃圾回收器System.out.println("請(qǐng)注意,現(xiàn)在集合對(duì)有persion對(duì)象數(shù)--"+c
4、ollection.size());}}}packagecom.derwee.collection.memory;/****@ClassName:Persion*@Description:TODO(這里用一句話描述這個(gè)類的作用)*@authoryangdw*@date2012-3-25下午8:16:54**/publicclassPersion{publicPersion(intid,Stringname){super();this.id=id;this.name=name;}privateintid;privateStringname;publicintgetId
5、(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+id;result=prime*result+((name==null)?0:name.hashCode());returnresult;}@Overridep
6、ublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null)returnfalse;if(getClass()!=obj.getClass())returnfalse;Persionother=(Persion)obj;if(id!=other.id)returnfalse;if(name==null){if(other.name!=null)returnfalse;}elseif(!name.equals(other.name))returnfalse;returntrue;}}使用JDK監(jiān)
7、控程序進(jìn)行監(jiān)控JDK內(nèi)存,線程情況。模擬程序沒有運(yùn)行前的JDK內(nèi)存使用情況:運(yùn)行JAVA模擬程序后出現(xiàn):內(nèi)存溢出錯(cuò)誤:Exceptioninthread"main"java.lang.OutOfMemoryError:Javaheapspaceatjava.util.HashMap.resize(HashMap.java:462)atjava.util.HashMap.addEntry(HashMap.java:755)atjava.util.HashMap.put(HashMap.java:385)atjava.util.HashSet.add(HashSet