自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

內(nèi)存不夠用?講講Android開(kāi)發(fā)超常見(jiàn)的內(nèi)存泄露以及解決

移動(dòng)開(kāi)發(fā)
有沒(méi)有感覺(jué)自己的Android手機(jī)開(kāi)機(jī)之后,可用內(nèi)存不斷減少,很大一部分原因就是因?yàn)閮?nèi)存泄露了,這部分泄露的內(nèi)存無(wú)法被回收,所以可用內(nèi)存越來(lái)越少。發(fā)生了內(nèi)存泄漏的問(wèn)題,該怎么解決呢?

[[140732]]

有沒(méi)有感覺(jué)自己的Android手機(jī)開(kāi)機(jī)之后,可用內(nèi)存不斷減少,很大一部分原因就是因?yàn)閮?nèi)存泄露了,這部分泄露的內(nèi)存無(wú)法被回收,所以可用內(nèi)存越來(lái)越少;

什么是內(nèi)存泄露?GC無(wú)法回收原本應(yīng)該被回收的對(duì)象,這個(gè)對(duì)象就引發(fā)了內(nèi)存泄露

1.Bitmap使用完忘記回收,因?yàn)閎itmap實(shí)現(xiàn)部分是通過(guò)JNI調(diào)用了Native方法,GC機(jī)制無(wú)法正常回收 Bitmap申請(qǐng)的這部分內(nèi)存空間(API10之前是這樣的,之后分配在Heap中,不過(guò)為了兼容老版本...顯示的調(diào)用一下recycled,也能讓GC更快的回收調(diào)自己);

那Bitmap應(yīng)該怎樣回收呢?

  1. // bitmap!=null要放在前面,如果bitmap為空再去調(diào)用isRecycled方法便會(huì)報(bào)錯(cuò) 
  2.  
  3. if(bitmap!=null&&!bitmap.isRecycled){ 
  4.  
  5.       bitmap.recycled(); //回收bitmap 
  6.  
  7.       bitmap = null;      //使bitmap對(duì)象變?yōu)樘撘玫臓顟B(tài),讓GC更快的回收 
  8.  

接下來(lái),講兩個(gè)更為常見(jiàn)的內(nèi)存泄露,大家根據(jù)這兩個(gè)可以自行擴(kuò)展

  1. btn_hint.setOnClickListener(new View.OnClickListener() { 
  2.  
  3. @Override 
  4.  
  5.     public void onClick(View v) { 
  6.  
  7.         Toast.makeText(MainActivity.this"Hello", Toast.LENGTH_SHORT).show(); 
  8.  
  9.    } 
  10.  
  11. }); 

是不是很常見(jiàn),平時(shí)可能也是這樣寫(xiě)的(將其封裝意義一樣,只要引用了當(dāng)前activity),你可能想問(wèn),這里有什么問(wèn)題嗎?

問(wèn)題在于如果用戶(hù)在Toast消失之前,用戶(hù)按了返回鍵,這個(gè)Activity就引起了內(nèi)存泄露,

原因? Toast持有了當(dāng)前Activity,導(dǎo)致Activity無(wú)法被GC銷(xiāo)毀

解決方法:讓Toast持有ApplicationContext;其實(shí)只要不是Layout,Context都可以使用ApplicationContext;

順便講個(gè)小技巧:在非Activity中,正常是不能直接getContext來(lái)拿到Context的,獲取資源有需要靠Context,這時(shí)可以考慮在自己的Application中維護(hù)一個(gè)全局的Context,供無(wú)法直接拿到Context的類(lèi)使用,省的參數(shù)傳來(lái)傳去(視圖相關(guān)的不建議使用ApplicationContext)

 

  1. private static Context mContext; 
  2.  
  3. public static MyApplication getInstance() { //供外界調(diào)用... 
  4.  
  5.      return mApplication; 
  6.  
  7.  
  8. @Override 
  9.  
  10. public void onCreate() { 
  11.  
  12.     super.onCreate();  
  13.  
  14.     mContext = getApplicationContext();    
  15.  

另一個(gè)常見(jiàn)的...內(nèi)存泄露

  1. new Thread() { 
  2.  
  3.     public void run() { 
  4.  
  5.     //網(wǎng)絡(luò)請(qǐng)求 
  6.  
  7.     }; 
  8.  
  9. }.start(); 

這里也有問(wèn)題?你tm逗我?

在Activity中 新建一個(gè)線(xiàn)程,進(jìn)行網(wǎng)絡(luò)請(qǐng)求,如果線(xiàn)程未結(jié)束,用戶(hù)按了返回鍵,同樣內(nèi)存泄露

原因:該Thread是匿名內(nèi)部類(lèi),所以會(huì)隱式的持有外部類(lèi)(這里也就是Activity)

解決方式:多種多樣; 不使用匿名內(nèi)部類(lèi),或者整個(gè)應(yīng)用維護(hù)一個(gè)線(xiàn)程池,或者維護(hù)一個(gè)線(xiàn)程隊(duì)列,后兩種都是讓線(xiàn)程不依賴(lài)于Activity從而達(dá)到避免內(nèi)存泄露的目的;

資源獲取等等很多地方都需要用到Context,很多地方都會(huì)用到匿名內(nèi)部類(lèi),這也就導(dǎo)致了這里存在很大的內(nèi)存泄露隱患,但平時(shí)很多小伙伴可能還沒(méi)有注意到,希望這篇文章能給你一些啟發(fā)。

責(zé)任編輯:倪明
相關(guān)推薦

2021-03-15 23:11:12

內(nèi)存虛擬化技術(shù)

2013-06-14 13:27:36

內(nèi)存Linux交換分區(qū)

2023-05-17 07:28:18

電腦16GB內(nèi)存

2024-08-05 11:08:53

內(nèi)存File項(xiàng)目

2019-07-24 14:05:17

Redis內(nèi)存集群

2019-07-25 15:23:05

Redis電腦數(shù)據(jù)庫(kù)

2019-11-15 10:41:10

Vim分屏終端

2011-06-16 10:27:55

.NET內(nèi)存泄漏

2013-05-02 09:16:16

程序員

2013-12-19 10:08:52

AWS服務(wù)器

2023-06-12 07:20:39

2016-11-25 15:03:33

FacebookWIFI

2024-07-25 12:33:45

2010-08-10 10:10:34

Flex內(nèi)存泄露

2013-10-23 14:28:30

2017-03-23 11:24:26

Windows 10Windows系統(tǒng)盤(pán)

2018-11-22 14:34:01

局域網(wǎng)IP擴(kuò)容

2021-08-08 08:17:45

事件響應(yīng)日志網(wǎng)絡(luò)安全

2015-05-14 15:38:40

javajava內(nèi)存泄露
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)