成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android App 內存泄漏檢查工具MAT

移動開發 Android
Android App發生內存泄漏,常見的有Bitmap 使用后沒有recycle(),Drawable 使用后沒有setCallback(null)等。

Eclipse 有個插件工具MAT(Memory Analyzer Tool)可以幫助定位內存泄漏的對象。

  1. 安裝MAT Update site: http://archive.eclipse.org/mat/1.1/update-site/
  2. 用DDMS工具Dump出問題App的.hprof文件 比如com.world.test2.hprof Dump之前最好先運行一下GC "Cause GC" , 確保dump出來的是還不能回收的對象等。
  3. 用SDK tools下工具hprof-conv.exe 做轉換 hprof-conv com.world.test2.hprof appleak.hprof
  4. 用Eclipse “Open Head Dump”打開新轉換的.hprof 文件--appleak.hprof 查看圖形化界面,一個一個檢查懷疑的點。

總結: MAT tool不會直接告訴你哪里內存泄漏,但是會列出懷疑的對象,需要你仔細檢查這些對象為什么沒有被釋放掉。

下面是測試code, 在Android 4.2.2上測試過。 1. 此種情況可以引起Activity無法回收的情況,因為直接用類似private static Activity a0引用創建的Activity,導致Activity無法回收。 2. 此種情況沒有引起Activity 無法回收的情況。 按理說這種情況應該也會導致靜態Drawable 鎖定Activity, 引用關系mBackground1-->Button-->Activity. 待分析

  1. public class MainActivity extends Activity implements Button.OnClickListener{   
  2.  
  3.     
  4.  
  5.  final private static String TAG = "MainActivity";   
  6.  
  7.     
  8.  
  9.  private static Drawable mBackground1;   
  10.  
  11.  private static Drawable mBackground2;   
  12.  
  13.  private static Drawable mBackground3;   
  14.  
  15.  private static Drawable mBackground4;   
  16.  
  17.      
  18.  
  19.  private static Activity  a0 ;   
  20.  
  21.  private static Activity  a1 ;   
  22.  
  23.  private static Activity  a2 ;   
  24.  
  25.  private static Activity  a3 ;   
  26.  
  27.  private static Activity  a4 ;   
  28.  
  29.      
  30.  
  31.    
  32.  
  33.  /*   
  34.  
  35.   * Shutdown intent   
  36.  
  37.  */  
  38.  
  39.  private final String INTENT_ACTION_REQUEST_SHUTDOWN =   
  40.  
  41.      "android.intent.action.ACTION_REQUEST_SHUTDOWN";   
  42.  
  43.      
  44.  
  45.  @Override  
  46.  
  47.  public void onCreate(Bundle savedInstanceState) {   
  48.  
  49.      Log.v(TAG, "onCreate  Activity="+this);   
  50.  
  51.     super.onCreate(savedInstanceState);   
  52.  
  53.      setContentView(R.layout.activity_main);   
  54.  
  55.      
  56.  
  57.      //1   
  58.  
  59.     if(false){   
  60.  
  61.      if(a0 == null){   
  62.  
  63.         a0 = this;   
  64.  
  65.         Log.v(TAG, "onCreate  Activity a0="+a0);   
  66.  
  67.      }   
  68.  
  69.      else if(a1 == null){   
  70.  
  71.         a1 = this;   
  72.  
  73.          Log.v(TAG, "onCreate  Activity a1="+a1);   
  74.  
  75.      }   
  76.  
  77.      else if(a2 == null){   
  78.  
  79.         a2 = this;   
  80.  
  81.          Log.v(TAG, "onCreate  Activity a2="+a2);   
  82.  
  83.      }   
  84.  
  85.      else if(a3 == null){   
  86.  
  87.          a3 = this;   
  88.  
  89.          Log.v(TAG, "onCreate  Activity a3="+a3);   
  90.  
  91.     }   
  92.  
  93.   else if(a4 == null){   
  94.  
  95.         a4 = this;   
  96.  
  97.         Log.v(TAG, "onCreate  Activity a4="+a4);   
  98.  
  99.      }   
  100.  
  101.      }   
  102.  
  103.     
  104.  
  105.     
  106.  
  107.     //set up button listener   
  108.  
  109.      Button myButton = (Button)findViewById(R.id.button_poweroff);   
  110.  
  111.     myButton.setOnClickListener(this);   
  112.  
  113.     
  114.  
  115.     
  116.  
  117.     myButton = (Button)findViewById(R.id.button_reboot);   
  118.  
  119.      myButton.setOnClickListener(this);   
  120.  
  121.      
  122.  
  123.      //2   
  124.  
  125.     if (mBackground1 == null) {     
  126.  
  127.         Log.v(TAG, "onCreate  mBackground1");   
  128.  
  129.          mBackground1 = getResources().getDrawable(R.drawable.adbroot_004);     
  130.  
  131.          myButton.setBackgroundDrawable(mBackground1);   
  132.     }   
  133.  
  134.     else if(mBackground2 == null){   
  135.  
  136.          Log.v(TAG, "onCreate  mBackground2");   
  137.  
  138.         mBackground2 = getResources().getDrawable(R.drawable.test002);   
  139.  
  140.         myButton.setBackgroundDrawable(mBackground2);   
  141.  
  142.     }   
  143.  
  144.      else if(mBackground3 == null){   
  145.  
  146.         Log.v(TAG, "onCreate  mBackground3");   
  147.  
  148.          mBackground3 = getResources().getDrawable(R.drawable.test003);   
  149.  
  150.          myButton.setBackgroundDrawable(mBackground3);   
  151.  
  152.     }   
  153.  
  154.     else if(mBackground4 == null){   
  155.  
  156.         Log.v(TAG, "onCreate  mBackground4");   
  157.  
  158.         mBackground4 = getResources().getDrawable(R.drawable.adbroot_003);   
  159.  
  160.          myButton.setBackgroundDrawable(mBackground4);   
  161.  
  162.      }   
  163.  
  164.     
  165.  
  166.    
  167.  
  168.   
  169.  
  170.  }  

 

責任編輯:張葉青 來源: 開源社區
相關推薦

2011-08-15 10:16:55

內存泄露

2024-07-03 11:28:15

2011-08-19 14:27:29

iPhone開發

2013-12-17 15:46:04

iOS開發iOS 內存泄漏

2015-04-17 10:35:51

c++c++程序內存泄漏檢測代碼

2021-03-26 05:59:10

內存檢測工具

2014-07-03 09:39:34

Java內存分析mat工具

2025-03-03 00:00:00

2017-09-07 16:52:23

2023-10-31 16:40:38

LeakCanary內存泄漏

2024-04-19 08:00:00

2016-03-21 10:31:25

Android內存泄露

2016-12-22 17:21:11

Android性能優化內存泄漏

2013-08-07 10:16:43

Android內存泄漏

2016-07-05 14:09:02

AndroidJAVA內存

2014-07-30 14:22:41

AndroidWebView內存泄漏

2011-06-01 12:50:41

Android 內存

2022-09-15 20:04:14

MemlabJavaScrip內存

2024-03-11 08:22:40

Java內存泄漏

2023-12-18 10:45:23

內存泄漏計算機服務器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美中文 | 欧美一区二区在线观看 | 91精品国产一二三 | 日韩一区二区在线看 | 欧美精品一区二区三区在线播放 | 国产精品一区二区av | 一区二区视频 | 国产成人在线播放 | 成人在线精品 | 欧美激情精品久久久久久免费 | 爱爱小视频 | 国产综合网址 | 欧美成人h版在线观看 | 福利社午夜影院 | 久久国产区 | 一级黄色片毛片 | 免费观看一级特黄欧美大片 | 久久av一区二区三区 | 亚洲日韩中文字幕一区 | 91大神新作在线观看 | 美女人人操 | 国产美女一区二区三区 | 2020天天操| 日本一区二区在线视频 | 人人性人人性碰国产 | 在线观看av不卡 | 欧美一区在线视频 | 国产精品欧美一区二区三区不卡 | www.久久99| 天天干天天操天天射 | 91资源在线| 久久小视频 | 99精品欧美一区二区三区综合在线 | 蜜桃臀av一区二区三区 | 日韩午夜一区二区三区 | 亚洲一区在线播放 | 天天色天天色 | 欧美日韩成人在线 | 91亚洲精品在线 | 青青久久av北条麻妃海外网 | 欧美一级淫片007 |