Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android內存分析工具

Android內存分析工具

編輯:關於Android編程

Android的一些內存知識

垃圾回收(GC)

垃圾回收包含兩個過程:

判定階段,也就是判斷哪些對象可以被回收, 收集階段,是指具體的回收策略。

判定階段主要有兩種方式

引用計數,對象每多一個引用計數加1,少一個引用計數減1,計數為0時就表示這個對象可以被回收了。但是引用計數有個缺點,不能判斷循環應用的情況,所以就有了下面的方式 根搜索,從一些根對象(GCRoot)開始遍歷搜索,如果一個對象無法被搜索到,說明這個對象可以被回收了。
可以作為GCRoot的對象:
1 一些虛擬機棧中的對象;2 方法區中的類靜態屬性對象;3 方法區中的常量對象;4 Native棧中JNI的引用對象

收集階段主要有四種方式

標記清除,最簡單的算法,講標記好的對象直接清除,速度快,但效率不高,內存碎片 復制算法,每次使用可用內存的一半,收集時將可用對象復制到另一半內存,回收這一半 標記整理,將存活對象整理到內存區域的一端,剩余部分回收 分代回收,將內存區域按對象存活周期劃分為青年代和老年代等,不同區域采用上面不同的收集算法。

Dalvik與ART

Android5.0 之前使用Dalvik虛擬機,之後使用ART虛擬機,下面是一些比較:

Dalvik在運行時將字節碼轉換為機器碼,ART在安裝的時候就轉換為機器碼,這樣安裝好的應用會占用更大的空間,但是運行時少了轉換的時間,所以運行更快 ART提供了更好的垃圾回收表現,將垃圾回收時,程序的暫停次數由兩次(分析、清理)減少到一次;程序暫停時,並行的進行垃圾回收處理;回收新近分配的、生命期短的對象,垃圾回收器花費的時間更少

Android內存分析工具

## Memory Monitor GC操作需要暫停其他線程,因此短時間頻繁的GC會對UI線程產生影響,導致頻繁GC一般有兩種情況, - 大量的對象被創建又在短時間內馬上被釋放,比如在View的onDraw方法中創建對象 - Young Generation的內存區域達到閥值,剩余空間不夠的時候,也會觸發頻繁GC Android Studio提供了Memory Monitor來實時顯示應用運行時內存占用情況,下邊藍色部分是現在占用的內存,上面灰色的部分顯示是已回收的內存。如果在圖上看到尖峰,也就是快速分配內存又被回收,也就是發生了內存抖動,這裡就是需要優化的地方。

 

 

Allocation Tracking

Allocation Tracking是DDMS中提供內存工具,用來顯示一段時間內的內存分配情況。

選擇要跟蹤的進程名,點擊Start Tracking開始跟蹤,做一些操作後點擊Get Allocations就可以將這段操作中新分配的對象顯示出來,點擊具體的對象可以在下面看到是哪一個方法分配的這個對象。

Heap Tool 與 MAT

Heap Tool可以查看當前的內存快照

從數據裡可以看到當前內存的占用和回收情況,每次垃圾回收這裡的數據都會更新,因為會不斷獲取內存數據刷新顯示,所以這時候對應用操作會出現卡頓。
Heap Tool提供的是一個內存的總體情況,圖表顯示的內容比較簡單,如果要具體分析的話最好生成.hprof文件,使用MAT工具進行分析。

關於MAT工具的使用已經有很多介紹,google官方曾經寫過一個使用介紹http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html,推薦一個中文博客,
http://blog.csdn.net/guolin_blog/article/details/42238633,寫的很好。

一般用到MAT工具分析內存都是因為發生了應用發生了內存洩漏,需要自己去分析可能洩漏的地方,然後用MAT工具去驗證。而最近Square公司開源了一個內存洩漏檢測項目LeakCanary,極大地簡化了這個過程,可以說是Android內存洩漏檢測的終極利器。

LeakCanary

A memory leak detection library for Android and Java.
項目地址:https://github.com/square/leakcanary

LeakCanary

LeakCanary會檢測應用的內存回收情況,如果發現有垃圾對象沒有被回收,就會去分析當前的內存快照,也就是上邊MAT用到的.hprof文件,找到對象的引用鏈,並顯示在頁面上。

使用:
在build.gradle文件中添加

 dependencies {
   debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
   releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
 }

在應用的Application onCreate方法中添加LeakCanary.install(this),如下

public class ExampleApplication extends Application {

  @Override public void onCreate() {
    super.onCreate();
    LeakCanary.install(this);
  }
}

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved