日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Studio检测内存泄露和性能

發(fā)布時間:2025/4/5 Android 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Studio检测内存泄露和性能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

韓夢飛沙 yue31313 韓亞飛 han_meng_fei_sha 313134555@qq.com

?

首先需要明白一個概念, 內(nèi)存泄露就是指,本應(yīng)該回收的內(nèi)存,還駐留在內(nèi)存中。?
一般情況下,高密度的手機,一個頁面大概就會消耗20M內(nèi)存,如果發(fā)現(xiàn)退出界面,程序內(nèi)存遲遲不降低的話,可能就發(fā)生了嚴重的內(nèi)存泄露。?
我們可以反復(fù)進入該界面,然后點擊dump java heap 這個按鈕,然后Android Studio就開始干活了,下面的圖就是正在dump?

dump成功后會自動打開 hprof文件,文件以Snapshot+時間來命名?

通過Android Studio自帶的界面,查看內(nèi)存泄露還不是很智能,我們可以借助第三方工具,常見的工具就是MAT了,下載地址 http://eclipse.org/mat/downloads.php ,這里我們需要下載獨立版的MAT. 下圖是MAT一開始打開的界面, 這里需要提醒大家的是,MAT并不會準(zhǔn)確地告訴我們哪里發(fā)生了內(nèi)存泄漏,而是會提供一大堆的數(shù)據(jù)和線索,我們需要自己去分析這些數(shù)據(jù)來去判斷到底是不是真的發(fā)生了內(nèi)存泄漏。

接下來我們需要用MAT打開內(nèi)存分析的文件, 上文給大家介紹了使用Android Studio生成了 hprof文件, 這個文件在呢, 在Android Studio中的Captrues這個目錄中,可以找到?

注意,這個文件不能直接交給MAT, MAT是不識別的, 我們需要右鍵點擊這個文件,轉(zhuǎn)換成MAT識別的。?

然后用MAT打開導(dǎo)出的hprof(File->Open heap dump) MAT會幫我們分析內(nèi)存泄露的原因?

LeakCanary

上面介紹了MAT檢測內(nèi)存泄露, 再給大家介紹LeakCanary。?
項目地址:https://github.com/square/leakcanary

LeakCanary會檢測應(yīng)用的內(nèi)存回收情況,如果發(fā)現(xiàn)有垃圾對象沒有被回收,就會去分析當(dāng)前的內(nèi)存快照,也就是上邊MAT用到的.hprof文件,找到對象的引用鏈,并顯示在頁面上。這款插件的好處就是,可以在手機端直接查看內(nèi)存泄露的地方,可以輔助我們檢測內(nèi)存泄露?

使用:?
在build.gradle文件中添加,不同的編譯使用不同的引用:

?
1 2 3 4 <code class=" hljs matlab">dependencies { ????debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3' ????releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3' }</code>

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

?
1 2 3 4 5 6 7 <code class=" hljs java">public class ExampleApplication extends Application ????@Override ????public void onCreate() { ????????super.onCreate(); ????????LeakCanary.install(this); ?????} ?}</code>

應(yīng)用運行起來后,LeakCanary會自動去分析當(dāng)前的內(nèi)存狀態(tài),如果檢測到泄漏會發(fā)送到通知欄,點擊通知欄就可以跳轉(zhuǎn)到具體的泄漏分析頁面。?
Tips:就目前使用的結(jié)果來看,絕大部分泄漏是由于使用單例模式hold住了Activity的引用,比如傳入了context或者將Activity作為listener設(shè)置了進去,所以在使用單例模式的時候要特別注意,還有在Activity生命周期結(jié)束的時候?qū)⒁恍┳远x監(jiān)聽器的Activity引用置空。?
關(guān)于LeakCanary的更多分析可以看項目主頁的介紹,還有這里http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/

追蹤內(nèi)存分配

如果我們想了解內(nèi)存分配更詳細的情況,可以使用Allocation Traker來查看內(nèi)存到底被什么占用了。?
用法很簡單:?

點一下是追蹤, 再點一下是停止追蹤, 停止追蹤后 .alloc文件會自動打開,打開后界面如下:?

當(dāng)你想查看某個方法的源碼時,右鍵選擇的方法,點擊Jump to source就可以了

查詢方法執(zhí)行的時間

Android Studio 功能越來越強大了, 我們可以借助AS觀測各種性能,如下圖:?

如果我們要觀測方法執(zhí)行的時間,就需要來到CPU界面?

點擊Start Method Tracking, 一段時間后再點擊一次, trace文件被自動打開,?

非獨占時間:?某函數(shù)占用的CPU時間,包含內(nèi)部調(diào)用其它函數(shù)的CPU時間。?
獨占時間:?某函數(shù)占用CPU時間,但不含內(nèi)部調(diào)用其它函數(shù)所占用的CPU時間。

我們?nèi)绾闻袛嗫赡苡袉栴}的方法?

通過方法的調(diào)用次數(shù)和獨占時間來查看,通常判斷方法是:

如果方法調(diào)用次數(shù)不多,但每次調(diào)用卻需要花費很長的時間的函數(shù),可能會有問題。 如果自身占用時間不長,但調(diào)用卻非常頻繁的函數(shù)也可能會有問題。

轉(zhuǎn)載于:https://www.cnblogs.com/yue31313/p/7397018.html

總結(jié)

以上是生活随笔為你收集整理的Android Studio检测内存泄露和性能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。