Typescript / Javascript 垃圾收集器是处理循环引用还是泄漏内存?
Does Typescript / Javascript garbage collector handle circular references or does it leak memory?
在像 C#
这样的语言中这不是问题,但是这会导致在其他一些语言中很难找到内存错误。我可以在 Typescript
或 Javascript
中使用以下代码并相信一切都会好起来吗?
class Dad {
kids: Kid[];
}
class Kid {
dad: Dad;
siblings: Kid[];
}
let anakin: Dad | undefined;
function makeKids(dad: Dad) {
const luke = new Kid();
const leia = new Kid();
luke.dad = dad;
leia.dad = dad;
luke.siblings = [leia];
leia.siblings = [luke];
dad.kids = [luke, leia];
}
anakin = new Dad();
makeKids(anakin);
console.log(anakin.kids.length); // Prints out 2
anakin = undefined;
// I expect luke and leia to die at this point
// Not float around the memory space infinitely
或者我应该将变量 kids 和 siblings 设为可选并添加一个 destructor
?像这样:
kids?: Kid[];
siblings?: Kid[];
destructor() {
this.kids = undefined
}
这是一个相关主题,我对答案不满意:
TypeScript 没有运行时。
有很多 JavaScript 运行时,所以不可能说 所有 某些特定的东西都是真的,但是所有主要的运行时(那些在流行的浏览器,node.js) 很容易处理断开连接的循环引用。
JS中有一个定义明确的内存根,可以很容易地进行标记清除GC,处理循环引用没有问题。循环引用实际上只是 ref-counted GC 系统中的一个问题,没有很好的理由在 JS 语言中进行 ref 计数,因为您不需要确定性清理。
在像 C#
这样的语言中这不是问题,但是这会导致在其他一些语言中很难找到内存错误。我可以在 Typescript
或 Javascript
中使用以下代码并相信一切都会好起来吗?
class Dad {
kids: Kid[];
}
class Kid {
dad: Dad;
siblings: Kid[];
}
let anakin: Dad | undefined;
function makeKids(dad: Dad) {
const luke = new Kid();
const leia = new Kid();
luke.dad = dad;
leia.dad = dad;
luke.siblings = [leia];
leia.siblings = [luke];
dad.kids = [luke, leia];
}
anakin = new Dad();
makeKids(anakin);
console.log(anakin.kids.length); // Prints out 2
anakin = undefined;
// I expect luke and leia to die at this point
// Not float around the memory space infinitely
或者我应该将变量 kids 和 siblings 设为可选并添加一个 destructor
?像这样:
kids?: Kid[];
siblings?: Kid[];
destructor() {
this.kids = undefined
}
这是一个相关主题,我对答案不满意:
TypeScript 没有运行时。
有很多 JavaScript 运行时,所以不可能说 所有 某些特定的东西都是真的,但是所有主要的运行时(那些在流行的浏览器,node.js) 很容易处理断开连接的循环引用。
JS中有一个定义明确的内存根,可以很容易地进行标记清除GC,处理循环引用没有问题。循环引用实际上只是 ref-counted GC 系统中的一个问题,没有很好的理由在 JS 语言中进行 ref 计数,因为您不需要确定性清理。