DEV Community

SameX
SameX

Posted on

ArkTS 的内存空间详解:从 SemiSpace 到 HugeObjectSpace

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。
主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。
本文为原创内容,任何形式的转载必须注明出处及原作者。

引言

ArkTS 作为鸿蒙系统的开发语言,提供了丰富的内存空间管理机制,以满足不同场景下的内存需求。本文将详细解读 ArkTS 的内存空间结构,包括 SemiSpace、OldSpace、HugeObjectSpace、ReadOnlySpace、NonMovableSpace、SnapshotSpace 和 MachineCodeSpace,并介绍如何优化这些空间的使用,提升应用性能。

SemiSpace 内存空间

SemiSpace 是年轻代空间的一部分,用于存放新创建的对象。年轻代空间分为两个半区(SemiSpace),分别用于对象的创建和回收。当其中一个半区空间不足时,会触发年轻代 GC,将存活的对象复制到另一个半区,并回收旧的半区。

OldSpace 和 HugeObjectSpace

OldSpace 用于存放存活时间较长的对象,存活率较高。老年代 GC 主要使用 Sweep 和 Compact 等算法,对老年代空间进行清理和压缩。
HugeObjectSpace 用于存放大对象,如大型数组等。大对象空间使用单独的区域进行管理,以保证大对象的性能。

只读空间与不可移动空间

ReadOnlySpace 用于存放运行期间的只读数据,如字符串常量等。ReadOnlySpace 的内存空间不会被垃圾回收器回收,因此需要谨慎使用。
NonMovableSpace 用于存放不可移动的对象,如系统类对象等。NonMovableSpace 的内存空间不会被垃圾回收器移动,因此需要谨慎使用。

快照与机器码空间

SnapshotSpace 用于转储堆快照时使用的空间。堆快照可以帮助开发者分析内存占用情况和对象关系。
MachineCodeSpace 用于存放程序的机器码。MachineCodeSpace 的内存空间不会被垃圾回收器回收,因此需要谨慎使用。

不同空间的配置参数和优化选项

空间类型 配置参数 作用 优化选项
SemiSpace semiSpaceSize, semiSpaceTriggerConcurrentMark, semiSpaceStepOvershootSize 控制 SemiSpace 的大小和 GC 触发条件 根据应用需求调整参数,提高回收效率
OldSpace oldSpaceOvershootSize 控制 OldSpace 的过冲大小 根据内存占用情况调整参数,避免频繁 GC
ReadOnlySpace defaultReadOnlySpaceSize 控制 ReadOnlySpace 的大小 谨慎使用,避免内存泄漏
NonMovableSpace defaultNonMovableSpaceSize 控制 NonMovableSpace 的大小 谨慎使用,避免内存泄漏
SnapshotSpace defaultSnapshotSpaceSize 控制 SnapshotSpace 的大小 根据需要调整参数,优化快照生成效率
MachineCodeSpace defaultMachineCodeSpaceSize 控制 MachineCodeSpace 的大小 谨慎使用,避免内存泄漏

举个例子

以下示例代码展示了如何在 ArkTS 中指定和优化不同内存空间:

// 设置 SemiSpace 大小
ArkRuntimeConfig.setSemiSpaceSize(8);
// 触发年轻代 GC
ArkTools.hintGC();
// 设置 OldSpace 过冲大小
ArkRuntimeConfig.setOldSpaceOvershootSize(16);
// 触发老年代 GC
ArkTools.hintOldSpaceGC();
// 指定使用大对象空间
let array = new Int32Array(1024 * 1024); // 创建一个 1MB 的数组
// 指定使用只读空间
let constant = "这是一个常量字符串";
Enter fullscreen mode Exit fullscreen mode

在上述代码中,我们通过 ArkRuntimeConfig.setSemiSpaceSize() 方法设置了 SemiSpace 的大小,并通过 ArkTools.hintGC() 方法触发年轻代 GC。我们还通过 ArkRuntimeConfig.setOldSpaceOvershootSize() 方法设置了 OldSpace 的过冲大小,并通过 ArkTools.hintOldSpaceGC() 方法触发老年代 GC。此外,我们还创建了一个大数组并指定使用大对象空间,以及创建了一个常量字符串并指定使用只读空间。

总结

ArkTS 提供了丰富的内存空间管理机制,可以帮助开发者根据不同场景优化内存使用,提升应用性能。通过了解不同空间的特性和配置参数,如果我们可以更好地管理内存资源,就可以避免内存泄漏,并提高应用的稳定性。

Top comments (0)