HarmonyOS Next开发学习手册——内存管理(GC)

GC(全称 Garbage Collection),即垃圾回收。在计算机领域,GC就是找到内存中的垃圾,释放和回收内存空间。当前主流编程语言实现的GC算法主要分为两大类:引用计数和对象追踪(即Tracing GC)。ArkTS运行时中就是基于分代模型和混合算法来实现不同场景下内存回收的高性能表现。

在ArkTS中,数据类型分为两类,简单类型和引用类型。简单类型内容直接保存在栈(Stack)中,由操作系统自动分配和释放。引用类型保存在堆(heap)中,需要引擎进行手动释放。GC就是针对堆空间的内存自动回收的管理机制。

Heap结构及其配置参数

Heap结构

  • SemiSpace:年轻代(Young Generation),存放新创建出来的对象,存活率低,主要使用copying算法进行内存回收。
  • OldSpace:老年代(Old Generation),存放年轻代多次回收仍存活的对象会被复制到该空间,根据场景混合多种算法进行内存回收。
  • HugeObjectSpace:大对象空间,使用单独的region存放一个大对象的空间。
  • ReadOnlySpace:只读空间,存放运行期间的只读数据。
  • NonMovableSpace:不可移动空间,存放不可移动的对象。
  • SnapshotSpace:快照空间,转储堆快照时使用的空间。
  • MachineCodeSpace:机器码空间,存放程序机器码。

注:每个空间会有一个或多个region进行分区域管理,region是空间向内存分配器申请的单位。

相关参数

注意
以下参数未提示可配置的均为不可配置项,由系统自行设定。

以下参数值有多个阶段划分的对应heap总大小64MB-128MB/128MB-256MB/大于256MB三个阶段的范围情况,剩余内存空间充足的情况下默认均为第三段大于256MB情况。

Semi Space

heap中会生成两个Semi Space供copying使用。

参数名称范围作用
semiSpaceSize2MB-4MB/2MB-8MB/2MB-16MBsemispace空间大小,会根据堆总大小有不同的范围限制
semiSpaceTriggerConcurrentMark1M/1.5M/1.5M首次单独触发Semi Space的并发mark的界限值,超过该值则触发
semiSpaceStepOvershootSize2MB允许过冲最大大小

其他空间

参数名称范围作用
defaultReadOnlySpaceSize256 KBReadOnlySpace默认空间大小
defaultNonMovableSpaceSize2 MB/6 MB/64 MBNonMovableSpace默认空间大小
defaultSnapshotSpaceSize512 KB/512 KB/ 4 MBSnapshotSpace默认空间大小
defaultMachineCodeSpaceSize2 MB/2 MB/8 MBMachineCodeSpace默认空间大小

Old Space 和 Huge Object Space

初始化时都设定为Heap剩余未分配空间的大小。

参数名称范围作用
oldSpaceOvershootSize4MB/8MB/8MBoldSpace允许过冲最大大小

堆大小相关参数

参数名称范围作用
HeapSize448MB-1024MB堆总大小,实际系统分配大小根据堆类型不同分配不同,或内存池不够会降低下限
SemispaceSize2MB-4MB/2MB-8MB/2MB-16MBsemispace空间大小
NonmovableSpaceSize2MB/6MB/64MBnonmovableSpace空间大小
SnapshotSpaceSize512KB快照空间大小,
MachineCodeSpaceSize2MB机器码空间大小

worker线程堆上限

参数名称范围作用
heapSize768 MBwork类型heap空间大小

解释器栈大小

参数名称范围作用
maxStackSize128KB控制解释器栈帧大小

并发参数

参数名称作用
gcThreadNum7gc线程数量,默认为7,可通过gc-thread-num参数自行设定该参数值
MIN_TASKPOOL_THREAD_NUM3线程池最小线程数
MAX_TASKPOOL_THREAD_NUM7线程池最大线程数

注:该线程池主要用于执行GC流程中的并发任务,实际线程池初始化综合参考gcThreadNum以及线程上下限,gcThreadNum为负值时初始化线程池线程数 = cpu核心数/2

其他参数

参数名称作用
minAllocLimitGrowingStep2M/4M/8Mheap整体重新计算空间大小限制时,控制oldSpace、heapObject和globalNative的最小增长步长
minGrowingStep4M/8M/16M调整oldSpace的最小增长步长
longPauseTime40ms判断是否为超长GC界限,超长GC会触发完整GC日志信息打印,方便开发者定位分析。可通过gc-long-paused-time进行配置

其他:新增单VM内ArrayBuffer的native总内存上限为4GB

GC流程

HPPGC

Young GC

  • 触发机制: 年轻代GC触发阈值在2MB-16MB变化,根据分配速度和存活率等会变化。
  • 说明: 主要回收semi space新分配的年轻代对象。
  • 场景: 前台场景
  • 日志关键词: [ HPP YoungGC ]

Old GC

  • 触发机制: 老年代GC触发阈值在20MB-300多MB变化,大部分情况,第一次Old GC的阈值在20M左右,之后会根据对象存活率,内存占用大小进行阈值调整。
  • 说明: 对年轻代和部分老年代空间做整理压缩,其他空间做sweep清理。触发频率比年轻代GC低很多,由于会做全量mark,因此GC时间会比年轻代GC长,单次耗时约5ms~10ms。
  • 场景: 前台场景
  • 日志关键词:[ HPP OldGC ]

Full GC

  • 触发机制: 不会由内存阈值触发。应用切换后台之后,如果预测能回收的对象尺寸大于2M会触发一次Full GC。DumpHeapSnapshot 和 AllocationTracker 工具默认会触发Full GC。Native 接口和JS/TS 也有接口可以触发。
  • 说明: 会对年轻代和老年代做全量压缩,主要用于性能不敏感场景,最大限度回收内存空间。
  • 场景: 后台场景
  • 日志关键词:[ CompressGC ]

此后的Smart GC或者 IDLE GC 都是在上述三种GC中做选择。

触发策略

空间阈值触发GC

  • 函数方法:AllocateYoungOrHugeObject,AllocateHugeObject,等分配函数
  • 限制参数:对应的空间阈值
  • 说明:对象申请空间到达对应空间阈值时触发GC
  • 典型日志:日志可区分GCReason::ALLOCATION_LIMIT

native绑定大小达到阈值触发GC

  • 函数方法:GlobalNativeSizeLargerThanLimit
  • 限制参数:globalSpaceNativeLimit
  • 说明:影响是否进行全量mark,以及是否开始并发mark

切换后台触发GC

  • 函数方法:ChangeGCParams

  • 说明:切换后台主动触发一次Full GC

  • 典型日志:app is inBackground,app is not inBackground

    GC 日志中可区分GCReason::SWITCH_BACKGROUND

执行策略

ConcurrentMark

  • 函数方法:TryTriggerConcurrentMarking
  • 说明:尝试触发并发mark,将遍历对象进行标记的任务交由线程池中并发运行,减少主线程挂起时间。
  • 典型日志:fullMarkRequested, trigger full mark.,Trigger the first full mark,Trigger full mark,Trigger the first semi mark,Trigger semi mark

new space GC前后的阈值调整

  • 函数方法:AdjustCapacity
  • 说明: 在GC后调整SemiSpace触发水线,优化空间结构。
  • 典型日志:无直接日志,可以通过GC统计日志看出,GC前 young space 的阈值有动态调整。

第一次OldGC后阈值的调整

  • 函数方法:AdjustOldSpaceLimit
  • 说明:根据最小增长步长以及平均存活率调整OldSpace阈值限制
  • 典型日志:"AdjustOldSpaceLimit oldSpaceAllocLimit_: " << oldSpaceAllocLimit << " globalSpaceAllocLimit_: " << globalSpaceAllocLimit_;

第二次及以后的OldGC对old Space/global space阈值调整,以及增长因子的调整

  • 函数方法:RecomputeLimits
  • 说明:根据当前GC统计的数据变化重新计算调整newOldSpaceLimit,newGlobalSpaceLimit,globalSpaceNativeLimit和增长因子
  • 典型日志:“RecomputeLimits oldSpaceAllocLimit_: " << newOldSpaceLimit_ << " globalSpaceAllocLimit_: " << globalSpaceAllocLimit_ << " globalSpaceNativeLimit_:” << globalSpaceNativeLimit_;

PartialGC的Cset 选择策略

  • 函数方法:OldSpace::SelectCSet()

  • 说明:PartialGC执行时采用该策略选择存活对象数量少,回收代价小的Region优先进行GC。

  • 典型日志:Select CSet failure: number is too few,

    "Max evacuation size is 6_MB. The CSet region number: " << selectedRegionNumber;,

    "Select CSet success: number is " << collectRegionSet_.size();

特性

Smart GC

特性介绍

在应用性能敏感场景,通过将js线程(SmartGC对worker线程和taskpool线程不生效)GC触发水线临时调整到js堆最大值(js线程默认448MB),尽量避免触发GC导致应用掉帧。如果敏感场景持续时间过久,对象分配已经达到了堆最大值,则还是会触发GC,且这次GC由于积累的对象太多,GC时间会相对较久。

支持敏感场景

  • 应用冷启动(默认支持)
  • 应用滑动
  • 应用点击页面跳转
  • 超长帧

除应用冷启动是默认支持,其他敏感场景均为调用dfxjsnapi接口进行设置且无本质区别。

日志关键词: “SmartGC”

交互流程

标记性能敏感场景,在进入和退出性能敏感场景时,在堆上标记,避免不必要的GC,维持高性能表现。

IDLE GC

利用系统绘帧过程中存在的线程idletime,高效利用计算资源分段完成完整的GC工作,减少后续累积内存占用触发长GC造成的卡顿。

Incremental Mark

完成old gc通常需要消耗较多时间,一次idle time很难完成此项任务,因此将mark过程分布在多次idle time中完成。

在线性空间扩容时尝试进行Incremental Mark,满足以下条件则触发增量标记:

  • 在ArkProperties里打开ENABLE_IDLE_GC且收到了元能力发送的idleTime开关回调函数;
  • 当前无idleTask且未触发ConcurrentMark;
  • 增量标记完成时,堆大小距到达水线小于256K;
  • 增量标记期间分配对象大小小于100_KB

注:Incremental Mark与Full ConcurrentMark互斥。线性空间主要指的是semiSpace。

Idle YoungGC

在线性空间扩容时尝试进行Idle Collection,满足以下条件则设置相应的IdleTask:

  • 在ArkProperties里打开ENABLE_IDLE_GC且收到了元能力发送的idleTime开关回调函数;
  • 当前无idleTask且未触发ConcurrentMark;
  • 堆大小小于触发YoungGC ConcurrentMark水线256K以内;

注:Idle YoungGC可与ConcurrentMark共存(防止还未接收到IdleTime就达到GC水线),可先触发ConcurrentMark,后开始Idle YoungGC.

GC开发者调试接口

注意
以下接口仅供调试使用,非正式对外SDK接口,不应在应用正式版本中使用。

ArkTools.hintGC()

  • 调用方式:ArkTools.hintGC()
  • 接口类型:js接口
  • 作用:调用后由VM主动触发判断当前是否适合进行一次full GC。后台场景、内存预期存活率低于设定值,则会触发,判断为敏感状态则不会触发。
  • 使用场景:开发者提示系统进行GC
  • 典型日志:无直接日志,仅可区分外部触发(GCReason::EXTERNAL_TRIGGER)

ArkTools.forceFullGC()

  • 调用方式:ArkTools.forceFullGC()
  • 接口类型:js接口
  • 作用:直接触发一次GC,当前线程的local heap触发Full GC,shared heap触发Shared GC。
  • 使用场景:大桌面,开发者调试
  • 典型日志:无直接日志,仅可区分外部触发(GCReason::EXTERNAL_TRIGGER)

使用参考

// 首先需要声明接口
declare class ArkTools {static forceFullGC(): void;static hintGC(): void;
}@Entry
@Component
struct Index {@State message: string = 'Hello World';build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)Button("触发FullGC").onClick((event: ClickEvent) => {ArkTools.forceFullGC();  //方法内直接调用})Button("触发HintGC").onClick((event: ClickEvent) => {ArkTools.hintGC();  //方法内直接调用})}.width('100%')}.height('100%')
}
}

鸿蒙全栈开发全新学习指南

为了积极培养鸿蒙生态人才,让大家都能学习到鸿蒙开发最新的技术,针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线【包含了大厂APP实战项目开发】

本路线共分为四个阶段:

第一阶段:鸿蒙初中级开发必备技能

在这里插入图片描述

第二阶段:鸿蒙南北双向高工技能基础:gitee.com/MNxiaona/733GH

第三阶段:应用开发中高级就业技术

第四阶段:全网首发-工业级南向设备开发就业技术:gitee.com/MNxiaona/733GH

鸿蒙开发面试真题(含参考答案):gitee.com/MNxiaona/733GH

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:gitee.com/MNxiaona/733GH

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/861979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零拷贝技术(zero copy),DMA,mmap,sendfile

在一些高性能的IO场景下我们经常能听到零拷贝技术&#xff0c;这是个不错的话题。 零拷贝指的是内核态与用户态之间的数据拷贝&#xff0c;而这两个区域的数据拷贝只能依靠CPU&#xff0c;但是CPU最重要的作用应该是运算。 一、DMA的由来 在没有DMA之前&#xff0c;磁盘的IO…

Vue.js中的虚拟DOM

一.节点和状态 在我们平常对DOM操作的时候,之前在vue没有诞生之前,以命令式的方式对DOM进行操作,页面上的每一个元素都可以看做成一个节点状态。 二.剔除和渲染 框架都有自己渲染的方式,假设一个页面的状态,随着Ajax请求的放松,状态发生改变,有以下的两种方式供你选择&#…

C语言 do while循环练习 上

do while循环 do循环语句; while&#xff08;表达式&#xff09;; 例&#xff1a; do while里的break do while里的continue 练习 1.计算n的阶乘 1*2*3*424 2.计算1&#xff01;2&#xff01;3&#xff01;.......10! 3.在一个有序数组中查找具体的某个数字h&#x…

吴恩达AI系列:教你如何用Langchain封装一本书

教你快速上手AI应用——吴恩达AI系列教程 人工智能风靡全球,它的应用已经渗透到我们生活的方方面面,从自动驾驶到智能家居,再到医疗辅助和量化交易等等。他们逐渐改变了我们的生活方式,然而,对于许多人来说,AI仍然是一个神秘且无法理解的领域。 为了帮助更多的人理解并掌握AI…

一篇文章带你彻底搞懂十大经典排序之——快速排序

一、递归实现快速排序 1.基本思想 通过一趟排序将待排序记录分割成独立的两部分&#xff0c;其中一部分记录的关键字均比两一部分的关键字小&#xff0c;则课分别对这两部分记录继续进行排序&#xff0c;已达到整个序列有序。 2.算法描述 快速排序使用分治法来吧一个“串”…

QT中利用qss来创建一个圆角矩形窗口,并利用Qt::WA_TranslucentBackground属性解决留白问题

1、效果 2、实现 QWidget#centralwidget {border-radius: 30px solid default;border-image: url(:/images/bk<

探索认知智能的未来:知识图谱的崛起

知识图谱点燃语言模型的潜能 ©作者| 潇潇 来源|神州问学 一、 人工智能的三个层次 在人工智能的发展历程中&#xff0c;我们见证了从简单计算到复杂认知的飞跃。人工智能的发展可以概括为三个主要层次&#xff1a;计算智能、感知智能和认知智能。这三个层次不仅代表了技…

支持向量回归原理详解及Python代码示例

支持向量回归原理详解 支持向量回归&#xff08;Support Vector Regression, SVR&#xff09;是支持向量机&#xff08;SVM&#xff09;的一种扩展&#xff0c;用于回归问题。SVR通过寻找一个最佳的回归超平面&#xff0c;使得尽可能多的数据点落在超平面附近的ε-管内&#xf…

eNSP中VRRP的配置和使用

一、基础配置 1.新建拓扑图 2.配置vlan a.CORE-S1 <Huawei>system-view [Huawei]sysname CORE-S1 [CORE-S1]vlan 10 [CORE-S1-vlan10]vlan 20 [CORE-S1-vlan20]vlan 30 b.CORE-S2 <Huawei>system-view [Huawei]sysname CORE-S2 [CORE-S2]vlan 10 [CORE…

240627_图像24位深度(RGB图)转为8位深度(单通道图)

240627_图像24位深度&#xff08;RGB图&#xff09;转为8位深度&#xff08;单通道图&#xff09; 在使用网络上下载下来的一部分图像分割数据集时&#xff0c;有些标签图你看着是一个黑白图&#xff0c;但是他还是有可能是一张RGB三通道图&#xff0c;具体怎么区分呢。右击图…

FPGA - 图像灰度化

一&#xff0c;灰度图像概念 灰度数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度&#xff0c;尽管理论上这个采样可以任何颜色的不同深浅&#xff0c;甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同&#xff0c;在计算机…

如何预防和处理他人盗用IP地址?

IP地址的定义及作用 解释 IP 地址在互联网中的作用。它是唯一标识网络设备的数字地址&#xff0c;类似于物理世界中的邮政地址。 1、IP地址盗窃的定义 解释一下什么是IP地址盗用&#xff0c;即非法使用他人的IP地址或者伪造IP地址的行为&#xff0c;这种行为可能引发法律和安…

hadoop离线与实时的电影推荐系统-计算机毕业设计源码10338

摘 要 随着互联网与移动互联网迅速普及&#xff0c;网络上的电影娱乐信息数量相当庞大&#xff0c;人们对获取感兴趣的电影娱乐信息的需求越来越大,个性化的离线与实时的电影推荐系统 成为一个热门。然而电影信息的表示相当复杂&#xff0c;己有的相似度计算方法与推荐算法都各…

02逻辑代数与硬件描述语言基础

2.1 逻辑代数&#xff08;简单逻辑的运算&#xff09; 2.2 逻辑函数的卡诺图&#xff08;从图论的角度&#xff09;化简法 2.3 硬件描述语言Verilog HDL基础&#xff08;研究生阶段才用得到&#xff09; 要求&#xff1a; 1、熟悉逻辑代数常用基本定律、恒等式和规则。 2、掌握…

武汉高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

随着科技的不断进步和工业4.0的深入推进&#xff0c;智能制造已成为现代工业发展的重要方向。在这一背景下&#xff0c;武汉高校大学智能制造实验室积极响应国家号召&#xff0c;致力于将先进的数字孪生技术与智能制造教育相结合&#xff0c;打造了一个集教学、实训、科研于一体…

【JavaScript】事件绑定

目录 一、什么是事件 二、常见事件 2.1 鼠标事件 2.2 键盘事件 2.3 表单事件 2.4 页面加载事件 三、浏览器弹窗三种方式 四、事件绑定函数方式 五、事件触发方式 一、什么是事件 事件就是行为动作。在HTML中事件可以是浏览器的行为&#xff0c;也可以是用户的行为。当这些行为发…

基于esp-idf的arm2d移植

什么是ARM2D Arm在Github上发布了一个专门针对“全体” Cortex-M处理器的2D图形加速库——Arm-2D 我们可以简单的把这个2D图形加速库理解为是一个专门针对Cortex-M处理器的标准“显卡驱动”。虽然这里的“显卡驱动”只是一个夸张的说法——似乎没有哪个Cortex-M处理器“配得上…

丝杆支撑座:滚珠丝杆稳定运行的守护者!

丝杆支撑座是丝杆和电机之间连接的重要组成部分&#xff0c;发挥着非常重要的功能。提到丝杆支撑座和滚珠丝杆&#xff0c;很多人都会想到支撑关系&#xff0c;但丝杆支撑座作为滚珠丝杆系统中至关重要的角色&#xff0c;其作用远不止于简单的支撑。 丝杆支撑座安装过程非常简单…

绘唐3是免费的吗?

绘唐科技是一家中国电子信息产品制造商和供应商&#xff0c;成立于2005年。公司主要经营智能硬件、智能穿戴设备、智能家居设备和智能交通设备等领域的产品开发和销售。绘唐科技拥有强大的研发团队和制造能力&#xff0c;能够为客户提供定制化的产品解决方案。 绘唐科技的产品种…

CS-隐藏防朔源-数据转发-iptables(Linux自带的防火墙)

免责声明:本文仅做技术交流与学习... 目录 准备环境: 1-iptables转发机设置转发: 2-CS服务器配置iptables服务器的IP 准备环境: 两台外网服务器. --iptables服务器就是做一个中转...封了中转就没了... 1-iptables转发机设置转发: iptables -I INPUT -p tcp -m tcp --dport 8…