當前位置:首頁 » 安卓系統 » androidnative內存

androidnative內存

發布時間: 2024-12-15 08:51:34

A. 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再拿代碼~

熱點內容
錢幣編程 發布:2024-12-15 11:28:00 瀏覽:779
標准c語言頭文件 發布:2024-12-15 11:27:55 瀏覽:220
自動化測試框架python 發布:2024-12-15 11:13:14 瀏覽:325
手游雲伺服器怎麼搭建 發布:2024-12-15 10:59:36 瀏覽:123
android找不到so文件 發布:2024-12-15 10:50:13 瀏覽:585
共享ftp伺服器的搭建 發布:2024-12-15 10:49:40 瀏覽:488
我的世界戰爭伺服器需要的模組 發布:2024-12-15 10:41:11 瀏覽:74
java介面的引用 發布:2024-12-15 10:22:32 瀏覽:270
安卓和蘋果哪個聽歌效果好 發布:2024-12-15 10:22:23 瀏覽:118
雷霆戰機的文件夾 發布:2024-12-15 10:20:12 瀏覽:795