javascript - 如何确保 Electron 窗口完全从内存中删除?
问题描述
我知道垃圾收集是 JavaScript 的一个弱点,但我想尽我所能做到这一点。
我正在从我的渲染器进程中创建新窗口,remote
而不是从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.
}
对于let
和var
变量都是如此。
当然全局变量是不同的(当然你不应该有很多):
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 */
从引擎的角度来看,您是否分配null
、undefined
或并不重要123
,因此您可以选择对您最有意义的值。
此外,从哪里创建/分配某些东西也没有什么区别。对于垃圾回收而言,重要的是对象是否“无法访问”,即您的代码无法再次访问它。
要验证它是否有效,您必须使用某种内存分析/分析工具。最简单的形式是使用操作系统的任务管理器。写一个大致如下的测试:
for (var i = 0; i < 100; i++) {
openWindow();
closeWindow();
}
并观察所有相关进程的内存消耗是否不断恢复到原来的值。它可能不会立即执行此操作,相反,您会看到一个“锯齿”模式,其中内存不断增长,直到 GC 启动并再次将其降低。可以考虑在测试中手动强制GC循环;请注意,在生产代码中,这将是浪费时间,因为自动 GC 行为已经非常仔细地调整了启发式方法来平衡垃圾收集所花费的时间与可用内存。
推荐阅读
- bash - Bash 脚本运行,但主要命令没有输出并且未执行
- node.js - websocket自动关闭连接(node.Js)
- javascript - onClick : 从 componentDidMount 调用一个函数
- python - pandas 在添加新列时返回系列而不是数据框
- cloudera - 在 Cloudera Manager 中添加新的服务类型
- vue.js - Vue3:如何将对象从提供传递到索引
- selenium - 安装时黄瓜安装错误
- excel - VBA Dictionary - 通过键获取记录并写入工作表
- c - 忽略while循环中的scanf值
- javascript - 反应功能的计时器未正确启动