Open3
WebGL-Native: メモリリークを追う
prev: https://zenn.dev/okuoku/scraps/4529390fd6ff82
next: https://zenn.dev/okuoku/scraps/81099a883cf61f
前回までで絵が出たのは良いが、メモリリークがやばいことに気付いた。
Node.jsのv8ヒープ
まず疑うのはNode.jsのV8のヒープだろう。
単純なメモリ制限 → はずれ
というわけで、 node --max-old-space-size=1024 index.js
で実行してみたが特にOut of memoryにはならなかった。
heapdump → はずれ
V8のヒーププロファイラで見てみることにする。
500フレーム目と1000フレーム目にheapdumpしてみた。
差分が殆ど無い。これは外れかな。。
EDIT: Chromeのdevtoolsで直接接続できる。(今回は再現性のためにダンプコードを仕込んだけど)
ネイティブヒープアナライザ
リークしているのは純粋なJavaScriptオブジェクトではなさそうなので、VisualStudioのヒープアナライザを使ってみた。
Node.jsを公式サイトからインストールした場合、PDBシンボルは同梱されないので https://nodejs.org/dist/v14.15.3/win-x64/ から別途ダウンロードしてnode.exeと同じ場所に置く必要がある。
VisualStudioでヒープアナライザを有効にしてデバッグ実行すると、スナップショットを取れるようになる。これを適当な間隔で押して、増えたオブジェクトを観察する。
(実行は超遅くなる。手元の環境だと起動に3分くらい掛かった。。)
トップはCallback queue...?
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();
... バカじゃん。。(修正完了)