⑴ 利用 Android Profiler 評估應用性能-Memory Profile
Android Profiler 的Memory Profile組件是評估應用性能的關鍵工具,特別是針對內存問題,如卡頓、凍結和崩潰。它實時監控應用內存使用,允許開發者捕獲堆轉儲、強制垃圾回收和追蹤內存分配,以找出潛在的內存泄漏和性能瓶頸。
分析應用內存至關重要,因為Android的垃圾回收機制可能會在回收內存時暫停應用。如果分配內存速度過快,這可能導致應用響應延遲,甚至迫使系統終止進程。Memory Profiler有助於識別這些問題,通過可視化內存使用情況,幫助開發者優化內存管理。
在Memory Profiler中,用戶可以直觀地看到內存使用的時間軸,以及詳細的內存分配、堆轉儲和JNI引用信息。在Android 8.0及以上版本,內存分析是自動的,而在低版本設備上可能需要啟用高級分析。通過調整內存采樣設置,開發者可以優化分析性能,同時檢測和解決JNI引用問題,以避免內存泄漏和全局JNI引用限制。
為了進一步追蹤,用戶可以捕獲堆轉儲,檢查保留內存的對象,識別可能的內存泄漏。堆轉儲數據可以另存為.HPROF文件,以便後續分析或與第三方工具(如jhat)結合使用。通過導入和分析.HPROF文件,開發者可以深入挖掘應用的內存行為,確保應用的穩定和高效運行。
⑵ Android內存性能
最近看到測試同事在模擬Android低內存場景,原來是測試後台Service是否能被殺死。
為了順利測試,我著手編寫了一個內存測試工具,名為Ramtool。
1. 最大可用物理內存
1.1 背景
如何完全佔用Android的物理內存,並非簡單通過new申請內存就能實現。
Android的Framework在java層,因此App進程需要啟動jvm虛擬機,運行在jvm中的程序都會受到jvm最大heap限制。
Android的jvm同樣受到system/build.prop控制,現代Android系統默認jvm啟動heap為64MB,最大擴容256MB。
1.2 方案
1.2.1 佔用內存
總體思路是擺脫android jvm,使用C/C++製作Native動態鏈接庫,直接向Linux內核申請內存。
此外,Native還可以擺脫jvm的操作時內存的cpu損耗,擺脫jvm的gc控制,實現手動釋放內存防止影響後續測試。
現代操作系統,包括Linux,都使用了虛擬內存的概念來進行進程間內存隔離。
如果只是不停通過malloc申請堆內存,即使申請的內存容量已經遠遠超過硬體物理內存,也不會發生OOM崩潰。
1.2.2 工程實現
Native OOM崩潰可能會影響進程穩定性,申請到的內存釋放也會很麻煩,所以,放到子進程里去申請heap內存,每次申請1MB,直到子進程崩潰,catch住binder的跨進程通信異常時,就判斷為可用的最大物理內存。
在大部分機型上都是沒問題的,但在部分超大內存機型上,例如realme的16GB內存機型,單進程系統限制最大內存為10GB,所以為了測試極限物理內存佔用,還要採用多進程方案。
申請完內存,記得要在每次測試完成後,即使進行內存釋放。內存泄漏會影響後續內存測試的准確性。
1.2.3 結果
6GB ram的紅米K30手機上,app最大可用的物理內存極限在4GB左右。
16GB ram的Realme手機上,app最大可用的物理內存極限在11.5GB左右。
2. 內存帶寬
2.1 背景
做完最大可用內存後,感覺做都做了,不如再做一個內存帶寬測試工具。
市面上的內存帶寬測試都太抽象了,不知道對應到代碼上具體是什麼樣的性能。
內存不像是硬碟,可以很直接看到讀寫性能。
所以應該怎樣做呢?
2.2 方案
2.2.1 開源方案
先看下開源的方案都是怎麼做的。
2.2.2 硬體原理
我們再來看下CPU的硬體工作方式。
為了最大程度利用內存帶寬,所以stream中選擇數據類型也使用了double。
所以直接用stream就完了嗎?
Stream的方案並不能最大程度發揮內存帶寬。
2.2.3 小故事
(此段故事可以跳過閱讀)
(故事結束,正文開始)
但實際上內存就是慢的一批,測試發現系統memcpy很慢,開始翻對應Android版本的Linux內核源代碼,發現歷史上Linux的內存拷貝可以簡單理解為就是個for循環,按照最小內存單位進行拷貝...
且現代處理器都支持SIMD指令,例如x86指令集陣營的SSE系列指令集,AVX指令集;arm陣營的neon指令,advanc-simd指令,還有最新arm-v9上的SVE指令,都是SIMD指令集。
使用SIMD指令對於測試內存帶寬,可以最大限度避免CPU的影響,提高帶寬。
2.2.4 最終方案
參考ARM公司最新的優化庫,分段對內存進行拷貝。
使用SIMD指令的memcpy進行內存帶寬測試,相比於stream的內存方案,內存帶寬大很多。
其他內存操作演算法參考stream。
內存帶寬測試功能截圖:
3. 緩存/內存延遲
3.1 背景
做完內存帶寬後,感覺做都做了(梅開二度),專業測試工具怎麼能少了內存延遲測試。
CPU只能操作寄存器上的數據,CPU在操作數據前必須要將數據從內存載入到寄存器。
內存太慢了,所以CPU廠商通過SRAM實現了緩存。
緩存對於程序來說是透明的,只能通過細微的逐步擴大容量訪問內存才能測得緩存延遲。
所以應該怎樣做呢?
3.2 方案
3.2.1 演算法
先看看開源是怎麼做的。
3.2.2 參數
經過多次實驗,步長取2048位元組,容量為256MB時,測試結果較為准確,且測試時長可接受。
3.2.3 數據處理
經過上面的步驟,已經可以成功取到內存延遲的數據。
將數據導入excel,先畫圖觀察下數據曲線。
首先訪問命中cache,隨著訪問容量增大,逐漸沖破cache容量,cache命中率下降。
演算法實現:
3.2.4 結果
通過數據分析,計算出cache和內存的延遲平台的均值大小,還用數據畫了個折線圖:
4. 總結
似乎目前市面上Android平台還沒有比較專業傾向的內存測試工具,簡陋封裝了下UI,發布到了github,讓大家有的用。
測試結果僅具備橫向機型間對比。
Ramtool項目地址:github.com/park671/Ramt...
拒絕白嫖,從你我做起,給個star再拿代碼~
⑶ android studio有哪些性能分析工具
導言:來
Android應用在CPU佔用,內存源消耗方面的性能指標是影響產品質量的重要因素,由於QQ管家,360手機助手等應用都提供直觀的內存消耗,流量監控功能,致使用戶比以往更加關注軟體的性能,並以此進行軟體選用的決策。
目前,已經有很多可以監控android app 性能的工具可以供開發人員使用,如:基於Eclipse插件體系的MAT,其通過生成.hprof文件對內存泄露情況進行排查;內存檢測工具APT:提供CPU利用率實時曲線圖,方便對比測試內存泄露問題[圖0-1]