Open3

WebGL-Native: メモリリークを追う

okuokuokuoku

Node.jsのv8ヒープ

まず疑うのはNode.jsのV8のヒープだろう。

単純なメモリ制限 → はずれ

というわけで、 node --max-old-space-size=1024 index.js で実行してみたが特にOut of memoryにはならなかった。

heapdump → はずれ

V8のヒーププロファイラで見てみることにする。

https://github.com/bnoordhuis/node-heapdump

500フレーム目と1000フレーム目にheapdumpしてみた。

https://github.com/okuoku/cwgl-proto/commit/1f85d9942845fb2362a74f33300b0523e903da4b

差分が殆ど無い。これは外れかな。。

EDIT: Chromeのdevtoolsで直接接続できる。(今回は再現性のためにダンプコードを仕込んだけど)

okuokuokuoku

ネイティブヒープアナライザ

リークしているのは純粋なJavaScriptオブジェクトではなさそうなので、VisualStudioのヒープアナライザを使ってみた。

Node.jsを公式サイトからインストールした場合、PDBシンボルは同梱されないので https://nodejs.org/dist/v14.15.3/win-x64/ から別途ダウンロードしてnode.exeと同じ場所に置く必要がある。

VisualStudioでヒープアナライザを有効にしてデバッグ実行すると、スナップショットを取れるようになる。これを適当な間隔で押して、増えたオブジェクトを観察する。

(実行は超遅くなる。手元の環境だと起動に3分くらい掛かった。。)

トップはCallback queue...?

https://github.com/okuoku/cwgl-proto/commit/d9e6dd62e2547d217afef44387219ae99d393c71

diff --git a/jstestapp/index.js b/jstestapp/index.js
index 8d730db..a75251b 100644
--- a/jstestapp/index.js
+++ b/jstestapp/index.js
@@ -147,7 +147,7 @@ wnd.navigator.getGamepads = function(){
 
 wnd.requestAnimationFrame = function(cb){
     //console.log("rAF");
-    process.nextTick(async function(){
+    setImmediate(function(){
         checkheapdump();
         g_ctx.cwgl_frame_end();
         const now = performance.now();

... バカじゃん。。(修正完了)