DEV Community

SameX
SameX

Posted on

ArkTS 编程语言中的垃圾回收模型:分代式 GC 详解

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

引言

垃圾回收(GC)是现代编程语言中重要的内存管理机制,其效率直接影响着应用的性能。ArkTS 作为鸿蒙系统的开发语言,其运行时采用分代式垃圾回收模型,将内存空间划分为年轻代和老年代,并采用不同的回收算法进行优化。本文将深入分析 ArkTS 的分代式 GC 模型,帮助开发者更好地理解其原理和优化策略。

GC 分代模型

ArkTS 的分代式 GC 模型将内存空间划分为以下几部分:

  • 年轻代(Young Generation):用于存放新创建的对象,存活率较低。年轻代空间分为两个半区(SemiSpace),分别用于对象的创建和回收。
  • 老年代(Old Generation):用于存放存活时间较长的对象,存活率较高。老年代空间用于存放年轻代 GC 中未被回收的对象。
  • 大对象空间(HugeObjectSpace):用于存放大对象,如大型数组等。大对象空间使用单独的区域进行管理。
  • 只读空间(ReadOnlySpace):用于存放运行期间的只读数据,如字符串常量等。
  • 不可移动空间(NonMovableSpace):用于存放不可移动的对象,如系统类对象等。
  • 快照空间(SnapshotSpace):用于转储堆快照时使用的空间。
  • 机器码空间(MachineCodeSpace):用于存放程序的机器码。 ### 各代 GC 触发阈值 ArkTS 的 GC 触发机制基于内存空间的占用情况,不同代的 GC 触发条件有所不同:
  • 年轻代 GC:当年轻代空间不足,或者达到预设的阈值时,会触发年轻代 GC。年轻代 GC 主要使用 Copying 算法,将存活的对象复制到另一个半区,并回收旧的半区。
  • 老年代 GC:当老年代空间不足,或者达到预设的阈值时,会触发老年代 GC。老年代 GC 主要使用 Sweep 和 Compact 等算法,对老年代空间进行清理和压缩。 ### 分代回收算法 ArkTS 的分代式 GC 模型采用多种回收算法,以适应不同代的内存特性:
  • Copying 算法:将年轻代空间划分为两个半区(SemiSpace),每次只使用一个半区进行对象分配。当该半区空间不足时,会触发年轻代 GC,将存活的对象复制到另一个半区,并回收旧的半区。
  • Sweep 算法:遍历老年代空间,回收不再使用的对象。
  • Compact 算法:将老年代空间中的对象移动到一起,以提高内存利用率。 ### GC 流程优化 ArkTS 的 GC 流程采用并发和并行优化策略,以提高垃圾回收的效率:
  • 并发标记(Concurrent Mark):在应用程序运行期间,并发地遍历对象图进行标记,减少主线程的挂起时间。
  • 并行回收(Parallel Collection):使用多个线程并行执行垃圾回收任务,提高回收效率。 ### 来份栗子 以下示例代码展示了如何在 ArkTS 中创建对象,并触发年轻代和老年代 GC:
// 创建对象
let obj1 = { name: "张三" };
let obj2 = { name: "李四" };
// 创建数组
let array = [obj1, obj2];
// 删除对象
array.splice(0, 1);
// 触发年轻代 GC
ArkTools.hintGC();
// 触发老年代 GC
ArkTools.hintOldSpaceGC();
Enter fullscreen mode Exit fullscreen mode

在上述代码中,我们创建了两个对象和一个数组,并将其添加到数组中。然后,我们删除数组中的第一个元素,此时对象 obj1 的引用计数变为 0,可以被年轻代 GC 回收。最后,我们调用 ArkTools.hintGC()ArkTools.hintOldSpaceGC() 方法分别触发年轻代和老年代 GC。

总结

ArkTS 的分代式 GC 模型通过将内存空间划分为年轻代和老年代,并采用不同的回收算法进行优化,有效提高了垃圾回收的效率。我们可以通过了解分代式 GC 的原理和优化策略,更好地管理内存资源,提升应用性能。

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

While many AI coding tools operate as simple command-response systems, Qodo Gen 1.0 represents the next generation: autonomous, multi-step problem-solving agents that work alongside you.

Read full post

Top comments (0)

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay