消除Java语言中的内存泄漏

垃圾收集语言泄漏的主要原因是不需要的引用。要了解内存泄漏,让我们看看内存释放(垃圾回收)是如何工作的。

标记扫描算法-此算法将“不再需要对象”的定义简化为“对象不可到达”。该算法假定了解一组称为根的对象。在JavaScript中,根是全局对象。GC会定期从这些根目录开始,递归查找从这些根目录引用的所有对象。因此,从根开始,GC将查找所有可到达的对象并收集所有不可到达的对象。

内存泄漏的类型

1.全局变量(未声明/意外)

在JS中,如果不指定声明关键字(let,var,const),则可以意外地全局声明变量。JS查找范围内的变量,直到到达全局范围为止;如果在任何范围内都找不到该变量,它将创建一个全局变量。

示例

function test() {

   a = [1, 2, 3]

}

test()

//已使用关键字对a进行了初始化而无须声明,并且现在处于全局范围内。

console.log(a)

输出结果

[1, 2, 3]

此行为可能会导致内存泄漏,因为变量不知不觉地存在于全局范围中,除非程序结束,否则不会释放它们。这可以通过使用声明关键字来解决。

2.关闭

如果在外部函数中声明了一个变量,则闭包中会发生内存泄漏,并且该变量将自动对嵌套的内部函数可用,即使在嵌套函数中未使用/引用该变量时,该泄漏也会继续存在于内存中。

3.分离的DOM /超出DOM参考

DOM是一个双向链接的树,引用树中的任何节点将阻止整个树进行垃圾回收。分离的DOM或Out of DOM引用表示已从DOM中删除但通过JS处于内存中的节点。这意味着只要在任何地方仍然有对变量或对象的引用,即使将该对象从DOM中删除,也不会对其进行垃圾回收。完成DOM部分后,请务必从JS中删除引用。

4.事件监听器

addEventListener()方法将事件处理程序附加到一个元素,并且可以将多个事件处理程序添加到单个元素。如果DOM元素及其事件侦听器的生命周期不同,则可能导致内存泄漏。

以上是 消除Java语言中的内存泄漏 的全部内容, 来源链接: utcz.com/z/317048.html

回到顶部