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

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條評論
主站蜘蛛池模板: 欧美色老太婆 | 国产乱子伦一级毛片 | 亚洲精品色 | 久久99热这里只有精品国产 | 国产精品视频一区国模私拍 | 色综合伊人色综合网亚洲欧洲 | 99久久精品自在自看国产 | 四虎成人影院网址 | 国产小视频91 | 一区二区午夜 | 久re这里只有精品最新地址 | 欧美在线一 | 国产香蕉久久精品综合网 | 日日噜噜夜夜狠狠视频无 | 日本不卡免费新一区二区三区 | a黄毛片| 久久亚洲免费视频 | 免费毛片一级 | 伊人久久国产免费观看视频 | 国产成人精品男人的天堂网站 | 色姑娘综合网 | 大片在线播放日本一级毛片 | 日韩天天摸天天澡天天爽视频 | 四虎国产精品免费视 | 精品久久久久久久一区二区伦理 | 99精品欧美一区二区三区 | 国产青青久久 | 欧美成人精品一级高清片 | 在线日韩国产 | 国产在线视频h | 四虎影视在线影院在线观看观看 | 51精品视频在线一区二区 | 亚洲在线视频观看 | 狠狠色婷婷狠狠狠亚洲综合 | 天天草夜夜爽 | 香蕉网站狼人久久五月亭亭 | 天天狠狠色噜噜 | 色爱区综合激情五月综合激情 | 成人网视频 | 亚洲欧美在线看 | 亚洲视频在线播放 |