一、引言

随着移动应用的日益复杂,内存管理成为开发者面临的重要挑战之一。在HarmonyOS系统中,合理优化应用内存对于提升应用性能和用户体验至关重要。本文将详细介绍HarmonyOS提供的内存管理工具和接口,以及一些实用的内存优化方法。

二、减少应用内存的重要性

在现代应用开发中,应用程序占用的内存不断增加,但系统内存资源相对有限。当应用过度占用内存时,会引发一系列问题,如系统频繁进行内存回收和重新分配,导致应用性能下降,出现卡顿甚至崩溃的情况。相反,通过有效的内存优化措施,可以提高应用的响应速度,节省系统资源,延长设备续航时间,并提升设备的整体运行效率。因此,开发者在应用开发过程中应积极关注内存管理,采取措施减少内存占用。

三、HarmonyOS内存管理工具和接口

(一)onMemoryLevel接口

  1. 功能介绍
    onMemoryLevel是HarmonyOS提供的用于监听系统内存变化的接口。通过该接口,开发者可以实时获取系统内存的状态信息,并根据不同的内存级别动态调整应用程序的内存使用情况,从而避免因内存过度占用而导致的性能问题。

  2. 回调方式

    • AbilityStage:当HAP中的代码首次被加载到进程中时,系统会创建AbilityStage实例。当系统决定调整内存时,会回调AbilityStage实例的onMemoryLevel方法。例如,在一个包含多个模块的大型应用中,当某个模块首次加载时,系统会创建相应的AbilityStage实例,后续根据内存情况回调该实例的方法来调整内存。
    • UIAbility:Ability是UIAbility的基类,在Ability中提供了系统内存变化的回调方法。比如,在一个具有复杂UI界面的应用中,UIAbility可以实时监听内存变化,当内存紧张时调整界面相关资源的内存占用。
    • EnvironmentCallback:该模块提供了应用上下文ApplicationContext对系统环境变化监听回调的能力。以一个需要实时获取环境信息的应用为例,如天气应用,它可以通过EnvironmentCallback监听系统环境变化对内存的影响,并做出相应调整。
  3. MemoryLevel级别
    MemoryLevel分为三种级别:

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

(二)LRUCache

  1. 原理概述
    LRUCache是基于LRU(Least Recently Used,最近最少使用)算法实现的缓存工具,常用于ArkTS中缓存一些频繁访问的数据,例如图片、网络请求结果等。它通过LinkedHashMap来实现LRU算法,LinkedHashMap继承于HashMap,其中HashMap用于快速查找数据,LinkedHashMap的双向链表用于记录数据的顺序关系。

  2. 常用方法

    • get方法:根据key查询对应的值,如果没有查到则返回null。查询到对应对象后,将该对象移到链表的尾端,并返回查询的对象。例如,在一个图片浏览应用中,当用户频繁查看不同图片时,LRUCache可以通过get方法快速获取之前查看过的图片缓存,提高加载速度。
    • put方法:用于添加key - value的键值对到缓存中,新对象会存储在链表尾端。当内存缓存达到设定的最大值时,会将链表头部的对象移除。如果key已经存在,则更新当前key对应的value。比如,在一个新闻应用中,每次加载新闻内容及相关图片时,可以使用put方法将这些数据缓存起来,当缓存空间不足时,自动移除最不常用的数据。
    • remove方法:删除key对应的缓存值,如果key对应的value不存在,则返回为null,否则,返回已删除的key - value键值对。例如,当用户手动清除某个图片缓存时,可以使用remove方法实现。
    • updateCapacity方法:用于设置缓存存储的容量,如果新设置的容量newCapacity小于之前的容量capacity,则只保存newCapacity大小的数据。在一个应用的开发过程中,如果发现缓存占用内存过大,可以使用updateCapacity方法适当减小缓存容量。

(三)生命周期管理

  1. 组件生命周期原理
    组件的生命周期包含一系列可自执行的方法,这些方法会在特定的时间点或遇到特定的页面行为时自动触发。通过合理管理组件的生命周期,开发者可以有效地释放资源、销毁对象,从而优化ArkTS内存。

  2. 生命周期中的资源管理

    • UIAbility:在Create或Foreground方法中创建资源,在Background、Destroy方法中销毁对应的资源。例如,在一个音乐播放应用中,当用户打开应用进入前台(Foreground)时,会创建播放相关的资源,如音频解码器等;当用户切换到其他应用,音乐播放应用进入后台(Background)时,会销毁一些不必要的资源,如暂停音频解码器,释放相关内存。
    • 页面:在onPageShow方法中创建资源,在onPageHide方法中销毁资源。以一个电商应用的商品详情页面为例,当用户进入该页面时(onPageShow),会加载商品图片、描述等资源;当用户离开页面(onPageHide),会释放这些资源占用的内存。
    • 组件:在aboutToAppear方法中创建资源,在aboutToDisappear方法中销毁不再使用的对象、注销不再使用的订阅事件;调用组件自带的方法,创建、销毁组件。比如,在一个社交应用的聊天界面组件中,当聊天界面即将出现(aboutToAppear)时,会创建加载聊天记录、头像等资源;当聊天界面即将消失(aboutToDisappear)时,会销毁这些资源,并注销相关的消息推送订阅事件;调用XComponent的onDestroy方法。

(四)Purgeable Memory内存管理机制

  1. 机制介绍
    Purgeable Memory是HarmonyOS中native层常用的内存管理机制,适用于图像处理的Bitmap、流媒体应用的一次性数据、图片等。应用可以使用Purgeable Memory存放内部缓存数据,系统会根据淘汰策略统一管理所有的purgeable内存。当系统内存不足时,系统可以丢弃purgeable内存快速回收资源,以释放更多内存给其他应用程序使用,实现高效的缓存数据管理,提高系统的稳定性和流畅性。

  2. 内存访问和回收流程

  • 访问流程:在访问Purgeable内存时,首先要判断当前Purgeable内存的数据是否已经被回收。如果已被回收,则需要先重建数据再使用。在访问过程中,Purgeable内存对应的引用计数refcnt加1,访问结束后refcnt减1。当引用计数为0时,该Purgeable内存可以被系统回收。

 

  • 回收流程:当引用计数为0时,系统会丢弃Purgeable内存中的数据,并标记Purgeable内存已回收。

四、其他减少内存的方法

  • 使用虚引用(Weak Reference):在HarmonyOS应用开发中,可以使用虚引用(Weak Reference)来避免内存泄漏。通过使用Weak Reference,可以避免循环引用导致的内存泄漏问题,确保对象在不再需要时能够被正确释放。
  • 使用Sendable:符合Sendable协议的数据可以在ArkTS并发实例间传递,从而减少拷贝的开销及其内存。关于Sendable的详细内容可参考《Sendable开发指导》
  • 使用可共享对象:共享对象SharedArrayBuffer,拥有固定长度,可以存储任何类型的数据,包括数字、字符串等。共享对象传输指SharedArrayBuffer支持在多线程之间传递,传递之后的SharedArrayBuffer对象和原始的SharedArrayBuffer对象指向同一块内存,进而达到内存共享的目的。详细内容可参考《可共享对象》

五、总结

本文详细介绍了HarmonyOS系统中多种减少应用内存的方法和工具,包括onMemoryLevel接口、LRUCache、生命周期管理、Purgeable Memory内存管理机制以及其他实用方法。开发者在应用开发过程中应充分利用这些工具和方法,注重内存管理,以提高应用的性能和用户体验,使应用在有限的内存资源下能够高效稳定地运行。

最佳实践

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐