国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Android內存泄漏產生的6大原因

移動開發 Android
資源性對象比如(Cursor,File文件等)往往都用了一些緩沖,我們在不使用的時候,應該及時關閉它們,以便它們的緩沖及時回收內存。它們的緩沖不僅存在于 java虛擬機內,還存在于java虛擬機外。如果我們僅僅是把它的引用設置為null,而不關閉它們,往往會造成內存泄漏。

 [[179035]]

1.資源對象沒關閉造成的內存泄漏

描述:

資源性對象比如(Cursor,File文件等)往往都用了一些緩沖,我們在不使用的時候,應該及時關閉它們,以便它們的緩沖及時回收內存。它們的緩沖不僅存在于 java虛擬機內,還存在于java虛擬機外。如果我們僅僅是把它的引用設置為null,而不關閉它們,往往會造成內存泄漏。因為有些資源性對象,比如 SQLiteCursor(在析構函數finalize(),如果我們沒有關閉它,它自己會調close()關閉),如果我們沒有關閉它,系統在回收它時也會關閉它,但是這樣的效率太低了。因此對于資源性對象在不使用的時候,應該調用它的close()函數,將其關閉掉,然后才置為null.在我們的程序退出時一定要確保我們的資源性對象已經關閉。

程序中經常會進行查詢數據庫的操作,但是經常會有使用完畢Cursor后沒有關閉的情況。如果我們的查詢結果集比較小,對內存的消耗不容易被發現,只有在常時間大量操作的情況下才會復現內存問題,這樣就會給以后的測試和問題排查帶來困難和風險。

示例代碼:

  1. Cursor cursor = getContentResolver().query(uri...);  
  2.  
  3. if (cursor.moveToNext()) {  
  4.  
  5. ... ...  
  6.  
  7.  

修正示例代碼: 

  1. Cursor cursor = null;  
  2.  
  3. try {  
  4.  
  5. cursor = getContentResolver().query(uri...);  
  6.  
  7. if (cursor != null &&cursor.moveToNext()) {  
  8.  
  9. ... ...  
  10.  
  11. }  
  12.  
  13. } finally {  
  14.  
  15. if (cursor != null) {  
  16.  
  17. try {  
  18.  
  19. cursor.close();  
  20.  
  21. } catch (Exception e) {  
  22.  
  23. //ignore this  
  24.  
  25. }  
  26.  
  27. }  
  28.  
  29.  

2.構造Adapter時,沒有使用緩存的convertView

描述:

以構造ListView的BaseAdapter為例,在BaseAdapter中提供了方法:

public View getView(int position, ViewconvertView, ViewGroup parent)

來向ListView提供每一個item所需要的view對象。初始時ListView會從BaseAdapter中根據當前的屏幕布局實例化一定數量的 view對象,同時ListView會將這些view對象緩存起來。當向上滾動ListView時,原先位于最上面的list item的view對象會被回收,然后被用來構造新出現的最下面的list item。這個構造過程就是由getView()方法完成的,getView()的第二個形參View convertView就是被緩存起來的list item的view對象(初始化時緩存中沒有view對象則convertView是null)。由此可以看出,如果我們不去使用 convertView,而是每次都在getView()中重新實例化一個View對象的話,即浪費資源也浪費時間,也會使得內存占用越來越大。 ListView回收list item的view對象的過程可以查看:

android.widget.AbsListView.java –> voidaddScrapView(View scrap) 方法。

示例代碼:

  1. public View getView(int position, ViewconvertView, ViewGroup parent) {  
  2.  
  3. View view = new Xxx(...);  
  4.  
  5. ... ...  
  6.  
  7. return view;  
  8.  
  9.  

修正示例代碼:

  1. public View getView(int position, ViewconvertView, ViewGroup parent) {  
  2.  
  3. View view = null;  
  4.  
  5. if (convertView != null) {  
  6.  
  7. view = convertView;  
  8.  
  9. populate(view, getItem(position));  
  10.  
  11. ...  
  12.  
  13. else {  
  14.  
  15. view = new Xxx(...);  
  16.  
  17. ...  
  18.  
  19. }  
  20.  
  21. return view;  
  22.  
  23.  

3.Bitmap對象不在使用時調用recycle()釋放內存

描述:

有時我們會手工的操作Bitmap對象,如果一個Bitmap對象比較占內存,當它不在被使用的時候,可以調用Bitmap.recycle()方法回收此對象的像素所占用的內存,但這不是必須的,視情況而定。可以看一下代碼中的注釋:

  1. /**  
  2.  
  3. Free up the memory associated with thisbitmap's pixels, and mark the  
  4.  
  5. •bitmap as "dead", meaning itwill throw an exception if getPixels() or  
  6.  
  7. •setPixels() is called, and will drawnothing. This operation cannot be  
  8.  
  9. •reversed, so it should only be called ifyou are sure there are no  
  10.  
  11. •further uses for the bitmap. This is anadvanced call, and normally need  
  12.  
  13. not be called, since the normal GCprocess will free up this memory when  
  14.  
  15. •there are no more references to thisbitmap.  
  16.  
  17. */  

4.試著使用關于application的context來替代和activity相關的context

這是一個很隱晦的內存泄漏的情況。有一種簡單的方法來避免context相關的內存泄漏。最顯著地一個是避免context逃出他自己的范圍之外。使用Application context。這個context的生存周期和你的應用的生存周期一樣長,而不是取決于activity的生存周期。如果你想保持一個長期生存的對象,并且這個對象需要一個context,記得使用application對象。你可以通過調用 Context.getApplicationContext() or Activity.getApplication()來獲得。更多的請看這篇文章如何避免

5.注冊沒取消造成的內存泄漏

一些Android程序可能引用我們的Anroid程序的對象(比如注冊機制)。即使我們的Android程序已經結束了,但是別的引用程序仍然還有對我們的Android程序的某個對象的引用,泄漏的內存依然不能被垃圾回收。調用registerReceiver后未調用unregisterReceiver。

比如:假設我們希望在鎖屏界面(LockScreen)中,監聽系統中的電話服務以獲取一些信息(如信號強度等),則可以在LockScreen中定義一個 PhoneStateListener的對象,同時將它注冊到TelephonyManager服務中。對于LockScreen對象,當需要顯示鎖屏界面的時候就會創建一個LockScreen對象,而當鎖屏界面消失的時候LockScreen對象就會被釋放掉。

但是如果在釋放 LockScreen對象的時候忘記取消我們之前注冊的PhoneStateListener對象,則會導致LockScreen無法被垃圾回收。如果不斷的使鎖屏界面顯示和消失,則最終會由于大量的LockScreen對象沒有辦法被回收而引起OutOfMemory,使得system_process 進程掛掉。

雖然有些系統程序,它本身好像是可以自動取消注冊的(當然不及時),但是我們還是應該在我們的程序中明確的取消注冊,程序結束時應該把所有的注冊都取消掉。

6.集合中對象沒清理造成的內存泄漏

我們通常把一些對象的引用加入到了集合中,當我們不需要該對象時,并沒有把它的引用從集合中清理掉,這樣這個集合就會越來越大。如果這個集合是static的話,那情況就更嚴重了。

責任編輯:龐桂玉 來源: Android開發中文站
相關推薦

2015-07-16 10:24:37

Facebook延誤

2011-04-14 13:42:23

漏殺病毒木馬

2024-08-05 10:40:58

2013-08-07 10:16:43

Android內存泄漏

2010-09-02 10:52:39

2013-07-03 09:54:54

Android蘋果市場份額

2020-09-11 19:38:31

GitOps倉庫CI

2012-05-14 09:20:18

移動CRM

2017-12-12 13:35:59

Linux慕尼黑放棄原因

2011-03-24 14:25:44

2011-08-27 09:26:03

投影儀技巧

2010-10-14 10:47:33

Android

2018-01-31 08:34:42

2012-04-10 09:44:15

2024-05-14 15:04:04

ChatGPT人工智能大型語言模型

2021-11-05 15:20:07

云配置錯誤云安全數據泄露

2018-08-15 06:52:47

2009-12-22 09:06:10

2021-03-12 10:22:58

數據庫DBaaS云計算

2010-09-26 15:38:33

JVM內存泄漏
點贊
收藏

51CTO技術棧公眾號

伊人久久大香线蕉综合热线| 久久99久久99精品免视看婷婷 | 精品久久中文字幕| 色综合电影网| 99re8精品视频在线观看| 日韩欧美亚洲综合| 噼里啪啦国语在线观看免费版高清版| 国产精品人人爽人人做我的可爱| 91av视频在线免费观看| 黄色美女视频在线观看| 亚洲高清三级视频| 欧美污视频网站| 水蜜桃久久夜色精品一区的特点| 啪一啪鲁一鲁2019在线视频| 2019年精品视频自拍| 欧美一区午夜精品| 日本韩国一区| 亚洲一区二区精品视频| 91av俱乐部| 丁香网亚洲国际| 日本不卡在线播放| 欧美精品午夜| 国产日韩欧美中文| 国内精品久久久久久久影视简单| 久久国产加勒比精品无码| 俺来也官网欧美久久精品| 欧美亚洲国产一区在线观看网站| 免费观看一二区视频网站| 99久久夜色精品国产网站| 一区二区视频在线播放| 美女被久久久| 欧洲精品在线一区| 亚洲免费中文| 精品视频第一区| 欧美先锋影音| 91在线直播亚洲| 99成人在线视频| 国产精品成人播放| 国产精品欧美在线观看| 91a在线视频| 亚洲第一论坛sis| 51ⅴ精品国产91久久久久久| 欧美电影完整版在线观看| 久久免费国产视频| 久久久伦理片| 清纯唯美亚洲激情| 亚洲伊人影院| 97精品久久久| 澳门久久精品| 国产精品黄色影片导航在线观看| 欧美精品中文字幕亚洲专区| 国产一区二区三区四区五区美女| 一本大道久久a久久综合婷婷| 亚洲mv在线| 色国产精品一区在线观看| 137大胆人体在线观看| 日韩一区二区不卡| 制服丝袜在线播放| 日韩激情片免费| 黑人一区二区三区| 欧美激情免费观看| av毛片在线| 亚洲第一区在线| 经典三级一区二区| 中文字幕一区二区精品| 免费欧美网站| 6080yy精品一区二区三区| 欧美日韩激情| 99电影在线观看| 亚洲一区二区三区四区| 精品国产一区二区三区四区在线观看| 日韩精品成人在线观看| 日本a级片电影一区二区| 91九色精品| 日本公妇乱淫免费视频一区三区| 国产69精品久久久久777| 乱子伦视频在线看| 亚洲一区二区三区中文字幕在线| 91在线导航| 在线观看91久久久久久| 日本天堂一区| 成人自拍视频网站| 久久狠狠亚洲综合| 欧美一级黄色影院| 日韩欧中文字幕| 亚洲精品国产精品国产| 久久免费精品日本久久中文字幕| 亚洲欧美色图| 经典三级在线视频| 亚洲嫩草精品久久| yellow91字幕网在线| 欧美精品情趣视频| 综合久久精品| 欧美精品一区二区三区三州| 亚洲综合丝袜美腿| 高清电影在线观看免费| 国内精品久久久久影院优| 国产综合自拍| 日韩欧美亚洲天堂| 欧美影视一区二区三区| 国产精品日本一区二区三区在线| 亚洲最大福利网站| 成人动漫一区二区三区| 中日韩免费毛片| 亚洲午夜精品久久久久久久久久久久| 羞羞视频在线免费看| 国产午夜精品全部视频播放| 99国产精品免费视频观看| 欧美视频在线第一页| 一本到不卡免费一区二区| 亚洲国产综合在线观看| 成人综合电影| 中文字幕av资源一区| 国产鲁鲁视频在线观看特色| 午夜免费日韩视频| 日韩主播视频在线| 毛片毛片毛片毛片毛片毛片| 亚洲欧美另类人妖| 亚洲小说区图片区| 俄罗斯xxxx性全过程| 在线电影av不卡网址| 国产视频一区三区| 国产一级电影网| 日韩最新免费不卡| 青青草国产精品97视觉盛宴| 美女网站在线观看| 欧美激情第一页xxx| 免费一级片91| 三级外国片在线观看视频| 66m—66摸成人免费视频| 韩国三级电影一区二区| 成人免费高清在线播放| 日本国产精品视频| 成人免费高清视频| 国产夫妻在线| 欧美日韩亚洲在线| 欧美性xxxx极品高清hd直播| 国产欧美啪啪| 高清无码视频直接看| 日韩欧美一卡二卡| 你懂的亚洲视频| 亚洲无吗一区二区三区| 国产一区二区日韩| 久久精品免费观看| 成人ww免费完整版在线观看| 91最新在线免费观看| 亚洲制服丝袜一区| 国产伦精品一区二区三区千人斩| 美女网站免费观看视频| 中文在线不卡视频| 国产黄色精品视频| 一区二区精品伦理...| 亚洲欧美综合一区| 亚洲国产91精品在线观看| 视频一区二区国产| av小次郎在线| 日本视频一区二区不卡| 在线不卡免费欧美| 99精品视频免费观看| 成人在线二区| 国产伦视频一区二区三区| 亚洲成年人网站在线观看| 久久av综合| 免费h片在线| 91免费看片网站| 欧美在线短视频| 99国产精品| 欧美性video| 成年人免费观看的视频| 亚洲激情久久久| 国产91丝袜在线播放0| www久久久| 色婷婷亚洲十月十月色天| 欧美在线观看日本一区| 亚洲精品一二三区| 欧美oldwomenvideos| 日本高清视频在线播放| 日本在线播放一区| 国产婷婷97碰碰久久人人蜜臀| 成人免费观看视频| 青青草这里只有精品| 香蕉视频色版| 成人免费在线看片| 亚洲精品一区二区三区在线观看| 理论片日本一区| 欧美三级网址| 色一情一乱一伦一区二区三区日本| 久久久亚洲国产天美传媒修理工| 亚洲一区二区三区三| 欧美色123| 天堂а√在线最新版中文在线| 日批视频在线免费看| 国产精品 欧美在线| 在线观看亚洲精品| 国产精品资源站在线| 成功精品影院| 欧美黄色小说| 国产91av视频在线观看| 77777亚洲午夜久久多人| 欧美最猛黑人xxxxx猛交|