A. android怎樣檢測內存泄漏
生成.hprof文件:插入SD卡(Android機器很多程序都需要插入SD卡),並將設備連接到PC,在Eclipse中的DDMS中選擇要測試的進程,然後點擊Update Heap 和Dump HPROF file兩個Button。
B. Android開發中,有哪些好方法可以檢測內存泄露和性能
下面是回答的內容
內存泄露,是Android開發者最頭疼的事。可能一處小小的內存泄露,都可能是毀於千里之堤的蟻穴。怎麼才能檢測內存泄露呢?網上教程非常多,不過很多都是使用Eclipse檢測的, 其實1.3版本以後的Android Studio 檢測內存非常方便, 如果結合上MAT工具,LeakCanary插件,一切就變得so easy了。
熟悉Android Studio界面工欲善其事,必先利其器。
我們接下來先來熟悉下Android Studio的界面
結果
非獨占時間:某函數佔用的CPU時間,包含內部調用其它函數的CPU時間。
獨占時間:某函數佔用CPU時間,但不含內部調用其它函數所佔用的CPU時間。
我們如何判斷可能有問題的方法?
通過方法的調用次數和獨占時間來查看,通常判斷方法是:
如果方法調用次數不多,但每次調用卻需要花費很長的時間的函數,可能會有問題。
如果自身佔用時間不長,但調用卻非常頻繁的函數也可能會有問題。
綜述
上面給大家介紹了若干使用Android Studio檢查程序性能的工具,工具永遠是輔助,不要因為工具耽誤太長時間。如果有問題,歡迎大家糾正。
C. android手機測試中如何查看內存泄露
如何查看內存泄露
主要有2種方法
藉助工具,查看。
藉助adb 命令來查看。
【主要原理】
藉助工具來查看泄露的原因。
詳細實現方式
【工具查看】
常用工具有很多例如:
1.功能強大PC端檢測工具,如MemoryAnalyzer運行在PC端抓取Android手機中的mp文件進行深度分析。
2.小而優的Android端檢測工具,如LeakCanary隨App一起安裝會在Android手機桌面安裝的內存泄露檢測App
詳細的介紹網路裡面非常多這邊不做過多的介紹。
3.還有一種,要求不高的可以通過android studio查看內存變化等
詳細看到界面,視圖等佔用的內存情況。
【最後】
2種方法相互使用,驗證內存泄露原因。
D. 如何在Android Studio中使用LeakCanary檢測內存泄露
內存泄露檢測是項目性能優化不可避免的問題,只有解決內存泄露問題才能從根本上解決OOM。在Eclipse中提供Mat工具來檢測內存泄露,但是使用較為麻煩,界面也不是很直觀。對於有耐心,有想法的,也是可以嘗試了解一下。知道Leak的出現,為內存泄露檢測帶來了福音。
1.什麼是LeakCanary
LeakCanary
A memory leak detection library for Android and Java.
LeakCanary是一個Android和Java的內存檢測庫。
2.LeakCanary如何展示內存泄露信息
如果項目存在內存泄露,就會在狀態欄或是一個單獨的Leaks程序中顯示內存泄露信息,提供一個造成內存泄露對象的引用路徑
【錯誤2】:但是有的人沒有相應的圖標,怎麼辦?
因為gradle設置錯誤的原因,上述build分別設置了debugCompile 和 releaseCompile,具體的區別這里不細說了,需要有一定的gradle功底,才能改修完成。這里給出的最簡易的方案,適用於該產品在加入的leakCancy僅僅在測試的時候使用,而在release包中手動去除相應的代碼:【解決當前問題,但是不提倡】
1、debug 和 release 引用相同的lib
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
}
2、使用compile 不再1區分debug 和 release12
dependencies {
compile 'com.squareup.leakcanary:leakcanary-android:1.5'
}
如果存在內存泄露,將會顯示內存泄露的對象的引用路徑。
E. 關於如何檢測Android的內存泄漏
用leakcanary三方庫,會自動幫你收集,方便查看
在build.gradle中添加依賴
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.4'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'
在public class App extends Application的onCreate()方法中:
LeakCanary.install(this);
運行應用
具體的位置。特別好用
F. 如何快速定位android app是否存在內存泄露
1、首先確定是否有內存泄露及哪個程序造成。
1.1、內存泄露已彈出out of memory對話框的情況。
這種情況很簡單,直接看對話框就知道是哪個應用的問題了。然後再分析該應用是否是因為內存泄露造成的
out of memory對話框。
》中介紹的各種方法進行分析,確定是否有內存泄露以及是哪個進程造成的內存泄露。
2、生成hprof文件,用MAT進行分析。
生成hprof文件可以在DDMS選中進程點擊窗口左上角的mp hprof file按鈕來直接生成,也可以通過在程序加代碼中來生成代碼2:voidgenerateHprof(){String packageName=getApplicationInfo().packageName;
StringhpFilePath=/data/data/+packageName+/input.hprof;try{//Debug.mpHprofData(/sdcard/input.hprof);Debug.
mpHprofData
(hpFilePath);}catch(IOException e) {//TODOAuto-generated catch block
e.printStackTrace();}}建議使用代碼生成hprof,然後使用《
Android內存泄露利器(hprof篇)》中的工具自動提取多個hprof文件,然後用MAT進行比較分析。在MAT導入.hprof文件以後,
MAT會自動解析並生成報告,點擊
Dominator Tree
,並按Package分組,選擇自己所定義的Package類,比較各個類在不同時期的RetainedHeap
,找出可疑類,然後選擇該類,點右鍵,選中
show retained Set項,參看Retained Heap
的詳細信息,進一步找出嫌疑項。
3、在代碼中查找內存泄露。
根據在MAT找到的內存泄露信息,參照《
Android內存泄漏簡介
》進一步在內存中查找內存泄露的原因並解決。
另外如果代碼很簡單,可以直接參照《
Android內存泄漏簡介
》在內存中查找內存泄露的原因並解決。
G. android 中如何分析內存泄漏
使用eclipse 自帶的 DDMS 工具分析各線程的內存使用情況,如下圖所示
Heap視圖界面會定時刷新,在對應用的不斷的操作過程中就可以看到內存使用的變化。
2.判斷當前進程是否有內存泄漏。
需要注意一個值:VM Heap頁面中部有一個data object選項,即數據對象,也就是我們的程序中大量存在的類類型的對象。
在data object一行中有一列是「Total Size」,其值就是當前進程中所有Java數據對象的內存總量,一般情況下,這個值的大小決定了是否會有內存泄漏。
3可以據下面狀態判斷內存有泄漏:
1) 不斷的操作當前應用,或者重復某一動作,注意觀察data object的Total Size值。
2) 正常情況下Total Size值都會穩定在一個有限的范圍內,也就是說如果程序中的的代碼邏輯良好,沒有創建的對象不被GC機制正常回收的情況,即便不斷的操作生成很多對象,而在虛擬機不斷的進行垃圾回收的過程中,這些對象都被正常回收了,內存使用量會保持在一個比較穩定的水平。
3) 如果代碼中存在對象引用沒有釋放的情況,則data object的Total Size值在每次GC後不會有明顯的回落,隨著操作次數的增多Total Size的值會越來越大。
H. android怎麼查找內存泄漏
1.1、內存泄露已彈出out of memory對話框的情況。
這種情況很簡單,直接看對話框就知道是哪個應用的問題了。然後再分析該應用是否是因為內存泄露造成的out of memory對話框。
1.2、對於有內存泄露,但沒造成彈出out of memory對話框的情況
使用《Android中如何查看內存》中介紹的各種方法進行分析,確定是否有內存泄露以及是哪個進程造成的內存泄露。
2、生成hprof文件,用MAT進行分析。
生成hprof文件可以在DDMS選中進程點擊窗口左上角的"mp hprof file"按鈕來直接生成,也可以通過在程序加代碼中來生成
代碼2:
void generateHprof()
{
String packageName=getApplicationInfo().packageName;
String hpFilePath="/data/data/"+packageName+"/input.hprof";
try {
//Debug.mpHprofData("/sdcard/input.hprof");
Debug.mpHprofData(hpFilePath);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
建議使用代碼生成hprof,然後使用《Android內存泄露利器(hprof篇)》中的工具自動提取多個hprof文件,然後用MAT進行比較分析。
在MAT導入.hprof文件以後,MAT會自動解析並生成報告,點擊Dominator Tree,並按Package分組,選擇自己所定義的Package類,比較各個類在不同時期的Retained Heap,找出可疑類,然後選擇該類,點右鍵,選中show retained Set 項,參看Retained Heap的詳細信息,進一步找出嫌疑項。