【问题标题】:Flush all memory on reload in NW.js在 NW.js 中重新加载时刷新所有内存
【发布时间】:2017-05-29 19:31:23
【问题描述】:

我正在将一个巨大的 angular.js / node 应用程序移植到 NW.js。一切都很好,直到我检查了应用程序的内存使用情况。 当应用启动时,nwjs Helper 进程消耗了 75MB。 第一次重新加载后 - 使用 location.reload()win.reload() - 内存使用量上升到 110MB。第二次重新加载,125MB。第三次重新加载,155 MB,第四次重新加载,180 MB。第五次重新加载,205 MB,第六次重新加载 235 MB……等等。在 20 或 25 次重新加载时,应用程序崩溃了。 该应用程序具有子节点进程,可在重新加载时将其内存使用量稳定在 30MB。 node 和 chrome 之间没有共享上下文,node 和 chrome 进程之间的所有通信都是使用 localStorage 完成的。 在 Chrome 上运行与 Web 应用相同的 Angular 应用没有任何内存泄漏,并且每次重新加载时内存从零开始。

我找到了使用 chrome.runtime.reload() 的部分解决方案,但问题是它不仅刷新了 chrome 视图,而且刷新了所有子进程(就像退出并重新启动应用程序)。我需要维护在刷新主视图时运行的节点进程。我在论坛上读到,许多人在 chrome webview 中从页面导航到其他页面时出现内存泄漏的相同问题。我尝试在重新加载之前逐个节点擦除所有内存,但没有任何反应(使用 Robert CMoses Kałamański 的黑洞程序)。我尝试将global.gc()"js-flags": "--expose-gc" 一起使用,但什么也没发生。

我制作了另一个只有几个变量的简单应用程序,并且在重新加载时出现了相同的内存泄漏。我尝试了 NW.js 演示应用程序(当您不带任何参数运行 nwjs 时)它出现了一个带有 nw、chrome 和 node 版本的灰色屏幕。如果你在这个简单的页面上右键-Reload App 几次,内存使用量也会上升...... OMG!!!!

在重新加载时卸载窗口之前,有什么方法可以在 NW.JS 中刷新 chrome 视图的所有内存?是否有任何安全的方法可以擦除所有 javascript 对象和 DOM 节点? 或者这是 NW.js 内存管理的错误?

我正在使用 NW.js v 0.19.4

【问题讨论】:

    标签: angularjs google-chrome chromium node-webkit nw.js


    【解决方案1】:

    请确保在 Node 上下文中没有对 DOM 对象的引用。 Node 上下文存在于后台页面中,并在应用程序的整个生命周期中保持运行。为此,请使用 devtools 中的堆分析器找出引用的对象。

    另一种方式是使用“混合上下文”模式,其中 Node 上下文和 DOM 上下文是相同的。

    在此处查看更多信息:http://docs.nwjs.io/en/latest/For%20Users/Advanced/JavaScript%20Contexts%20in%20NW.js/

    【讨论】:

    • 我尝试了你提到的一切,但没有结果。正如我所发布的,如果您在不访问节点的情况下制作了一个非常简单的应用程序并开始重新加载,那么每次重新加载后您的内存都会增加。尝试使用nwjs的登陆页面,你会得到同样的错误。
    • 罗杰,我真的很感谢您在这里的支持。我的团队还有两名高级成员正在调查这个问题,没有任何消息,如果我们找不到解决方案,我们将不得不转向电子(不是我的口味,但没有这个内存泄漏问题,据我们调查在论坛中)。该应用程序基于 Angular js 1.5 构建,代码量很大(有 300 多家餐厅使用它的餐厅应用程序,请查看 Toteat)。该应用程序有节点进程在端口 80 上侦听 http 请求,在端口 8080 中侦听套接字。所有通信都通过 localStorage 完成,数据保存在 websql 中。
    • @ReneMarty 您可以报告附带的简单应用程序的问题。我很快就会看到。
    猜你喜欢
    • 2019-10-20
    • 2014-11-09
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多