消除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