原生android的內存性能提升方面的方案大致設計

一 測試目標:
以滿足用戶設備的內存性能和不殺后臺為目標。
1:滿足用戶設備的內存性能是指不出現因為內存原因導致的安卓設備死機,卡頓等問題。

2:滿足不殺后臺是指整個設備使用時,不出現后臺app被殺。
通常是估算如果有后臺被殺,則該設備所最多能容納的app數量值。


二 測試思路:
原生android的內存架構設計會優先考慮內存性能,為了性能,會犧牲掉后臺app駐留能力。
所以可以首要關注滿足不殺后臺這一目標。

另外實際應用中,多是需要做上面測試目標的第2個估算,所以下來會針對這個做詳細設計。
可以在測試時,選取首次出現殺后臺問題的這一時間點,捕獲下此時系統對應的整機內存分布,以便算出設備容納的app數量以及還有無優化空間。


三 測試方法:
1: 清空android設備內存駐留的所有app,并重啟。

2:開機后,測試app啟動后,操作2分鐘,再退出啟動下一個app.
這樣連續啟動操作若干個app,直至出現第一個后臺殺進程時,捕獲下此時系統對應的整機內存分布,并記錄下此時已經啟動并操作過的app數目。
(選取app時, 一般選取用戶場景中高頻使用的app)

3:估算殺進程時間點對應的整機總共消耗內存容量大小:
(totalpss - totalswappss)(用戶態內存消耗) + ?
(shmem + slab_unreclaimable + vmalloc_used + page_tables + kernel_stack + ion_heap)(內核態內存消耗,很多是/proc/meminfo里面的) +
memInfo.getZramTotalSizeKb() (zram占的實際物理內存大小)


四 進一步的提升后臺駐留能力方面的優化方法:

如果目標是在不犧牲性能的情況下,使得有更多的app可以駐留后臺:
則首先需要檢查:
1:各app的內存消耗是否正常。
需要采集下app位于前臺和后臺兩個不同的內存消耗值,然后拿該兩個內存值和同類型(比如都是天氣預報app)的其他app的這兩個數值做比較。
分析該app的內存占用是否有異常。(異常包括有無內存泄漏或者內存占用不合理)

異常對應處理措施:
1)app位于前臺時,采集的是其最大峰值內存占用,還需要捕獲到對應的app進程棧回溯上下文,輔助app開發者找到哪地方代碼占內存有問題。
2)位于后臺時,如果內存占用不合理,多是因為該app退到后臺時,其占用的圖形內存資源沒有釋放,需要優化該app。


2: 系統工作集的內存消耗是否正常.
android整機內存占用可以分為三大塊:
系統工作集 + 用戶感知app + 后臺的非感知app

系統工作集內存消耗:包括adj<0的系統所有進程pss內存占用總和,還有內核態內存消耗.

這個系統工作集內存消耗具體統計上面三 測試方法里面有提到。
可以和其他的同類型(都是車載機),同軟件大版本的android設備做比較,來發現其內存占用是否異常。

異常對應處理措施:
內核態除了ION heap之外,其他幾項不會占內存太多,除非有內存泄漏問題出現。
ION heap可以用我這邊專門工具捕獲到每一塊ION內存對應的線程棧回溯上下文。這樣可以輔助分析哪塊ION內存占用不合理。


3:后臺cached級別進程是否已經被凍結,其占用的用戶態內存是否已經被回收掉。
這個cached級別進程就是上面說的后臺非感知app。

現在原生android14版本對cached進程是會凍結,并回收其內存資源的。
可以通過看進程棧回溯上下文,檢查有無真正被凍結,另外通過dumpsys meminfo命令看其用戶態占用內存是否已經被回收掉。


4:app退到后臺時,除了上面提的用戶感知app之外,其他app是否已經退到cached級別。

1)如果發現有沒退到cached級別,但又不會被用戶感知的app,則估計是該app利用了系統缺陷,做了后臺優先級提升工作。
此時,需要把該app降級,并重新退到cached級別。

2)如果可感知app稍微比較多,則需要評估需要有這么多這種類型的app存在。
因為此類app多的話,影響系統內存回收,增大系統總內存占用消耗。


其次如果上面三 測試方法中的步驟3算出的系統總內存消耗和ddr總內存的差值比較大時(1G以上),
則表明在系統有比較多的可用內存時,還發生了殺后臺現象。
這個是原生安卓過于重視內存性能,忽視后臺駐留的一個不足缺陷,
具體原因是lmkd采用了mem psi方式殺進程,該殺進程方式比較活躍,一旦稍微有內存壓力,就會殺后臺進程。
需要對Lmkd做改進。


五:識別內存性能問題以及相應的優化
上面提的是優化殺后臺問題,提升后臺app駐留能力。
另外針對平時測試場景中的死機卡頓這些性能問題,也需要有針對性的優化方案部署。

1 卡頓測試方法:

可以在發版本之前跑monkey或者mtbf測試,并且版本要帶上卡頓檢測功能。

這樣在跑測試時,如果有前臺app操作卡頓問題,會自動輸出相關的捕獲log.(會有第一現場的bugreport log生成)

2 卡頓問題分析:

卡頓分必現卡頓和偶現卡頓:
必現卡頓可以通過systrace和simpleperf等性能工具,來看出卡頓原因。

偶現卡頓則需要部署卡頓檢測功能,提升系統的可觀測性。
該功能可以做到:
每次安卓設備端出現卡頓問題時,可以輸出cpu端,io端和內存端的各自性能耗時數據(都在卡頓檢測功能輸出的log里面),這樣可以通過數據初步知道該卡頓問題主要是cpu,io和內存這3大塊哪塊導致的。

如果是內存,則可以通過bugreport ?log,再結合上面提升后臺駐留方面的優化方法,來分析是否有內存泄漏,或者內存占用不合理等。
如果是IO,則可以通過進一步的IO打點log,來看出是存儲IO棧的哪一層導致的問題,是內核層,還是存儲設備端導致的問題。
?

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

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

相關文章

構造函數注入@RequiredArgsConstructor

Api(tags "用戶管理接口") RequiredArgsConstructor RestController RequestMapping("users") public class UserController {private final IUserService userService;PostMappingApiOperation("新增用戶")public void saveUser(RequestBody U…

輸入框輸入值之后,檢索表格中是否存在輸入框中的值,存在就讓當前文字為紅色

this.searchValue為輸入框的值 createKeywordHtml_content(data) { if (data undefined) { return data; } if (typeof data ! string) { data String(data) } let value data.replace(this.searchValue, <span style"color:#FF5555">$&</span>…

來一組愛勝品1133DN PRO打印機的照片

剛拆箱的機器正面照片 打開前蓋正準備要安裝原裝耗材 下圖是原裝耗材&#xff0c;硒鼓型號是DR2833、碳粉盒型號是TN2833,鼓組件打印頁數12000頁&#xff0c;TN2833標準容量粉盒打印頁數1600頁/5%覆蓋率&#xff0c;TN2833H大容量粉盒打印頁數3000頁/5%覆蓋率、TN2833L超大容量…

Intel base instruction -- cvttsd2si

將截斷雙精度浮點數并轉換為有符號整數。 4958: 8b 05 82 49 00 00 mov 0x4982(%rip),%eax # 92e0 <age_to_colorBase> // eaxgvar_92e0 495e: 48 8d 15 7b 49 00 00 lea 0x497b(%rip),%rdx # 92e0 <age_to_colorBase&g…

慢性腎臟病-MR+轉錄組文獻

Identification of novel therapeutic targets for chronic kidney disease and kidney function by integrating multi-omics proteome with transcriptome - PMC (nih.gov) 數據和材料 Our pQTL summary data were acquired from previously published studies and can be f…

三. 根文件系統構建

根文件系統構建好以后就意味著我們已經擁有了一個完整的,可以運行的最小系統. 一. 根文件系統簡介 根文件系統一般也叫做 rootfs&#xff0c;那么什么叫根文件系統&#xff1f;Linux 中的根文件系統更像是一個文件夾或者叫做目錄,在這個目錄里面會有很多的子目錄,目錄下的文件…

《妃夢千年》第二十九章:朝中波瀾

第二十九章&#xff1a;朝中波瀾 自從被封為護國夫人后&#xff0c;林清婉在大周的地位愈發穩固&#xff0c;她的智慧和勇氣不僅贏得了皇上的信任&#xff0c;也獲得了朝中眾臣的敬佩。然而&#xff0c;這也引來了部分人的嫉妒和不滿&#xff0c;他們開始在暗中謀劃&#xff0…

AdaBoost集成學習算法理論解讀以及公式為什么這么設計?

本文致力于闡述AdaBoost基本步驟涉及的每一個公式和公式為什么這么設計。 AdaBoost集成學習算法基本上遵從Boosting集成學習思想&#xff0c;通過不斷迭代更新訓練樣本集的樣本權重分布獲得一組性能互補的弱學習器&#xff0c;然后通過加權投票等方式將這些弱學習器集成起來得到…

RightFont 8.7.0 Mac專業字體管理工具

RightFont 適用于 macOS 的終極字體管理器應用程序&#xff0c;提供無縫的字體管理體驗。它結合了速度、直觀的功能和專業的功能&#xff0c;使用戶能夠輕松預覽、安裝、組織和共享字體。 RightFont 8.7.0 Mac下載 RightFont 8.0的新增功能 RightFont 8.0 帶來了全新的智能選…

【電腦應用技巧】如何尋找電腦應用的安裝包華為電腦、平板和手機資源交換

電腦的初學者可能會直接用【百度】搜索電腦應用程序的安裝包&#xff0c;但是這樣找到的電腦應用程序安裝包經常會被加入木馬或者強制捆綁一些不需要的應用裝入電腦。 今天告訴大家一個得到干凈電腦應用程序安裝包的方法&#xff0c;就是用【聯想的應用商店】。聯想電腦我是一點…

比賽獲獎的武林秘籍:05 電子計算機類比賽國獎隊伍技術如何分工和學習內容

比賽獲獎的武林秘籍&#xff1a;05 電子計算機類比賽國獎隊伍技術如何分工和學習內容 摘要 本文主要介紹了在電子計算機類比賽中技術層面上的團隊分工和需要學習的內容&#xff0c;分為了嵌入式硬件、嵌入式軟件、視覺圖像處理、機械、上位機軟件開發和數據分析等六個方向&am…

文心一言 VS 訊飛星火 VS chatgpt (299)-- 算法導論22.1 3題

三、有向圖 G ( V , E ) G(V,E) G(V,E) 的轉置是圖 G T ( V , E T ) G^{T} (V,E^{T}) GT(V,ET)&#xff0c;這里 E T { ( v , u ) ∈ V V E^{T} \{(v,u)∈ V \times V ET{(v,u)∈VV:(u,v)∈ E}$因此&#xff0c;圖 G T G^{T} GT 就是將有向圖 G G G中所有邊的方向反過來…

java LogUtil輸出日志打日志的class文件內具體方法和行號

最近琢磨怎么把日志打的更清晰&#xff0c;方便查找問題&#xff0c;又不需要在每個class內都創建Logger對象&#xff0c;還帶上不同的顏色做區分&#xff0c;簡直不要太爽。利用堆棧的方向順序拿到日志的class問題。看效果&#xff0c;直接上代碼。 1、demo test 2、輸出效果…

【WebGIS平臺】傳統聚落建筑科普數字化建模平臺

基于上述概括出建筑單體的特征部件&#xff0c;本文利用互聯網、三維建模和地理信息等技術設計了基于瀏覽器/服務器&#xff08;B/S&#xff09;的傳統聚落建筑科普數字化平臺。該平臺不僅實現了對傳統聚落建筑風貌從基礎到復雜的數字化再現&#xff0c;允許用戶輕松在線構建從…

Linux 利用命名空間創建一個自己的“容器“

Linux 利用命名空間創建一個自己的"容器" 前置條件 創建一個目錄存放容器mkdir /myapp準備靜態編譯busybox&#xff0c;操作系統自帶的往往是依賴動態庫的(本文使用的debian apt install busybox-static) 開始 使用unshare起一個獨立命名空間.# 進入后/myapp目錄…

Python中生成隨機數:一種簡單而強大的方法

簡介&#xff1a; 在編程中&#xff0c;我們經常需要生成隨機數來模擬各種情況&#xff0c;比如游戲、統計模擬、機器學習數據集的劃分等。Python通過其內置的random模塊提供了一個簡單而強大的方式來生成隨機數。本文將介紹如何使用random模塊來生成各種類型的隨機數&#xff…

【RESTful】前后端的通信方式 REST

前后端的通信方式 REST 1.初識 REST1.1 什么是 REST1.2 REST 的特征 2.HTTP 方法與 CRUD 動作映射3.實現 REST 風格的 CRUD 1.初識 REST 1.1 什么是 REST REST 是軟件架構的規范體系結構&#xff0c;它將 資源的狀態 以適合客戶端的形式從服務器端發送到客戶端&#xff08;或…

小型簡易GIT服務器搭建和使用

搭建GIT服務器的文章有很多&#xff0c;多數在管理的時候都使用了gitosis作為管理工具&#xff0c;但是作為一個小團隊(人數少于50人)&#xff0c;我覺得完全可以使用公鑰驗證的方式&#xff0c;這樣會簡單不少&#xff0c;下面來看看簡易的搭建方法吧。 服務器版本:ubuntu 16…

Unix\Linux 執行shell報錯:“$‘\r‘: 未找到命令” 解決

linux執行腳本sh xxx.sh報錯&#xff1a;$xxx\r: 未找到命令 原因&#xff1a;shell腳本在Windows編寫導致的換行問題&#xff1a; Windows 的換行符號為 CRLF&#xff08;\r\n&#xff09;&#xff0c;而 Unix\Linux 為 LF&#xff08;\n&#xff09;。 縮寫全稱ASCII轉義說…

第二證券:ppi指數是什么,ppi指數下降對股市有什么影響?

PPI全稱Producer Price Index&#xff0c;PPI指數即“出產者價格指數”&#xff0c;反映的是一守時期內出產者購買中心產品和原材料價格的改動趨勢和改動程度。 了解ppi指數&#xff1a; 簡單了解便是&#xff0c;計算出出產者的本錢改動狀況&#xff0c;然后反映到價格上。 …