HarmonyOS开发,A持有B,B引用A的场景会不会导致内存泄漏,代码示例告诉你答案
问题 :A持有B,B引用A的场景会不会导致内存泄漏?
答案 :方舟虚拟机的内存管理和GC采用的是根可达算法,根可达算法可以解决循环引用问题,不会导致A引用B,B引用A的内存泄漏。
根可达算法原理
根可达算法以一系列被称为 “根对象”(如栈中的局部变量、静态变量等)作为起始点,从这些根对象开始向下搜索,能够被搜索到的对象被认为是可达对象,而那些无法被搜索到的对象则被判定为不可达对象,会在垃圾回收时被清理。所以,即使存在对象之间的循环引用,只要它们都不可达(即没有根对象能引用到它们),就会被回收。
示例代码:
1. 定义类 A :
class A {
b: B | null = null;
constructor() {
console.log(TEST_TAG, 'A 实例被创建');
}
setB(b: B) {
this.b = b;
}
}
2. 定义类 B :
class B {
a: A | null = null;
constructor() {
console.log(TEST_TAG, 'B 实例被创建');
}
setA(a: A) {
this.a = a;
}
}
3. 主函数调用
@Entry
@Component
struct MyTestP