如果渲染器进程关闭,则会收集电子全局变量垃圾?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果渲染器进程关闭,则会收集电子全局变量垃圾?相关的知识,希望对你有一定的参考价值。

在Electron中,我的主要进程是打开BrowserWindow。 BrowserWindow加载一个html页面,然后同一窗口最终加载另一个html页面。

main.js

var mainWindow;
global.mainState = {
  settings: {}
}
mainWindow = createWindow('main', {
  width: 1000,
  height: 800,
});
if (curState == 'load') {
  mainWindow.loadURL(`file://${__dirname}/interface/load.html`, {})
}
if (curState == 'login') {
  mainWindow.loadURL(`file://${__dirname}/interface/login.html`, {})
}

load.html

const remote = require('electron').remote;
var testGlobal = remote.getGlobal('mainState')
testGlobal.settings = 'test value'
testGlobal.settings.inner = 'test value2'

当main.js加载第二页(login.html)时,是否会删除/取消引用全局变量?文档说如果渲染器进程取消引用全局变量,那么变量将是gc'd。当我尝试测试这个时,我会得到不一致的结果,我只想从比我更明智的人那里得到一些解释。

答案

由于网站的变化,testGlobal将被垃圾收集。 global.mainState不会被删除,但是当你打电话给testGlobal.settings = 'test value'时它也不会改变,因为remote.getGlobal()只给你一份mainState而不是参考。

我建议你使用ipcMainipcRenderer自己同步全局变量。

另一答案

Use IPC to Set the Global's Value.

@RoyalBingBong是正确的,“remote.getGlobal()只给你一份mainState而不是参考。”

看起来你可能正在改变全局变量的值,但事实并非如此。因此,例如,当我刷新Electron浏览器窗口时,该全局变量的值将恢复到原来的状态。

我发现正确改变全局变量值的唯一方法是使用ipcMainipcRenderer(冗长的方式)。

main.js

const { ipcMain } = require( "electron" );

ipcMain.on( "setMyGlobalVariable", ( event, myGlobalVariable ) => {
  global.myGlobalVariable = myGlobalVariable;
} );

renderer.js

const { ipcRenderer, remote } = require( "electron" );

// Set MyGlobalVariable.
ipcRenderer.send( "setMyGlobalVariable", "Hi There!" );

// Read MyGlobalVariable.
remote.getGlobal( "MyGlobalVariable" ); // => "Hi There!"

现在,我可以刷新我的Electron窗口或启动一个新的渲染器进程,全局变量的值将正确地设置为它,在本例中为“Hi There!”。

您还可以看到,为了阅读它,我使用更简单的remote.getGlobal。我没有测试当值发生变化时这是否会导致问题并且未更新此值。如果是这种情况,我可能不得不回到这个答案,并使用另一个ipcMainipcRenderer来手动读取全局变量。

以上是关于如果渲染器进程关闭,则会收集电子全局变量垃圾?的主要内容,如果未能解决你的问题,请参考以下文章

垃圾收集机制

内存泄漏的情况

构建垃圾邮件分类器

寻找垃圾收集根[关闭]

在电子的渲染器进程中使用 npm 模块

垃圾收集需要很长时间[如何调试收集的内容?]