什么是JavaScript垃圾收集?为了编写更好的代码,web程序员了解JavaScript垃圾收集的重要方面是什么?
当前回答
在javascript中,垃圾收集是不确定的,对象何时会被清除,或者是否会被清除。这适用于强引用的对象。强引用对象不受垃圾回收的影响。
在ES12之后,可以执行以下实现来检查对象何时被垃圾收集。
要了解更多关于javascript垃圾收集的知识,你可以使用ES12之后可用的终结器。
let a = new Array(200).fill(true);
构造定稿器
const cleanup = new FinalizationRegistry(key => {
// your code here
});
cleanup.register(a, 'wewew');
对象'a'现在不可达,终结器回调将在垃圾收集后发生
其他回答
在javascript中,垃圾收集是不确定的,对象何时会被清除,或者是否会被清除。这适用于强引用的对象。强引用对象不受垃圾回收的影响。
在ES12之后,可以执行以下实现来检查对象何时被垃圾收集。
要了解更多关于javascript垃圾收集的知识,你可以使用ES12之后可用的终结器。
let a = new Array(200).fill(true);
构造定稿器
const cleanup = new FinalizationRegistry(key => {
// your code here
});
cleanup.register(a, 'wewew');
对象'a'现在不可达,终结器回调将在垃圾收集后发生
垃圾收集(GC)是通过删除不再需要的对象来自动进行内存管理的一种形式。
任何处理内存的进程都遵循以下步骤:
1 -分配你需要的内存空间
2 -做一些处理
3 -释放这个内存空间
有两种主要的算法用于检测哪些对象不再需要。
引用计数垃圾收集:该算法将“一个对象不再需要”的定义简化为“一个对象没有其他对象引用它”,如果没有引用点,该对象将被删除
标记扫描算法:将每个对象连接到根源。任何对象都不连接根或其他对象。该对象将被移除。
目前大多数现代浏览器使用第二种算法。
这句话摘自博客
DOM组件是“垃圾收集”的,JScript组件也是如此,这意味着如果您在任何一个组件中创建了一个对象,然后失去了对该对象的跟踪,它最终将被清除。
例如:
function makeABigObject() {
var bigArray = new Array(20000);
}
When you call that function, the JScript component creates an object (named bigArray) that is accessible within the function. As soon as the function returns, though, you "lose track" of bigArray because there's no way to refer to it anymore. Well, the JScript component realizes that you've lost track of it, and so bigArray is cleaned up--its memory is reclaimed. The same sort of thing works in the DOM component. If you say document.createElement('div'), or something similar, then the DOM component creates an object for you. Once you lose track of that object somehow, the DOM component will clean up the related.
当涉及到DOM对象时,要注意循环引用:
JavaScript中的内存泄漏模式
请记住,只有在没有对对象的活动引用时才能回收内存。这是闭包和事件处理程序的一个常见陷阱,因为一些JS引擎不会检查内部函数中实际引用了哪些变量,而只是保留封闭函数的所有局部变量。
这里有一个简单的例子:
function init() {
var bigString = new Array(1000).join('xxx');
var foo = document.getElementById('foo');
foo.onclick = function() {
// this might create a closure over `bigString`,
// even if `bigString` isn't referenced anywhere!
};
}
只要事件处理程序存在,简单的JS实现就不能收集bigString。有几种方法可以解决这个问题,例如在init()末尾设置bigString = null (delete对局部变量和函数参数不起作用:delete将从对象中删除属性,并且变量对象不可访问-如果您试图删除局部变量,ES5在严格模式下甚至会抛出ReferenceError !)
如果您关心内存消耗,我建议尽可能避免不必要的闭包。
在计算机科学中,垃圾收集(GC)是自动内存管理的一种形式。垃圾收集器,或者仅仅是垃圾收集器,尝试回收垃圾或对象所使用的内存,这些对象将永远不会被应用程序再次访问或更改。”
所有JavaScript引擎都有自己的垃圾收集器,它们可能有所不同。大多数时候你不需要和他们打交道,因为他们只是在做他们应该做的事情。
写出更好的代码主要取决于你对编程原理、语言和特定实现的了解程度。
推荐文章
- 如何让一个按钮将我的页面重定向到另一个页面?
- 如何让元素被点击(对于整个文档)?
- 我如何检查如果一个变量是JavaScript字符串?
- 如何检测如果多个键被按下一次使用JavaScript?
- 如何通过history. pushstate获得历史变化的通知?
- 使用jQuery改变输入字段的类型
- 在JavaScript中,什么相当于Java的Thread.sleep() ?
- 使用jQuery以像素为整数填充或边距值
- 检查是否选择了jQuery选项,如果没有选择默认值
- Next.js React应用中没有定义Window
- 如何重置笑话模拟函数调用计数之前,每次测试
- 如何强制一个功能React组件渲染?
- 在javascript中从平面数组构建树数组
- 将Dropzone.js与其他字段集成到现有的HTML表单中
- 如何在AngularJS中观察路由变化?