javascript - 实例未被垃圾回收

标签 javascript memory-leaks garbage-collection google-chrome-devtools

我的情况是这样的,我在本地范围内创建了类的实例,这个实例在构造期间分配了一个具有绑定(bind)上下文的方法作为事件处理程序。

最小示例:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">

    <title>Minimal</title>
    <meta name="description" content="The HTML5 Herald">
    <meta name="author" content="SitePoint">
</head>
<body>
    <a>Hello</a>
    <button>Click</button>
    <script text="javascript">

(function()
{
    class App
    {
        constructor()
        {
            let anchor = document.getElementsByTagName(`a`)[0];
            let anchorHandler = this.sayClicked.bind(this);
            anchor.addEventListener(`click`, anchorHandler, false);
        }

        sayClicked()
        {
            alert(`Clicked`); 
        }
    }

    new App();
})();


    </script>
</body>
</html>

我知道在 IIFE 执行后,仅引用 App 实例是具有绑定(bind)上下文的事件处理程序。到目前为止,Chrome 内存选项卡向我展示了很好的

enter image description here

我的问题是,删除 anchor 元素后(删除是通过控制台实现的,控制台被删除),Chrome 内存仍然在内存中显示 App 实例。我不明白,我相信唯一的引用是事件处理程序,根据 this事件处理程序也应该被删除,这意味着只对 App 实例的引用也应该被删除,所以我期望垃圾收集。在堆快照之前我强制进行了垃圾回收,但是 App 实例仍然存在

enter image description here

在 native_bind() 中绑定(bind) _this 旁边是窗口图标,Chrome 告诉我可以从窗口访问它。我尝试检查窗口,但无法访问 App 实例。

最佳答案

通过控制台删除 anchor 和直接通过您的站点删除 anchor 是有区别的。如果您通过文档删除元素,则该应用程序将不再存在于内存中。 Try this

关于javascript - 实例未被垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59903188/

相关文章:

wpf - 使用 SharedResourceDictionary 时出现内存泄漏

iphone - 错误 : can't allocate region in iOS

c# - 如何解决私有(private)字节( native 内存)泄漏?

.net - Finalize() 期间的异常 : what methodology are you using to detect garbage collector-time exceptions?

android - 如何阻止垃圾收集器在android中被调用

javascript - trim anchor 标记内的空间

javascript - 使用 api v3 绘制多条编码多段线

c# - 我可以在 using() 之外声明上下文并仍然调用 Dispose() 吗?

javascript - 如何设置下拉菜单以在javascript中的onclick事件后进行选择

javascript - 使用网络摄像头捕获个人资料图片并在 Canvas 中显示图片