鸿蒙5.0开发【优化应用内存占用问题】性能

概述

用户功能的不断增强,应用越来越复杂,占用的内存也在不断膨胀,而内存作为系统的稀缺资源比较有限,当应用程序占用过多内存时,系统可能会频繁进行内存回收和重新分配,导致应用程序的性能下降,甚至出现崩溃和卡顿的情况。因此,主动减少应用内存的占用对于整个系统至关重要。通过减少应用内存的占用,可以有效提高应用的性能和响应速度,节省系统资源,让设备的运行效率更高,延长设备的续航时间。开发者应该在应用开发过程中注重内存管理,积极采取措施来减少内存占用,以优化应用程序的性能和用户体验。

HarmonyOS提供了一些内存管理的工具和接口,帮助开发者有效地管理内存资源:

  1. onMemoryLevel接口:开发者可通过该接口监听系统内存的变化,并做根据系统内存的实时情况,动态地调整应用程序的内存,以避免内存过度占用导致的性能问题。
  2. LRUCache:LRUCache用于在缓存空间不够的时候,将近期最少使用的数据替换为新数据。
  3. 生命周期管理:在生命周期管理中,可以释放不再使用的系统资源,包括应用内存、监听事件、网络句柄等。
  4. Purgeable Memory内存管理机制:在该机制中,开发者可以通过使用相关接口创建PurgeableMemory对象,从而管理Purgeable内存。
  5. 图片加载和渲染:在使用Image组件加载和渲染图片时,开发者可以手动调整图片源文件的尺寸大小,使其与组件大小一致。这样可以避免图片过大或过小导致的显示问题,并提高应用程序的用户体验。

本文将从这五个方面来介绍如何优化应用内存占用问题。

使用onMemoryLevel监听内存变化

onMemoryLevel是HarmonyOS提供监听系统内存变化的接口,开发者可以通过onMemoryLevel监听内存变化,从而调整应用的内存。onMemoryLevel回调包括三种方式,分别为[AbilityStage]、[UIAbility]、[EnvironmentCallback]。

  • AbilityStage:当HAP中的代码首次被加载到进程中的时候,系统会先创建AbilityStage实例,系统决定调整内存时,再回调AbilityStage实例的onMemoryLevel方法。
  • UIAbility:Ability是UIAbility的基类,在Ability中,提供系统内存变化的回调方法。
  • EnvironmentCallback:EnvironmentCallback模块提供应用上下文ApplicationContext对系统环境变化监听回调的能力。

MemoryLevel分为MEMORY_LEVEL_MODERATE、MEMORY_LEVEL_LOW和MEMORY_LEVEL_CRITICAL三种。其中,MEMORY_LEVEL_MODERATE代表当前系统内存压力适中,应用可以正常运行而不会受到太大影响,MEMORY_LEVEL_LOW代表当前系统的内存已经比较低了,应用应该释放不必要的内存资源,避免造成系统卡顿,MEMORY_LEVEL_CRITICAL代表当前所剩的系统内存非常紧张,应用应该尽可能释放更多的资源,以确保系统的稳定性和性能。开发人员应该根据不同的内存级别来采取相应的措施,如释放资源、优化内存使用等,以确保应用在不同内存状态下都能正常运行。MemoryLevel具体等级定义如下所示:

等级 说明
MEMORY_LEVEL_MODERATE 0 系统内存适中。系统可能会开始根据LRU缓存规则杀死进程。
MEMORY_LEVEL_LOW 1 系统内存比较低。此时应该去释放掉一些不必要的资源以提升系统的性能。
MEMORY_LEVEL_CRITICAL 2 系统内存很低。此时应当尽可能地去释放任何不必要的资源,因为系统可能会杀掉所有缓存中的进程,并且开始杀掉应当保持运行的进程,比如后台运行的服务。

说明

后台已冻结的应用,AbilityStage、UIAbility、EnvironmentCallback的onMemoryLevel都不可以进行回调。

使用LRUCache优化ArkTS内存

LRU(Least Recently Used, 最近最少使用)是一种常见的算法,其核心思想是基于时间局部性原理,即如果一个数据在最近被访问过,那么它在未来被访问的概率也会比较高。

[LRUCache]是ArkTS中常用的工具函数,是基于LRU实现的缓存工具,常用于缓存一些频繁访问的数据,例如常用的图片、网络请求的结果等。LRUCache通过维护一个缓存空间来存储数据,当缓存空间不足时,会根据LRU算法将最近最少使用的数据替换掉,以保证缓存空间的有效利用。因此,LRUCache会根据数据的访问顺序来进行数据替换,优先淘汰最久未被访问的数据。

原理介绍

LRUCache通过LinkedHashMap来实现LRU的,LinkedHashMap继承于HashMap,HashMap用于快速查找数据,LinkedHashMap双向链表用于记录数据的顺序关系。所以,对于get、put、remove等操作,LinkedHashMap除了包含HashMap的功能,还需要实现调整Entry顺序链表的工作。其数据结构如下图所示:

图1 LRUCache的LinkedHashMap数据结构图
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

LruCache中将LinkedHashMap的顺序设置为LRU顺序,链表头部的对象为近期最少用到的对象。常用的方法及其说明如下所示:

  • 调用get方法:根据key查询对应,如果没有查到则返回null。查询到对应对象后,将该对象移到链表的尾端,并返回查询的对象。
  • 调用put方法:会添加key-value的键值对到缓存中,也是将新对象存储在链表尾端。当内存缓存达到设定的最大值时,将链表头部的对象移除。如果key已经存在,则更新当前key对应的value。
  • 调用remove方法:删除key对应的缓存value,如果key对应的value不在,则返回为null,否则,返回已删除的key-value键值对。
  • 调用updateCapacity方法:设置缓存存储的容量,如果新设置的容量newCapacity小于之前的容量capacity,则只保存newCapacity大小的数据。

参考案例

缓存工具类可以被设计成一个工具类,其中包含LRUCache单例以及一些操作LRUCache的方法,如添加数据、获取数据、删除数据等。通过创建一个静态方法来获取LRUCache实例,并在内部进行实例化,可以保证全局只有一个LRUCache对象。通过缓存工具类,各组件之间可以方便地共享缓存数据,避免重复创建缓存实例和数据冗余。这样不仅可以提高系统的性能和效率,还可以减少内存占用和提升数据访问速度。

import { util } from '@kit.ArkTS';

export clas
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值