【发布时间】: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