內存泄露從入門到精通三部曲之排查方法篇

最原始的內存泄露測試

重復多次操作關鍵的可疑的路徑,從內存監控工具中觀察內存曲線,是否存在不斷上升的趨勢且不會在程序返回時明顯回落。
這種方式可以發現最基本,也是最明顯的內存泄露問題,對用戶價值最大,操作難度小,性價比極高。


MAT內存分析工具

2.1 MAT分析heap的總內存占用大小來初步判斷是否存在泄露
在Devices 中,點擊要監控的程序。
點擊Devices視圖界面中最上方一排圖標中的“Update Heap”
點擊Heap視圖
點擊Heap視圖中的“Cause GC”按鈕
到此為止需檢測的進程就可以被監視。

?

Heap視圖中部有一個Type叫做data object,即數據對象,也就是我們的程序中大量存在的類類型的對象。在data object一行中有一列是“Total Size”,其值就是當前進程中所有Java數據對象的內存總量,一般情況下,這個值的大小決定了是否會有內存泄漏。可以這樣判斷:

?

進入某應用,不斷的操作該應用,同時注意觀察data object的Total Size值,正常情況下Total Size值都會穩定在一個有限的范圍內,也就是說由于程序中的的代碼良好,沒有造成對象不被垃圾回收的情況。

?

所以說雖然我們不斷的操作會不斷的生成很多對象,而在虛擬機不斷的進行GC的過程中,這些對象都被回收了,內存占用量會會落到一個穩定的水平;反之如果代碼中存在沒有釋放對象引用的情況,則data object的Total Size值在每次GC后不會有明顯的回落。隨著操作次數的增多Total Size的值會越來越大,直到到達一個上限后導致進程被殺掉。

?

2.2 MAT分析hprof來定位內存泄露的原因所在。
這是出現內存泄露后使用MAT進行問題定位的有效手段。
A)Dump出內存泄露當時的內存鏡像hprof,分析懷疑泄露的類:

?

B)分析持有此類對象引用的外部對象

?

C)分析這些持有引用的對象的GC路徑

?

D)逐個分析每個對象的GC路徑是否正常
從這個路徑可以看出是一個antiRadiationUtil工具類對象持有了MainActivity的引用導致MainActivity無法釋放。此時就要進入代碼分析此時antiRadiationUtil的引用持有是否合理(如果antiRadiationUtil持有了MainActivity的context導致節目退出后MainActivity無法銷毀,那一般都屬于內存泄露了)。

?

2.3 MAT對比操作前后的hprof來定位內存泄露的根因所在。
為查找內存泄漏,通常需要兩個 Dump結果作對比,打開 Navigator History面板,將兩個表的 Histogram結果都添加到 Compare Basket中去
A) 第一個HPROF 文件(usingFile > Open Heap Dump ).
B)打開Histogram view.
C)在NavigationHistory view里 (如果看不到就從Window >show view>MAT- Navigation History ), 右擊histogram然后選擇Add to Compare Basket .

?

D)打開第二個HPROF 文件然后重做步驟2和3.
E)切換到Compare Basket view, 然后點擊Compare the Results (視圖右上角的紅色”!”圖標)。

?

F)分析對比結果
可以看出兩個hprof的數據對象對比結果。
通過這種方式可以快速定位到操作前后所持有的對象增量,從而進一步定位出當前操作導致內存泄露的具體原因是泄露了什么數據對象。

?

注意:
如果是用 MAT Eclipse 插件獲取的 Dump文件,不需要經過轉換則可在MAT中打開,Adt會自動進行轉換。
而手機SDk Dump 出的文件要經過轉換才能被 MAT識別,Android SDK提供了這個工具 hprof-conv (位于 sdk/tools下)
首先,要通過控制臺進入到你的 android sdk tools 目錄下執行以下命令:
./hprof-conv xxx-a.hprof xxx-b.hprof
例如 hprof-conv input.hprof out.hprof
此時才能將out.hprof放在eclipse的MAT中打開。

?



手機管家內存泄露每日監控方案

目前手機管家的內存泄露每日監控會自動運行并輸出是否存在疑似泄露的報告郵件,不論泄露對象的大小。這其中涉及的核心技術主要是AspectJ,MLD自研工具(原理是虛引用)和UIAutomator。

?

3.1 AspectJ插樁監控代碼
手機管家目前使用一個ant腳本加入MLD的監控代碼,并通過AspectJ的語法實現插樁。
使用AspectJ的原因是可以靈活分離出項目源碼與監控代碼,通過不同的編譯腳本打包出不同用途的安裝測試包:如果測試包是經過Aspect插樁了MLD監控代碼的話,那么運行完畢后會輸出指定格式的日志文件,作為后續分析工作的數據基礎。

?

3.2 MLD實現監控核心邏輯
這是手機管家內的一個工具工程,正式打包不會打入,BVT等每日監控測試包可以打入。打入后可以通過諸如addObject接口(通過反射去檢查是否含有該工具并調用)來加入需要監控的檢測對象,這個工具會自動在指定時機(如退出管家)去檢測該對象是否發生泄漏。

?

這個內存泄露檢測的基本原理是:
虛引用主要用來跟蹤對象被垃圾回收器回收的活動。虛引用必須和引用隊列(ReferenceQueue)聯合使用(在虛引用函數就必須關聯指定)。當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在回收對象的內存之前,自動把這個虛引用加入到與之關聯的引用隊列中。程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。

?

基于以上原理,MLD工具在調用接口addObject加入監控類型時,會為該類型對象增加一個虛引用,注意虛引用并不會影響該對象被正常回收。因此可以在ReferenceQueue引用隊列中統計未被回收的監控對象是否超過指定閥值。

?

利用PhantomReferences(虛引用)和ReferenceQueue(引用隊列),當PhantomReferences被加入到相關聯的ReferenceQueue時,則視該對象已經或處于垃圾回收器回收階段了。

?

MLD監控原理核心
目前手機管家已對大部分類完成內存泄露的監控,包括各種activity,service和view頁面等,務求在技術上能帶給用戶最順滑的產品體驗。
接下來簡單介紹下這個工具的判斷核心。根據虛引用監控到的內存狀態,需要通過多種策略來判斷是否存在內存泄露。
(1)最簡單的方式就是直接在加入監控時就為該類型設定最大存在個數,舉個例子,各個DAO對象理論上只能存在最多一個,因此一旦出現兩個相同的DAO,那一般都是泄露了;
(2)第二種情況是在頁面退出程序退出時,檢索gc后無法釋放的對象列表,這些對象類型也會成為內存泄露的懷疑對象;
(3)最后一種情況比較復雜,基本原理是根據歷史操作判斷對象數量的增長幅度。根據對象的增長通過最小二乘法擬合出該對象類型的增長速度,如果超過經驗值則會列入疑似泄露的對象列表。

?

3.3 UIAutomator完成重復操作的自動化
最后一步就很簡單了。這么多反復的UI操作,讓人工來點就太浪費人力了。我們使用UIAutomator來進行自動化操作測試。
目前手機管家的每日自動化測試已覆蓋各個功能的主路徑,并通過配置文件的方式來靈活驅動用例的增刪改查,最大限度保證了隨著版本推移用例的復用價值。
至此手機管家的內存泄露測試方案介紹完畢,也歡迎各路牛人交流溝通更多更強的內存泄露工具盒方案!

轉載于:https://www.cnblogs.com/krislight1105/p/5203288.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375067.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375067.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375067.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

靶場練習第七天~vulnhub靶場之mrRobot

靶機下載鏈接: 百度網盤 請輸入提取碼 提取碼: sqv3 一、主機發現 1.用ifconfig查看kali的ip,因為kali和靶機都開啟了NAT模式,使用namp -sP 192.168.101.0/24探測靶機ip 二、信息收集 1.使用nmap掃描靶機 使用nmap -A 192.168.101.108 ,查…

JAVA第二次試驗

北京電子科技學院(BESTI) 實 驗 報 告 課程:Java程序設計 班級:1352 姓名:潘俊洋 學號:20135230 成績: 指導教師:婁嘉鵬 實驗日期:2015.5.4 實驗密級&#xff1a…

【轉】怎么樣從一個瘋狂下載者成為一個學習者!!!值得反省下的問題·~~

為了方便廣大網友,各種網站也應運而生。當網絡的建設和發展正進行的如火如荼,喧鬧之中,搭配學習這壺美酒的,竟是一瓶名叫資料下載的毒藥,更糟糕的是,美酒和毒藥已經被灌到了同一個杯子里,渾然一…

靶場練習第八天~vulnhub靶場之CH4INRULZ_v1.0.1

一、前期準備 1.靶機下載 鏈接: 百度網盤 請輸入提取碼 提取碼: z37y 2.用命令ifconfig查看kali 二、信息收集 1.主機發現,使用nmap命令 具體使用方法:nmap -sP 192.168.101.0/24 2.查看該靶機開放了哪些端口 nmap -A 192.168.101.109 直接訪問80端…

C# 不支持關鍵字: “.;database”。

解決方案分析:這個一定是鏈接字符串有問題,核對web.config 和程序的字符串是否有誤轉載于:https://www.cnblogs.com/louby/p/5208986.html

TImus 1073 Square Country DP

題意&#xff1a;給出一個數n(1<n<60000),這個數可以寫成一些數的平方的和&#xff0c; 問對于n&#xff0c;最少可以分成多少個數的平方的和。 比如&#xff1a;n344&#xff0c;則34418*184*42*2&#xff0c;輸出3. dp[i]表示i這個數最少可以分成多少個數的平方的和。 …

vulnhub靶機獲取不到ip

1.啟動靶機&#xff0c;出現如下圖所示&#xff0c;按e 2.進入如下圖所示時&#xff0c;將ro 替換為 rw signie init/bin/bash 3.按下Ctrl鍵X鍵&#xff0c;重啟服務進入如下界面 4.查看當前網卡IP信息 ip a 5.編輯網卡配置文件vi /etc/network/interfaces 6.發現網卡名字與剛…

apache整合tomcat部署集群

近日&#xff0c;由于公司項目需要&#xff0c;所以學習了apache整合tomcat以及集群的一些知識。 所以做下筆記日后回顧可以用到。 apache只有處理靜態事物的能力&#xff0c; 而tomcat的強項就是處理動態的請求&#xff0c;所以apache和tomcat整合相互取長補短&#xff0c;由a…

Cpk

CPK&#xff1a;Complex Process Capability index 的縮寫&#xff0c;是現代企業用于表示制程能力的指標。制程能力是過程性能的允許最大變化范圍與過程的正常偏差的比值。制程能力研究在於確認這些特性符合規格的程度&#xff0c;以保證制程成品不符規格的不良率在要求的水準…

靶場練習第九天~vulnhub靶場之dc-1

一、環境搭建 靶場下載鏈接: 百度網盤 請輸入提取碼 提取碼: ih67 1.查看kali的ip&#xff1a;ifconfig 二、信息收集 1.使用namp命令 主機探測: nmap -sP 192.168.101.0/24 查看靶機開放端口號和服務:nmap -A 192.168.101.111 發現開放80端口,訪問一下192.168.101.111 Dru…

4~20mA模擬輸出(電流環)應用筆記(轉)

4~20mA模擬輸出&#xff08;電流環&#xff09;應用筆記 bpesun163.com 前言 4-20mA.DC(1-5V.DC)信號制是國際電工委員會(IEC):過程控制系統用模擬信號標準。 在工業現場&#xff0c;如果采集的信號經調理后是電壓信號并且進行長線傳輸&#xff0c;會產生以下問題&#xff1a; …

ADO多線程數據庫查詢

ADO多線程數據庫查詢通常會出現3個問題&#xff1a;1、CoInitialize 沒有調用 &#xff08;CoInitialize was not called&#xff09;&#xff1b;所以&#xff0c;在使用任何dbGo對象前&#xff0c;必須手 調用CoInitialize和CoUninitialize。調用CoInitialize失敗會產生"…

PHPExcel

excel文檔處理對象主要用來管理我們的excel文檔&#xff0c;怎么來管理&#xff08;通過屬性和方法來管理&#xff09;&#xff1f;大家知道&#xff0c;類主要是由屬性和方法來組成&#xff0c;通過php程序的手段來管理excel文檔&#xff0c;其實就是通過本對象的屬性和方法來…

靶場練習第十天~vulnhub靶場之dc-2

一、準備工作 靶機下載地址鏈接: 百度網盤 請輸入提取碼 提取碼: ib86 二、信息收集 1.nmap的信息收集 &#xff08;1&#xff09;使用nmap 192.168.101.0/24&#xff0c;發現靶機地址為192.168.101.115 &#xff08;2&#xff09;對靶機做進一步探測&#xff0c;發現靶機開…

Ubuntu 14.10 創建虛擬網卡實現橋接網絡

目標需求&#xff1a;在Ubuntu主機創建一張虛擬網卡&#xff0c;使得搭建在VirtualBox中的其他主機能借助虛擬網卡構建的局域網進行相互間的通訊 步驟一&#xff1a;準備工具包 安裝 uml-utilities 以及 bridge-utils sudo apt-get install uml-utilities bridge-utils 步驟二&…

iOS定時器-- NSTimer 和CADisplaylink

iOS定時器-- NSTimer 和CADisplaylink 一、iOS中有兩種不同的定時器&#xff1a; 1. NSTimer&#xff08;時間間隔可以任意設定&#xff0c;最小0.1ms&#xff09;// If seconds is less than or equal to 0.0, this method chooses the nonnegative value of 0.1 millisecond…

靶場練習第十一天~vulnhub靶場之dc-3

一、準備工作 1.靶場鏈接: 百度網盤 請輸入提取碼 提取碼: 48d3 2.啟動靶場后會遇到如下情況&#xff1a; 2-1具體解決辦法如下&#xff1a; 啟動成功 3.查看kali的ip&#xff1a;ifconfig 二、信息收集 1.nmap的信息收集 &#xff08;1&#xff09;尋找靶機的ip&#xf…

UNIX環境高級編程一書中apue.h找不到

apue.h是作者為了方便自己寫的一個庫&#xff0c;在http://www.apuebook.com選擇你對應書中的source code&#xff0c;然后解壓壓縮包中在/include/apue.h以及/lib/error.c復制到你文件系統中/usr/include中即可。另外在apue.h中#include "error.c"即可。這樣gcc編譯…

大齡程序員怎樣渡過中年危機?(轉)

大齡程序員怎樣渡過中年危機&#xff1f; 作者前言&#xff1a; 話說再有十幾天就進入2016年了&#xff0c;想到這&#xff0c;我不由得五味雜陳。2016年對我來說是一個特殊的年份&#xff0c;因為我即將40歲了&#xff0c;人生正式告別青年期&#xff0c;進入中年了。 在娛樂圈…

靶場練習第十二天~vulnhub靶場之dc-4

一、準備工作 1.靶機下載鏈接 鏈接: 百度網盤 請輸入提取碼 提取碼: 3hq4 2.用ifconfig查看kali的ip 二、信息收集 1.nmap的信息收集 &#xff08;1&#xff09;主機發現 命令&#xff1a;nmap 192.168.101.0/24 &#xff08;2&#xff09;掃描靶機詳細信息 發現主機 192…