HarmonyOS優化應用內存占用問題性能優化四

一、使用purgeable優化C++內存
Purgeable Memory是HarmonyOS中native層常用的內存管理機制,可用于圖像處理的Bitmap、流媒體應用的一次性數據、圖片等。應用可以使用Purgeable Memory存放其內部的緩存數據,并由系統根據淘汰策略統一管理全部的purgeable內存。當系統內存不足時,系統可以通過丟棄purgeable內存快速回收內存資源,以釋放更多的內存資源給其他應用程序使用,實現全局高效的緩存數據管理。這種機制可以幫助系統更有效地管理內存,提高系統的穩定性和流暢性。
在使用Purgeable內存時,開發者可以調用接口釋放Purgeable內存,但需要注意在適當的時機釋放Purgeable內存,以確保內存資源能夠得到有效管理,避免內存占用過高導致的性能問題和內存泄漏的情況。通過合理使用Purgeable內存,開發者可以更好地管理應用程序的內存,提高用戶體驗。
(一)原理介紹
Purgeable內存訪問流程圖如下圖所示,在訪問Purgeable內存時,首先需要判斷當前Purgeable內存的數據是否已經被回收,如果Purgeable內存已經被回收了,那么需要先重建數據再使用。在訪問Purgeable內存的數據時,Purgeable內存對應的引用計數refcnt加1,在訪問Purgeable結束后,其引用計數refcnt會減1,當引用計數為0的時候,該Purgeable內存可以被系統回收。
圖2?Purgeable內存訪問流程圖
?

HarmonyOS優化應用內存占用問題性能優化四-鴻蒙開發者社區


Purgeable內存回收流程圖如下所示,當引用計數為0時,丟棄掉Purgeable內存中的數據,并標識Purgeable內存已回收。
圖3?Purgeable內存回收流程圖
?

HarmonyOS優化應用內存占用問題性能優化四-鴻蒙開發者社區


(二)參考案例
在CMakeLists.txt文件中引入Purgeable對應的動態鏈接庫libpurgeable_memory_ndk.z.so,具體如下所示:

# the minimum version of CMake.
cmake_minimum_required(VERSION 3.4.1)
project(MyNativeApplication)
set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
if(DEFINED PACKAGE_FIND_FILE)include(${PACKAGE_FIND_FILE})
endif()
include_directories(${NATIVERENDER_ROOT_PATH}${NATIVERENDER_ROOT_PATH}/include)
add_library(entry SHARED napi_init.cpp)
# 引入libpurgeable_memory_ndk.z.so動態鏈接庫
target_link_libraries(entry PUBLIC libace_napi.z.so libpurgeable_memory_ndk.z.so)

    引入purgeable_memory頭文件,并聲明創建PurgeableMemory對象需要使用的ModifyFunc函數,調用OH_PurgeableMemory_Create創建PurgeableMemory對象。
    在讀取PurgeableMemory對象的內容時,需要調用OH_PurgeableMemory_BeginRead,讀取結束時,需要調用OH_PurgeableMemory_EndRead。其中,OH_PurgeableMemory_GetContent可以獲取PurgeableMemory對象的內存數據。
    在修改PurgeableMemory對象的內容時,需要調用OH_PurgeableMemory_BeginWrite,讀取結束時,需要調用OH_PurgeableMemory_EndWrite。其中,OH_PurgeableMemory_AppendModify可以更新PurgeableMemory對象重建規則。

    #include "napi/native_api.h"
    #define DATASIZE (4 * 1024 * 1024)
    #include "purgeable_memory/purgeable_memory.h"bool ModifyFunc(void *data, size_t size, void *param) {data = param;return true;
    }
    // 業務定義對象類型
    class ReqObj;
    static napi_value Add(napi_env env, napi_callback_info info)
    {size_t requireArgc = 2;size_t argc = 2;napi_value args[2] = {nullptr};napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);napi_valuetype valuetype0;napi_typeof(env, args[0], &valuetype0);napi_valuetype valuetype1;napi_typeof(env, args[1], &valuetype1);double value0;napi_get_value_double(env, args[0], &value0);double value1;napi_get_value_double(env, args[1], &value1);double result = value0 + value1;// 創建一個PurgeableMemory對象OH_PurgeableMemory *pPurgmem = OH_PurgeableMemory_Create(DATASIZE, ModifyFunc, &result);// 讀取對象OH_PurgeableMemory_BeginRead(pPurgmem);// 獲取PurgeableMemory對象大小size_t size = OH_PurgeableMemory_ContentSize(pPurgmem);// 獲取PurgeableMemory對象內容ReqObj *pReqObj = (ReqObj *)OH_PurgeableMemory_GetContent(pPurgmem);// 讀取PurgeableMemory對象結束OH_PurgeableMemory_EndRead(pPurgmem);// 修改PurgeableMemory對象OH_PurgeableMemory_BeginWrite(pPurgmem);// 聲明擴展創建函數的參數double newResult = value0 + value0;// 更新PurgeableMemory對象重建規則OH_PurgeableMemory_AppendModify(pPurgmem, ModifyFunc, &newResult);// 修改PurgeableMemory對象結束OH_PurgeableMemory_EndWrite(pPurgmem);// 銷毀對象OH_PurgeableMemory_Destroy(pPurgmem);napi_value sum;napi_create_double(env, result, &sum);return sum;
    }
    EXTERN_C_START
    static napi_value Init(napi_env env, napi_value exports)
    {napi_property_descriptor desc[] = {{ "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr }};napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);return exports;
    }
    EXTERN_C_ENDstatic napi_module demoModule = {.nm_version = 1,.nm_flags = 0,.nm_filename = nullptr,.nm_register_func = Init,.nm_modname = "entry",.nm_priv = ((void*)0),.reserved = { 0 },
    };
    extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
    {napi_module_register(&demoModule);
    }

      二、使用合理尺寸的圖片優化應用內存
      (一)原理介紹
      應用在定義界面時,對于使用不同類型的組件,需要繪制不同的內容。圖片組件主要用來加載和顯示圖片,而組件本身也需要占用內存。ArkTS目前采用引用計數的機制來管理內存。引用計數是一種簡單而高效的內存管理方式,它通過記錄每個對象被引用的次數來確定何時釋放對象。需要注意的是,如果組件沒有正確釋放,即使其他地方不再使用該組件,對應的引用鏈接上的資源也不會被釋放,可能會導致內存泄漏問題。
      一張全屏的圖片,不同分辨率的內存占用大小如下:
      ?

      HarmonyOS優化應用內存占用問題性能優化四-鴻蒙開發者社區


      由上圖可以看出,對于一些頁面多、圖片多、效果多的資源密集型應用,內存很容易達到較高水平。當應用的內存占用超過系統設定的閾值(如4G,其中4G只是示例,不同系統的閾值不同)時,系統可能會認為應用存在嚴重的內存問題,并可能會強制殺死該應用進程,以保證設備系統的穩定性和性能。為了避免應用被系統殺死,開發者可以考慮以下兩點:
      優化資源使用:通過合理設置圖片源文件大小,合理使用內存資源,減少圖片所占應用內存。
      布局優化:通過減少布局嵌套層級,減少過度繪制可以產生較大的性能收益。
      本章節主要指導開發者通過合理設置圖片源文件大小,合理使用內存資源,減少圖片所占應用內存。
      (二)避免加載超過顯示尺寸的圖片

      如上代碼示例中,使用500500尺寸大小的Image組件加載一張尺寸為40323024的RGBA格式圖片時(每個像素占用4個字節),圖片申請了約46.5M的內存。這是因為圖片的原始尺寸較大,加載到Image組件中時需要將其縮放到500500的尺寸,這個過程會占用一定的內存空間。
      可使用公式計算出來紋理圖片內存大小 = imageWidth x imageHeight x format(4032
      3024 * 4 = 48771072 bytes ≈ 46.5M)。
      但是實際上,組件只需要500500的尺寸。也就是說,實際需要的內存 = 500500*4 ≈ 1M。
      ?

      HarmonyOS優化應用內存占用問題性能優化四-鴻蒙開發者社區


      因此當一張圖片比控件顯示的區域要大,最終會被裁剪或者縮放。大量的裁剪和縮放不僅導致視圖效果變差,還會浪費內存,引起嚴重的功耗問題。為了最大程度地節省內存,開發者可以手動調整源文件的尺寸大小,使其與組件的大小保持一致。這樣可以避免不必要的內存浪費,并提高應用程序的性能和效率。開發者可以使用圖像處理工具來調整圖像的尺寸大小,從而進一步節省內存空間。

      本文主要引用參考HarmonyOS官方文檔

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

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

      相關文章

      第一課如何學習課程

      讀薄就這些東西 讀厚細節;實現了還是很混沌(內功心法)-》有個項目;在聽的過程中寫博客:我學了什么,敲代碼; 第二章 網絡-》9.1kv存儲 第三章 基礎組件 (API函數、最基礎的底層架構…

      Linux 系統不終止進程的情況下關閉長連接

      使用 tcpkill 中斷指定 TCP 連接 適用場景:需主動中斷已知源IP或目標端口的連接,無需進程重啟。 安裝 dsniff 工具(包含 tcpkill): yum -y install dsniff 捕獲并殺死特定連接(例如目標IP 192.168.1.10…

      TCP原理解析

      目錄 TCP協議概述 1. 基礎尋址段?? ??2. 序列控制段?? ??3. 控制信息段?? ??4. 流量控制段?? ??5. 校驗與應急段?? ??6. 擴展功能段?? ??7. 數據承載段?? TCP原理 確認應答與序列號(安全機制) 超時重傳機制(安全機制) 連接管理機制&…

      拋棄傳統P2P技術,EasyRTC音視頻基于WebRTC打造教育/會議/遠程巡檢等場景實時通信解決方案

      一、方案背景 隨著網絡通信發展,實時音視頻需求激增。傳統服務器中轉方式延遲高、資源消耗大,WebP2P技術由此興起。EasyRTC作為高性能實時通信平臺,集成WebP2P技術,實現低延遲、高效率音視頻通信,廣泛應用于教育、醫療…

      2025年度消費新潛力白皮書470+份匯總解讀|附PDF下載

      原文鏈接:https://tecdat.cn/?p42178 過去一年,消費市場在政策驅動與技術迭代中呈現結構性變革。社零總額達487,895億元,實物商品網零額占比27%,線上渠道成為增長引擎。本報告從食品飲料、美妝護膚、家電數碼、服飾戶外四大核心領…

      “智”造巨輪啟新程:數字安全的戰略布局

      數據就像空氣,無處不在;安全就像呼吸,刻不容緩! 在智能化不斷創新的沃土上,某大型智能家電企業這艘智造巨輪正乘風破浪,駛向數字化的深藍大海。作為全球家電制造的領航者,深知:在這個數字時代&a…

      React組件(二):常見屬性和函數

      文章目錄 一、defaultProps 和 prop-types使用 defaultProps 設置組件的默認值使用prop-types進行props數據類型的校驗代碼舉例 二、事件綁定原生js做事件綁定使用 React 提供的方法,做事件綁定 三、生命周期函數:shouldComponentUpdate()四、在js代碼中…

      redis 進行緩存實戰-18

      使用 Redis 進行緩存 Redis 通常被認為只是一個數據存儲,但它的速度和內存中特性使其成為緩存的絕佳選擇。緩存是一種技術,通過將經常訪問的數據存儲在快速的臨時存儲位置來提高應用程序性能。通過使用 Redis 作為緩存,您可以顯著減少主數據…

      【Nginx學習筆記】:Fastapi服務部署單機Nginx配置說明

      服務部署單機Nginx配置說明 服務.conf配置文件: upstream asr_backend {server 127.0.0.1:8010; }server {listen 80;server_name your_domain.com;location / {proxy_pass http://localhost:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remot…

      Qt網絡編程

      前言 Qt為了支持跨平臺,對系統網絡編程的API(socket API)也進行了重新分裝。 實際Qt中進行網絡編程也不一定使用Qt封裝的網絡API,也有可能使用的是系統原生API或者其他第三方框架的API。 若要使用Qt中的網絡編程的API&#xff…

      矩陣短劇系統:如何用1個后臺管理100+小程序?技術解析與實戰應用

      引言:短劇行業的效率革命 2025年,短劇市場規模已突破千億,但傳統多平臺運營模式面臨重復開發成本高、用戶數據分散、內容同步效率低等痛點。行業亟需一種既能降本增效又能聚合流量的解決方案——“矩陣短劇系統”。通過“1個后臺管理100小程…

      嵌入式STM32學習——ESP8266 01S的基礎介紹

      簡介 ESP8266 系列模組是深圳市安信可科技有限公司開發的一系列基于樂鑫ESP8266EX的低功耗UART-WiFi芯片模組,可以方便地進行二次開發,接入云端服務,實現手機3/4G全球隨時隨地的控制,加速產品原型設計。 模塊核心處理器 ESP8266 在…

      form-create-designer中$inject參數的數據結構及各項屬性說明

      FcDesigner 是一款基于Vue的開源低代碼可視化表單設計器工具,通過數據驅動表單渲染。可以通過拖拽的方式快速創建表單,提高開發者對表單的開發效率,節省開發者的時間。并廣泛應用于在政務系統、OA系統、ERP系統、電商系統、流程管理等領域。 …

      Jasypt概述及整合SpringBoot實現敏感數據加密

      前言 在實際開發中,Spring Boot應用的配置文件中經常包含數據庫密碼、API密鑰等敏感信息。如果這些信息以明文形式存儲,會帶來嚴重的安全隱患。本文將詳細介紹如何使用Jasypt(Java Simplified Encryption)對Spring Boot配置文件中…

      Better Faster Large Language Models via Multi-token Prediction 原理

      目錄 模型結構: Memory-efficient implementation: 實驗: 1. 在大規模模型上效果顯著: 2. 在不同類型任務上的效果: 為什么MLP對效果有提升的幾點猜測: 1. 并非所有token對生成質量的影響相同 2. 關…

      git merge解沖突后,add、continue提交

      git merge解沖突后,add、continue提交 git merge操作沖突后,需要手動解沖突,解完沖突后,需要: git add . 然后,進入一般的正常git代碼提交流程。 git合并‘merge’其他分支的個別文件到當前branch_gitbash 合并branc…

      3.8.1 利用RDD實現詞頻統計

      在本次實戰中,我們通過Spark的RDD實現了詞頻統計功能。首先,準備了包含單詞的文件并上傳至HDFS。接著,采用交互式方式逐步完成詞頻統計,包括創建RDD、單詞拆分、映射為二元組、按鍵歸約以及排序等操作。此外,還通過創建…

      應對進行性核上性麻痹,健康護理鑄就溫暖防線

      進行性核上性麻痹(PSP)是一種罕見的神經退行性疾病,主要影響患者的運動、平衡及吞咽等功能。針對這類患者,有效的健康護理對提升其生活質量、延緩病情發展至關重要。 在日常生活護理方面,由于患者存在平衡障礙和肌肉僵…

      融合蛋白質語言模型和圖像修復模型,麻省理工與哈佛聯手提出PUPS ,實現單細胞級蛋白質定位

      蛋白質亞細胞定位(subcellular localization of a protein)是指蛋白質在細胞結構中具體的定位情況, 這對蛋白質行使其生物學功能至關重要。舉個簡單例子,如果把細胞想象成一個龐大的企業,其中細胞核、線粒體、細胞膜等…

      lanqiaoOJ 4330:歐拉函數模板

      【題目來源】 https://www.lanqiao.cn/problems/4330/learning/ 【問題描述】 這是一道模板題。 首先給出歐拉函數的定義:即 φ(n) 表示的是小于等于 n 的數中和 n 互質的數的個數。 比如說 φ(6)2,當 n 是質數的時候,顯然有φ(n)n-1。 【題…