javascript - 我怎样才能确保 Electron 窗口完全从内存中删除?

标签 javascript node.js ecmascript-6 electron v8

我知道垃圾回收是 JavaScript 的弱点,但我想尽我所能做到这一点。

我正在使用 remote 从我的 renderer 进程创建新窗口,而不是从 main 进程创建新窗口,我怀疑我的清理工作很复杂进一步。如果这是一个实质性问题,我可以从进程中创建它们。

下面是我现在创建窗口的方式:

import { remote } from 'electron';

function openInternalImageViewer(url) {
  let imgViewer = new remote.BrowserWindow()
  imgViewer.loadURL(url);
}

只是在通过提供的 API 关闭窗口后将 imgViewer 变量设置为 null 足以达到我的目的,或者我怀疑我需要做更多正确的事情?

最佳答案

您不能直接确保从内存中删除 JavaScript 对象。您只需删除所有不再需要的引用,这样垃圾收集器就可以完成它的工作。 (我不会称其为“弱点”——与必须进行手动内存管理相比,它为您完成所有工作是 JavaScript 的优势。)

您不必担心函数局部变量:当函数返回时,变量无论如何都会超出范围。在此之前手动“清除”它们无济于事。示例:

function openInternalImageViewer(url) {
  let imgViewer = new remote.BrowserWindow()
  imgViewer.loadURL(url);

  /* ...let user interact with imgViewer... */

  imgViewer = null;  // Useless assignment.
}

letvar 变量都是如此。

当然对于全局变量来说是不同的(当然你不应该有很多这样的变量):

var imgViewer;

(function openInternalImageViewer(url) {
  imgViewer = new remote.BrowserWindow()
  imgViewer.loadURL(url);
})(some_url);

/* ...let user interact with imgViewer... */

imgViewer = null;  // This cleanup makes sense!

/* program execution continues, imgViewer no longer needed */

从引擎的 Angular 来看,分配nullundefined123 都没有关系,因此您可以选择无论哪个值对您来说最有意义。

此外,创建/分配内容的位置也没有区别。垃圾回收的关键是对象是否“无法访问”,即您的代码是否无法再次访问它。

要验证它是否有效,您必须使用某种内存分析/分析工具。最简单的形式是使用操作系统的任务管理器。编写一个大致如下的测试:

for (var i = 0; i < 100; i++) {
  openWindow();
  closeWindow();
}

观察所有相关进程的内存消耗是否一直在恢复到原来的值。它可能不会立即执行此操作,而是您会看到一个“锯齿”模式,其中内存不断增长,直到 GC 启动并再次将其关闭。可以考虑在测试中手动强制GC循环;请注意,在生产代码中,这会浪费时间,因为自动 GC 行为已经非常仔细地调整了启发式算法,以平衡垃圾收集所花费的时间与可用内存。

关于javascript - 我怎样才能确保 Electron 窗口完全从内存中删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50752092/

相关文章:

javascript - 如何使框架不可滚动?

node.js - 没有得到 openAI model 的任何回应。给出错误 : Request failed with status code 429

javascript - 使用 Multer 上传文件并在解析和上传到数据库之前将其短暂存储在内存中

javascript - ES6 类 - 更新静态属性

javascript - 如何处理循环引用的类对象?

javascript - React意外调用函数

javascript - 如何在 Jest 中模拟输入文本并按下 Enter 键

Javascript:解析JSON输出结果

javascript - TD 点击时的 JQuery 警报

node.js - mongodb/mongoose arrayFilters (with $[]) 更新不起作用