25341


Monacaで空のプロジェクトを作成し、下記のjavascriptを実行しました。

[code]

      setItv();
      function setItv() {
        setInterval(function(){
        }, 5000);
      }
    
[/code]

これをメモリ監視すると、5秒ごとに階段状にいつまでもメモリが積もっていきました。  
MonacaでのsetIntervalの仕様なのでしょうか？  
それともsetIntervalはこのようなものなのでしょうか。

【追記】  
確認環境は Android 4.4.4 (402SH) です。

【補足】  
Monaca以外の環境でも現象を確認しましたので、monacaタグを取り、javascriptととしての質問に変更させていただきます。  
1.5分を過ぎたころからGCが一切動かな‌​くなり、数分ごとにメモリが階段状に増えていきます。

確認環境は、  
Monacaデバッガー + Android 4.4.4 (402SH)  
Monacaでのデバッグビルドapk + Android 4.4.4 (402SH)  
Cordova6.2.0でのビルドapk + Android 4.4.4 (402SH)  
PC(win7) + chrome


CC BY-SA 3.0
2016-05-30T08:18:15.020
25294
2016-05-31T12:18:49.230
2016-05-31T04:29:35.337
7352
7352
question
javascript
setIntervalを使用するとコールバック毎にメモリが増えていく


`monaca`で`OnsenUI`をつかってますか？  
`OnsenUI`は最初にアクセスする`index.html`からブラウザ視点でみると遷移しません。  
`index.html`に`ons-page`を読み込み追加して表示します。

ですので、グローバルの`window`にバインドされるタイマーは  
`OnsenUI`で`pushPage`で遷移してものこります。

`prePush`や、`prePop`のイベントにバインドし、タイマーをクリアしないと残り続けます。


CC BY-SA 3.0
2016-05-30T09:00:17.820
25298
2016-05-30T09:00:17.820
25294
answer


自己レスですが、この現象が同じことなのかと思われます。  
<https://stackoverflow.com/questions/14034107/does-javascript-setinterval-
method-cause-memory-leak>

リークしているわけではなく、現状そういう仕様である、というのが答えなのかもしれません。


CC BY-SA 3.0
2016-05-31T09:46:49.460
25338
2016-05-31T09:46:49.460
2017-05-23T12:38:56.083
-1
7352
25294
answer


> ただ落ちる落ちない‌​は別としても、メモリが溜まっていく原因を明らかにできればと思っています

GCのタイミングは処理系依存ですが、Android(4.4.4)を観察する限り、単純なケースだと下記のどちらかで行なわれる事が多いようです。

  * メモリ使用量が閾値を越える
  * 暇な（イベントの発生などがない）状態が一定時間続く

質問の状況ですと、メモリの使用量は5秒ごとに関数の実行で多少増えていきますが、閾値にはなかなか達しません。  
5秒ごとに`setInterval`がイベントを起しますので、暇になるタイミングもありません。  
よって、メモリ使用量が右肩上りで、GCは行なわれない、という状況になります。

これは`setInterval`に限らず起ります。例えば`click`イベントに何もしない関数をバインドし、5秒おきに外部からクリックしてやる事でも再現します。

また、問題になる事でもありません。放っておけばいずれ上記のGCタイミングの「メモリ使用量が閾値を越える」状況になりますのでGCされます。インターバルを5000msではなく100msくらいにして実験すればすぐに観察出来るはずです。


CC BY-SA 3.0
2016-05-31T12:18:49.230
25341
2016-05-31T12:18:49.230
3054
25294
answer