BrowserWindow,Electron中的内存泄漏

时间:2016-09-21 08:52:20

标签: node.js memory memory-leaks electron

当从Tray实例单击菜单项时,我启动了一个新的BrowserWindow。每当窗口关闭时,它也会退出整个应用程序,包括托盘实例。为了克服这一点,我使用下面的代码:

click: function () 
{
    var win = new BrowserWindow({
        width: 400,
        height: 600,
        resizable: false,
        fullscreen: false,
        title: 'About',
        icon : __dirname+'/assets/logo/windowIcon.png'
    })
    win.setMenu(null)
    win.loadURL(`file://${__dirname}/about.html`)
    // win.webContents.openDevTools()

    win.on('close', function (e) 
    {
        e.preventDefault()
        win.hide() 
        win.removeAllListeners('close')
    })
}

但后来我发现即使在窗口关闭后,BrowserWindow实例也不会从内存中丢弃/释放。

Memory Leak

每次单击该菜单时,它都会打开一个新窗口,但在关闭它时,它不会从内存中释放出来,而且进程只会叠加到内存中。

如何在不终止Tray实例的情况下从内存中释放BrowserWindow实例?

2 个答案:

答案 0 :(得分:0)

当所有窗户关闭时,您的主要流程是做什么的?以下是电子快速启动的功能:

// Quit when all windows are closed.
app.on('window-all-closed', function () {
  // On OS X it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

答案 1 :(得分:0)

通过在事件上调用preventDefault(),可以防止窗口在主进程中被销毁,因此它会被泄露。

您可以定义对窗口的模块级引用,而不是在每次单击时创建一个新窗口,而只在第一次单击菜单项时创建它:

// Module scope
let win = null;

// ... your menu code

click: function () {
    if(win === null) {
        win = new BrowserWindow({
            width: 400,
            height: 600,
            resizable: false,
            fullscreen: false,
            title: 'About',
            icon : __dirname+'/assets/logo/windowIcon.png'
        });

        win.setMenu(null);
        win.loadURL(`file://${__dirname}/about.html`);

        win.on('close', function (e) {
            e.preventDefault();
            win.hide();
        });
    } else {
        win.show();
    }
}

然而,正如Vadim Macagon指出的那样,看起来你在应用程序中定义了一个“全窗口关闭”事件,当所有窗口关闭时,它会被告知退出。在'window-all-closed'上搜索所有文件并删除app.quit()调用。如果你这样做,你应该能够按原样保留你的代码。