編輯:關於Android編程
Android開發中難免會遇到各種內存洩漏,如果不及時發現處理,會導致出現內存越用越大,可能會因為內存洩漏導致出現各種奇怪的crash,甚至可能出現因內存不足而導致APP崩潰。
Android的內存洩漏分析工具常用有Android Studio和基於eclipse的MAT(Memory Analyzer Tool)。通過兩者配合,可以發揮出奇妙的效果。Android Studio能夠快速定位內存洩漏的Activity,MAT能根據已知的Activity快速找出內存洩漏的根源。
我們都知道Java有一個非常強大的垃圾回收機制,會幫我回收無引用的對象,這些無引用的對象不在我們內存洩漏分析的范疇,Android Studio有一個Android Monitors幫助我們進行強制GC,獲取Java Heap文件。
強制GC:點擊Initate GC(1)按鈕,建議點擊後等待幾秒後再次點擊,嘗試多次,讓GC更加充分。然後點擊Dump Java Heap(2)按鈕,然後等到一段時間,生成有點慢。
生成的Java Heap文件會在新建窗口打開。
點擊Analyzer Tasks的Perform Analysis(1)按鈕,然後等待幾秒十幾秒不等,即可找出內存洩漏的Activity(2)。
那麼我們就可以知道內存洩漏的Activity,因為這個例子比較簡單,其實在(3)就已經可以看到問題所在,如果比較復雜的問題Android Studio並不夠直觀,不夠MAT方便,如果Android Studio無法解決我們的問題,就建議使用MAT來分析,所以下一步我們就生成標准的hprof文件,通過MAT來找出洩漏的根源。
剛才生成的Heap文件不是標准的Java Heap,所以MAT無法打開,我們需要轉換成標准的Java Heap文件,這個工具Android Studio就有提供,叫做Captures,右擊選中的hprof,Export to standard .hprof選擇保存的位置,即可生成一個標准的hprof文件。
MAT的下載地址,使用方式和eclipse一樣,這裡就不多說了,打開剛才生成的hprof文件。點擊(1)按鈕打開Histogram。(2)這裡是支持正則表達式,我們直接輸入Activity名稱,點擊enter鍵即可。
搜索到了目標的Activity
右擊搜索出來的類名,選擇Merge Shortest Paths to GC Roots的exclude all phantom/weak/soft etc. references,來到這一步,就可以看到內存洩漏的原因,我們就需要根據內存洩漏的信息集合我們的代碼去分析原因。
使用Handler案例分析,給出的信息是Thread和android.os.Message,這個Thread和Message配合通常是在Handler使用,結合代碼,所以我猜測是Handler導致內存洩漏問題,查看代碼,直接就在函數中定義了一個final的Handler用來定時任務,在Activity的onDestroy後,這個Handler還在不斷地工作,導致Activity無法正常回收。
// 導致內存洩漏的代碼
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
textView = (TextView) findViewById(R.id.text);
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
textView.setText(String.valueOf(timer++));
handler.postDelayed(this, 1000);
}
});
}
修改代碼,避免內存洩漏
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
textView = (TextView) findViewById(R.id.text);
handler.post(new Runnable() {
@Override
public void run() {
textView.setText(String.valueOf(timer++));
if (handler != null) {
handler.postDelayed(this, 1000);
}
}
});
}
private Handler handler = new Handler();
@Override
protected void onDestroy() {
super.onDestroy();
// 避免Handler導致內存洩漏
handler.removeCallbacksAndMessages(null);
handler = null;
}
重新測試,確保問題已經解決。
為什麼要使用Android StudioAndroid Studio是谷歌推出了新的Android開發環境,其重要性可想而知!1. 集成了Gradle 打包工具2. 所見
從本篇博客開始,我們開始分析PKMS的構造函數,看看PKMS到底是如何解析和管理手機中APK的信息的。由於PKMS的構造函數較長,我們會分段進行研究。public Pac
一、Android活動活動是 Android 應用框架中的一個核心組件,它在一個窗口(Window)對象中繪制用戶接口並響應用戶的交互。Android四大核心組件分別為A
Android 平台提供了兩類動畫。 一類是Tween動畫,就是對場景裡的對象不斷的進行圖像變化來產生動畫效果(旋轉、平移、放縮和漸變)。 下面就講一下Tweene An