IC-Canister内存模型与StableMemory管理

1.Canister的内存模型

  • WebAssembly内存模型简介
  • 运行时内存与Statble内存
  • 运行时内存与GC选择
  • 使用Prim库获取内存状态

1.1 WebAssembly内存模型简介

canister与wasm

Motoko和Rust的代码都会编译为wasm,canister会以wasm来执行。而wasm的内存管理就会格外重要

wasm内存模型

  • 页式内存
    • webabssembly的内存管理形式为页式管理,对内存进行分页,每页64KB
  • 线性增长
    • webassembly的内存一经分配不能收回,本质上,wasm的内存时一个数组,数组每个元素表示内存页,每页64KB(65536byte),共65536页,共4G
    • 4G的原因:目前IC使用的wasm标准为wasm32,因为时32位指针域。因此最大只能存储4G(2^32个byte)

canister内存模型

​ canister目前最大可使用内存为12G

运行时内存与GC(Garbage Collection)

IC的垃圾回收很多都可以参考java的jvm虚拟机的GC算法和垃圾回收器

coping gc(也称为Minor GC):

基于拷贝算法的垃圾回收

将内存分割为from和to两块区域,当触发gc时会拷贝(from->t0)和清除(from),同时下一次GC时,有数据的就变成了from,清除完毕的区域变成了to

compacting gc:

标记整理算法的垃圾回收

便利heap,找出所有活体对象(正在活动/被活动的对象引用),标记活体对象。标记完后剩下的就是不被引用或者不再使用的对象,及内存垃圾。然清理内存垃圾并整理活体对象

Prim库

RTS:Run Time System运行时系统

ExperimentalStableMemory库

升级时要留下足够空间用来存储升级时canister内的运行时状态数据

2.StableMemory管理

  • ExperimentalStableMemory库的使用讲解
  • Bucket库的使用