2017-01-14 21 views
1

私は巨大なangular.js/nodeアプリケーションをNW.jsに移植しています。アプリのメモリ使用量を確認するまではすべて問題ありませんでした。 アプリが起動したとき、nwjsヘルパープロセスは75MBを消費しました。 最初のリロード後に、location.reload()またはwin.reload()を使用すると、メモリ使用量が110MBに増加しました。 2回目のリロード、125MB。 3回目のリロード、155MB、4回目のリロード、180MB。 5回目のリロード、205 MB、6回目のリロード235 MB ...など。 20または25のリロードで、アプリがクラッシュしました。 アプリケーションには、再ロードを行っても30MBのメモリ使用率で安定した子ノードプロセスがあります。 ノードとクロムの間でコンテキストが共有されていないため、ノードとクロムプロセス間のすべての通信はlocalStorageを使用して行われます。 ウェブアプリケーションとしてChromeで実行されている同じ角度のアプリにはメモリリークがなく、メモリはリロードごとにゼロから開始されます。NW.jsのリロード時にすべてのメモリをフラッシュします

chrome.runtime.reload()を使用して部分的な解決策が見つかりましたが、問題は、クロムビューを更新するだけでなく、すべての子プロセス(終了してアプリを再起動する)です。私はメインビューがリフレッシュされるときにノードプロセスを実行する必要があります。私はフォーラムで、クロムWebビューのページから他のページに移動するときにメモリリークが発生するのと同じ問題を抱えていると読んでいます。私はリロードする前にノードごとにメモリノードをすべて消去しようとしましたが、何も起こりません(Robert CMosesKałamańskiのBlack Holeプログラムを使用して)。私はglobal.gc()"js-flags": "--expose-gc"を使ってみましたが何も起こりませんでした。

私はいくつかの変数だけで別の簡単なアプリケーションを作って、リロード時に同じメモリリークが発生しました。私はNW.jsデモアプリケーションを試しました(パラメータなしでnwjsを実行すると)、nw、chrome、およびノー​​ドバージョンのグレーの画面が表示されます。この単純なページで右クリック - アプリケーションを何度かリロードすれば、メモリ使用量も上がります... OMG !!!!

再ロード時にウィンドウをアンロードする直前に、NW.JSのクロムビューのすべてのメモリをフラッシュする方法はありますか?すべてのjavascriptオブジェクトとDOMノードを安全に消去する方法はありますか?これはNW.jsのメモリ管理のバグですか?

私は、ノードのコンテキスト内のDOMオブジェクトへの参照がないことを確認してくださいNW.jsのVに0.19.4

答えて

0

を使用しています。 Nodeコンテキストは、バックグラウンドページに存在し、アプリケーションの存続期間中は動作し続けます。これを行うには、devtools内のヒーププロファイラーを使用して、どのオブジェクトが参照されているかを調べます。

もう1つの方法は、ノードコンテキストとDOMコンテキストが同じ「混合コンテキスト」モードを使用することです。

はもっとここを参照してください:http://docs.nwjs.io/en/latest/For%20Users/Advanced/JavaScript%20Contexts%20in%20NW.js/

+0

私は結果なしで、あなたが言及したすべてのものを試してみました。私が掲示したように、あなたがノードにアクセスせずに非常に単純なアプリケーションを作成してリロードを開始すると、リロードごとにメモリが増加します。 nwjsのランディングページを試してみると、同じエラーが発生します。 –

+0

SDKの有無にかかわらず、nw.js 0.19.5で同じ問題がテストされました... –

+0

Roger、私は本当にあなたのサポートに感謝します。私は私のチームの上級メンバー2人もニュースなしでこの問題を調査しています。解決策が見つからない場合は、私の趣味ではなく、このメモリリークの問題なしに、私たちが調査したところで電子に移動しなければなりませんフォーラムで)。このアプリは、角度のあるJS 1.5上に構築されており、コードが膨大です(それを使って300以上のレストランがあるレストランアプリ、Toteatをチェックしてください)。このアプリケーションには、ポート80でHTTPリクエストを受信し、ポート8080でソケットプロセスを受信するノードプロセスがあります。すべての通信はlocalStorageを介して行われ、データはwebsqlに保存されます。 –

関連する問題