ArkTS 的記憶體空間詳解:從 SemiSpace 到 HugeObjectSpace

SameX發表於2024-10-29

本文旨在深入探討華為鴻蒙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 = "這是一個常量字串";

在上述程式碼中,我們透過 ArkRuntimeConfig.setSemiSpaceSize() 方法設定了 SemiSpace 的大小,並透過 ArkTools.hintGC() 方法觸發年輕代 GC。我們還透過 ArkRuntimeConfig.setOldSpaceOvershootSize() 方法設定了 OldSpace 的過沖大小,並透過 ArkTools.hintOldSpaceGC() 方法觸發老年代 GC。此外,我們還建立了一個大陣列並指定使用大物件空間,以及建立了一個常量字串並指定使用只讀空間。

總結

ArkTS 提供了豐富的記憶體空間管理機制,可以幫助開發者根據不同場景最佳化記憶體使用,提升應用效能。透過了解不同空間的特性和配置引數,如果我們可以更好地管理記憶體資源,就可以避免記憶體洩漏,並提高應用的穩定性。

相關文章