1. 程式人生 > >檢測記憶體洩漏的常見工具-LeakCanary

檢測記憶體洩漏的常見工具-LeakCanary

見到這個標題有經驗的開發者可能要吐槽我是標題黨了,特別是從Eclipse時代走過來的開發者,以為我一要開始貼那張像**一樣的MAT記憶體模型圖或者AndroidStudio中Monitors下的實時記憶體佔用圖,又要開始分析那一條條剪不斷理還亂的記憶體引用鏈,然後費盡九牛二虎之力去查詢專案中無數的記憶體洩漏中的一個。但是,我要告訴你,你錯了。其實,以前我看到記憶體洩漏分析文章的時候也是這樣的想法,看著恐怖的MAT記憶體模型圖,覺得記憶體洩漏的排查和解決簡直是Android開發中登峰造極的技能。直到我遇到了她——LeakCanary,我才直到原來記憶體洩漏的排查和解決可以那麼的優雅。LeakCanary

是Square開源了一個記憶體洩露自動探測神器 。這是專案的github倉庫地址:https://github.com/square/leakcanary  。使用非常簡單,在build.gradle中引入包依賴:

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

在Application中的onCreate方法中增加初始化程式碼:

if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for
   // heap analysis.
   // You should not init your app in this process.
   
return;
}
LeakCanary.install(this);

整合後什麼都不用做,按照正常測試,當有記憶體洩漏發生後,應用會通過系統通知欄發出通知,點選通知就可以進入檢視記憶體洩漏的具體資訊。在這裡舉個實踐中的例子。把LeakCanary整合到專案中後,等App啟動後一會,系統通知到了,點選通知,跳轉到洩漏的詳情頁面進行檢視:


很明顯,WebSiteQueryActivity洩露了。首先,static 的MaskHeadView.fLayout變數引用了FrameLayout.mContext物件,這個物件的引用就是指向了WebSiteQueryActivity的例項,導致了它的洩漏,在第二節中我們說過static物件是內部的static物件是比較容易造成記憶體洩漏的,檢查程式碼發現,MaskHeadView直接在WebSiteQueryActivity的xml檔案中使用了,因此持有WebSiteQueryActivity的例項,因為fLayout物件是靜態的,因此它的生命週期與Application同樣長,因此WebSiteQueryActivity退出後,它的例項引用依然被fLayout持有,導致它無法被回收從而記憶體洩露了。仔細檢查程式碼,發現fLayout並沒有被外部使用到,應該是之前的開發者手抖加了個static欄位上去或者是現在不用了,但是沒有去掉,在這裡我直接去掉了這個修飾符,在此build程式碼,這個記憶體洩漏的現象消失了。

//去掉static修飾符,避免static物件引起的記憶體洩漏
private static FrameLayout fLayout;


public
MaskHeadView(Context context, AttributeSet attrs) {
super(context, attrs);
  this
.context=context;
 
initView(context);
}

private void initView(Context context2) {
view = LayoutInflater.from(context).inflate(R.layout.
mask_head_view, this);
 
fLayout=(FrameLayout) view.findViewById(R.id.
mask_container);
}

相關推薦

Android 記憶體洩漏檢查工具LeakCanary原始碼淺析

使用 監控 Activity 洩露 我們經常把 Activity 當作為 Context 物件使用,在不同場合由各種物件引用 Activity。所以,Activity 洩漏是一個重要的需要檢查的記憶體洩漏之一。 public class Exa

檢測記憶體洩漏常見工具-LeakCanary

見到這個標題有經驗的開發者可能要吐槽我是標題黨了,特別是從Eclipse時代走過來的開發者,以為我一要開始貼那張像**一樣的MAT記憶體模型圖或者AndroidStudio中Monitors下的實時記憶體佔用圖,又要開始分析那一條條剪不斷理還亂的記憶體引用鏈,然後費盡九牛

LeakCanary 檢測記憶體洩漏

轉載自:https://academy.realm.io/cn/posts/droidcon-ricau-memory-leaks-leakcanary/ 我們的 App 曾經遇到很多的記憶體洩漏導致 OutOfMemoryError 的崩潰,一些甚至是在生產環境。Square 的 Pierr

為什麼使用LeakCanary檢測記憶體洩漏

為什麼要使用LeakCanary? 不再需要的物件依然被引用,導致物件被分配的記憶體無法被回收,這就是記憶體洩漏的原因。 例如:一個Activity例項物件在呼叫了onDestory方法後是不再被需要的,如果儲存了一個引用Activity物件的靜態域,將導致Ac

linux工具檢測記憶體洩漏-valgrind

0.前言 記憶體洩漏是c++程式常見的問題了,特別是服務類程式,當系統模組過多或者邏輯複雜後,很難通過程式碼看出記憶體洩漏; valgrind是一個開源的,檢測c++程式記憶體洩漏有效工具,編譯時加上-g選項可以定位到程式碼行,同時還檢查‘野指標’,檢查malloc與fre

檢測記憶體洩漏——LeakCanary的使用

<!-- LeakCanary --> <service android:name="com.squareup.leakcanary.internal.HeapAnalyzerService" android:enabled="false" android:process=":leakcan

利用Android中DDMS->Heap工具檢測記憶體洩漏問題

1. 啟動eclipse後,切換到DDMS透檢視,並確認Devices檢視、Heap檢視都是開啟的; 2. 將手機通過USB連結至電腦,連結時需要確認手機是處於“USB除錯”模式,而不是作為“Ma

Android實戰——LeakCanary檢測記憶體洩漏

LeakCanary檢測記憶體洩漏 前言 記憶體洩漏對於初學者們可能是一個陌生的詞語,但是卻頻頻發生於自己的軟體上,只不過自己不知道而已。同理,記憶體溢位也是一個道理。而記憶體洩漏和記憶體溢位常常是面試的考題,所以早點掌握是必不可少的 記憶體洩

Vc 檢測記憶體洩漏

https://docs.microsoft.com/zh-cn/visualstudio/debugger/finding-memory-leaks-using-the-crt-library?view=vs-2017   啟用記憶體洩漏檢測 檢測記憶體洩漏是 C/c + + 偵錯程式和 C

Visual Studio中檢測記憶體洩漏的方法

Visual Studio中檢測記憶體洩漏的方法 #include <iostream> //可以定位到發生記憶體洩露 所在的檔案和具體那一行,用於檢測 malloc 分配的記憶體 #define _CRTDBG_MAP_ALLOC #include <s

Instruments的Leaks檢測記憶體洩漏

一,使用Leaks開啟APP,操作APP; 二,配置Leaks; 在Leaks欄目下選擇Cycles & Roots和Call Tree進行分析; 1,Cycles & Roots; 2,C

VC使用CRT除錯功能檢測記憶體洩漏

轉載自https://www.cnblogs.com/kex1n/archive/2011/04/27/2030753.html 方法一: 檢測記憶體洩漏的基本工具是偵錯程式和CRT除錯堆函式。為了使用除錯堆函式,在你的程式中你必須含有下面的說明: #define _CRTDBG_MAP_A

iOS總結-檢測記憶體洩漏庫-MLeaksFinder原始碼解析

MLeaksFinder是WeRead團隊開源的一款檢測iOS記憶體洩漏的AOP框架。 優點:無侵入性  可以構建洩漏堆疊  有白名單機制  擴充套件性 其他一些特殊處理 主要涉及到的是基類NSObject+MemoryLeak.h類別裡面,- (BOOL)wi

c記憶體洩漏檢查工具---mtrace

    專案中出現記憶體洩漏是讓人很頭疼的事情,使用了vargrind效果不明顯,可能因為試用了libuv裡面有太多非同步處理,導致使用vargrind會出現段錯誤。後來發現mtrace,使用還是挺簡單的。     mtrace是gn

linux valgrind 檢測記憶體洩漏

1.模擬記憶體洩漏的情況 2.編譯程式 g++ -g -o file file.c,一定要加-g 3.安裝valgrind   sudo apt-get install valgrind 4.執行程式valgrind --leak-check

Android記憶體洩漏------常見場景

記憶體管理和引用型別 記憶體洩漏的檢測流程、捕捉以及分析 1、單例造成的記憶體洩露 單例模式是非常常用的設計模式,使用單例模式的類,只會產生一個物件,這個物件看起來像是一直佔用著記憶體,但這並不意味著就是浪費了記憶體,記憶體本來就是拿來裝東西的,只要這個物件一直都被高效的利用就不能叫做洩

檢查C++中的記憶體洩漏-通過工具來檢查

  Visual Leak Detector(VLD)是一款用於Visual C++的免費的記憶體洩露檢測工具,使用者可從下載,該軟體以庫形式與使用者的被測工程一起使用,由於VLD是按LGPL(GNU LESSER GENERAL PUBLIC LICENSE)協議對外開源,

Linux mtrace命令檢測記憶體洩漏

*這篇來學習一下Linux中的一個命令——mtrace,它是怎麼用的呢?一起來看看。。。→_→* 記憶體洩漏程式碼 #include <stdio.h> int main() {

android使用Leaks檢測記憶體洩漏

Leaks 記憶體洩漏檢測工具使用 debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2' releaseCompile 'com.squareup.leakcanary:

使用 Android Studio 檢測記憶體洩漏與解決記憶體洩漏問題

  本文在騰訊技術推文上 修改 釋出。     http://wetest.qq.com/lab/view/63.html?from=ads_test2_qqtips&sessionUserType=BFT.PARAMS.195040.TASKID&ADUIN=913337456&a