亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Java內存泄露問題

系統 2055 0

內存泄露

?

???? ? 所謂內存泄露就是指一個不再被程序使用的對象或變量一直被占據在內存中。 ? java中有垃圾回收機制,它可以保證一對象不再被引用的時候,即對象編程了孤兒的時候,對象將自動被垃圾回收器從內存中清除掉。由于Java 使用有向圖的方式進行垃圾回收管理,可以消除引用循環的問題,例如有兩個對象,相互引用,只要它們和根進程不可達的,那么GC也是可以回收它們的,例如下面的代碼可以看到這種情況的內存回收:

Java代碼 ? ? 收藏代碼
  1. public ? class ?GarbageTest?{??
  2. ??
  3. ???? public ? static ? void ?main(String[]?args)? throws ?IOException?{??
  4. ???????? try ?{??
  5. ????????????gcTest();??
  6. ????????}? catch ?(IOException?e)?{??
  7. ????????????e.printStackTrace();??
  8. ????????}??
  9. ????????System.out.println( "has?exited?gcTest!" );??
  10. ????????System.in.read();??
  11. ????????System.in.read();?????????
  12. ????????System.out.println( "out?begin?gc!" );??????????
  13. ???????? for ( int ?i= 0 ;i< 100 ;i++)??
  14. ????????{??
  15. ????????????System.gc();??
  16. ????????????System.in.read();?????
  17. ????????????System.in.read();?????
  18. ????????}??
  19. ????}??
  20. ??
  21. ???? private ? static ? void ?gcTest()? throws ?IOException?{??
  22. ????????System.in.read();??
  23. ????????System.in.read();?????????
  24. ????????Person?p1?=? new ?Person();??
  25. ????????System.in.read();??
  26. ????????System.in.read();?????????
  27. ????????Person?p2?=? new ?Person();??
  28. ????????p1.setMate(p2);? //p1中包含p2的引用 ??
  29. ????????p2.setMate(p1);? //p2中包含p1的引用 ??
  30. ????????System.out.println( "before?exit?gctest!" );??
  31. ????????System.in.read();??
  32. ????????System.in.read();?????????
  33. ????????System.gc();??
  34. ????????System.out.println( "exit?gctest!" );??
  35. ????}??
  36. ??
  37. ???? private ? static ? class ?Person??
  38. ????{??
  39. ???????? byte []?data?=? new ? byte [ 20000000 ];??
  40. ????????Person?mate?=? null ;??
  41. ???????? public ? void ?setMate(Person?other)??
  42. ????????{??
  43. ????????????mate?=?other;??
  44. ????????}??
  45. ????}??
  46. }??

?????? 當gcTest()方法運行完畢以后,p1和p2對象都變成了垃圾,他們都不會被根對象所找到。關于根對象請參見《 JVM垃圾回收機制總結(2) :基本算法概述 ? 》中的關于“垃圾回收從哪里開始”的討論。

?

Java的內存泄露

?

雖然Java的垃圾回收機制較大程度的降低了內存泄露的可能性,但Java程序員仍然可能會寫出發生內存泄露的代碼。其原因就是一個已經不被使用的短壽命對象被一個長壽命對象(如類的靜態成員對象)引用,這就使得本來要被回收的短壽命對象永遠無法被回收,造成內存泄露。

?

?

內存泄露的典型情況

?

(1) 數據結構造成的短暫內存泄露問題,看下面的代碼

Java代碼 ? ? 收藏代碼
  1. public ? class ?Stack{??
  2. ?????? private ?Object[]?element= new ?Object[ 10 ];??
  3. ?????? private ? int ?size= 0 ;??
  4. ????????
  5. ?????? public ? void ?push(Object?ele){??
  6. ?????????????ensureCapacity();??
  7. ?????????????element[size++]=ele;??
  8. ??????}??
  9. ??
  10. ?????? public ?Object?pop(){??
  11. ????????????? if (size== 0 )? throw ? new ?EmptyStackException();??
  12. ????????????? return ?element[--size];? //短暫造成內存泄露 ??
  13. ??????}??
  14. ??
  15. ?????? private ? void ?ensureCapacity(){??
  16. ????????????? if (element.length==size){??
  17. ?????????????????????Object[]?oldElement=element;??
  18. ?????????????????????element= new ?Object[size* 2 + 1 ];??
  19. ?????????????????????System.arraycopy(oldElement, 0 ,element, 0 ,size);??
  20. ?????????????}??
  21. ??????}??
  22. }??

?????? 上面的代碼每一次pop()的時候,Stack都會彈出一個元素,在沒有加入新元素之前,實際上仍然有一個引用element[x]指向了這個已經彈出的對象,因此GC是不會對其進行垃圾回收的。只有push()新元素的時候使得element[x]=newObject,才會使得以前創建的對象有可能被回收。應該把上面的pop()方法改成下面的代碼就安全多了:

Java代碼 ? ? 收藏代碼
  1. public ?Object?pop(){??
  2. ??????? if (element.length==size)? throws ?EmptyStackException();??
  3. ???????Object?o=element[--size];??
  4. ???????elements[size]= null ;?? //使得GC有機會回收這個對象 ??
  5. ??????? return ?o;??
  6. }??

?

?

Java內存泄露問題


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产在线观看91精品不卡 | 精品久久精品久久 | 日韩亚洲一区中文字幕 | 亚洲妖精天堂 | 国产成人一级片 | 日韩一区在线视频 | 久久国产免费福利永久 | 日韩欧美国产一区二区三区四区 | 亚洲综合精品一区 | 欧美亚洲综合一区 | 免费看日韩欧美一级毛片 | 亚洲一区中文字幕在线观看 | 久久国产精品一国产精品 | 九九精品视频在线免费观看 | 国产成人 免费观看 | 国产免费一级高清淫日本片 | 成人在线播放 | 毛片在线免费视频 | 在线观看国产一区二区三区 | 国产手机在线视频放线视频 | 久久夜色精品国产尤物 | 日韩在线观看中文字幕 | 亚洲图片另类图片 | 亚洲欧美日韩中文字幕在线一 | 午夜免费福利视频 | 日本精品一区二区三区在线 | 亚洲另类精品综合 | 亚洲欧美日韩国产精品影院 | 夜色伊人 | 久久久久青草大香线综合精品 | 国产精品一级 | 亚洲视频福利 | 91精品国产闺蜜国产在线 | 亚洲伦理网站 | 国产h片在线观看 | 末成年娇小性色xxxxx视频 | 国产成人精品曰本亚洲78 | 99久久精品国产片 | 可以免费观看一级毛片黄a 可以直接看的毛片 | 久久亚洲欧美成人精品 | 亚洲日本一区二区三区 |