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库的使用