郑州管家网站托管,公司网页,做非洲外贸的网站,大学网站开发的流程图GC#xff08;全称 Garbage Collection#xff09;#xff0c;即垃圾回收。在计算机领域#xff0c;GC就是找到内存中的垃圾#xff0c;释放和回收内存空间。当前主流编程语言实现的GC算法主要分为两大类#xff1a;引用计数和对象追踪#xff08;即Tracing GC#xff…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
函数方法AllocateYoungOrHugeObjectAllocateHugeObject等分配函数限制参数对应的空间阈值说明对象申请空间到达对应空间阈值时触发GC典型日志日志可区分GCReason::ALLOCATION_LIMIT
native绑定大小达到阈值触发GC
函数方法GlobalNativeSizeLargerThanLimit限制参数globalSpaceNativeLimit说明影响是否进行全量mark以及是否开始并发mark
切换后台触发GC 函数方法ChangeGCParams 说明切换后台主动触发一次Full GC 典型日志app is inBackgroundapp 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统计的数据变化重新计算调整newOldSpaceLimitnewGlobalSpaceLimitglobalSpaceNativeLimit和增长因子典型日志“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 GCshared 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