[Seasar-user:18854] Re: Teeda-Ajaxでのメモリ増加

高橋 良子 [E-MAIL ADDRESS DELETED]
2009年 11月 5日 (木) 18:49:46 JST


お世話になります。
高橋(良)です。

いろいろと手間取り、返信が遅くなりました。
申し訳ありません。

> startAutoUpdateが呼ばれるタイミングはどうなっていますか?

チェックボックスの onclickで setAutoUpdate() を呼び出し、そこから
呼ばれます。

> 例えば、TeedaAjaxをやめて同一サンプルをjQueryで動かして
> メモリリークが無ければTeedaAjaxでしょうし、メモリリークが
> 同様に起これば別処理になりますので。
>
> teeda-html-exampleに上書きして動作するサンプルがあると
> 解決しやすいと思います。
> 最小構成で作成可能でしょうか?

jQueryへの移行は少々難しいので、teeda-html-example の ajax.html
および AjaxPage.javaに手を加えて実行しました。

<ajax.html>

  -- (略) --

  var	isLoop;
  function ajax_ajaxPage_ajaxLoopAjax(res){
    var result = $i('loopResult');
    result.innerHTML = res;

    if (isLoop) {
      setTimeout("startLoopAjax()", 10000);
    }
  };

  function startLoopAjax() {
    Kumu.Ajax.executeTeedaAjax(ajax_ajaxPage_ajaxLoopAjax, [],
Kumu.Ajax.RESPONSE_TYPE_TEXT);
  };
  var loopAjax = function() {
    setTimeout("startLoopAjax()", 10000);
    isLoop = true;
  };
  var loopStop = function() {
    isLoop = false;
  };


  KumuEventConf = {
    'click_loopAjax' : loopAjax,
    'click_loopStop' : loopStop,
    'click_startAjax' : startAjax,
    'click_startAjaxObject' : startAjaxObject,
    'click_startAjaxList' : startAjaxList,
    'change_sample1' : combinationList
  }
//]]>
</script>

</head>
<body>

  -- (略) --

<p>繰り返し</p>

<div id="loopResult">ここが変わります</div>
<input type="button" value="Loop Ajax" id="loopAjax" />
<input type="button" value="Loop Stop" id="loopStop" />

<hr/>

  -- (以下略) --

AjaxPage.java : 以下を追加

  private static int	count = 0;
  private final String	loopRes =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

  public String ajaxLoopAjax() {
    count++;
    return "Loop Ajax " + count + ":" + loopRes;
  }


[Loop Ajax]ボタンを押す前のメモリ使用量

  30.2 MB

300回実行後(= 50分後)、[Loop Stop]ボタンを押した後のメモリ使用量

  36.7 MB
 
となりました。
ブラウザは IE6、メモリ使用量は フリーソフトの Process Explorer で
ブラウザ指定で計測しています。

何か原因がわかりますでしょうか。


高橋(良)

[E-MAIL ADDRESS DELETED] さんは書きました:
> 米林です。
> 
> startAutoUpdateが呼ばれるタイミングはどうなっていますか?
> 
> 頂いた情報だけですとTeedaAjaxでメモリリークが起こっているか
> どうか、確証が持てないです。
> 例えば、TeedaAjaxをやめて同一サンプルをjQueryで動かして
> メモリリークが無ければTeedaAjaxでしょうし、メモリリークが
> 同様に起これば別処理になりますので。
> 
> teeda-html-exampleに上書きして動作するサンプルがあると
> 解決しやすいと思います。
> 最小構成で作成可能でしょうか?
> 
> よろしくお願いします。
> 
> 高橋 良子 さんは書きました:
>> はじめまして。
>> 高橋(良)と申します。
>> よろしくお願いします。
>>
>> Teeda-Ajaxを使用してサーバからデータを参照する処理を、
>> setTimeout()により繰り返し実行しているのですが、ブラウザの
>> 使用メモリが増加してしまいます。
>> メモリ消費箇所を特定するために、あちこち省いていったら、
>> 以下のAjax処理を繰り返すのみが残りました。
>>
>> var autoUpdateID;
>> var autoUpdateTimer = 10*1000;
>> var ajaxProcess;
>>
>> function XXX_ajaxUpdate(response) {
>>   clearTimeout(autoUpdateID);
>>   autoUpdateID = setTimeout("startAutoUpdate()", autoUpdateTimer);
>> }
>>
>> //自動更新 Ajax処理 (Teeda-Ajax)
>> function startAutoUpdate() {
>>   if (ajaxProcess) {
>>     ajaxProcess.cancel();
>>   }
>>   ajaxProcess = null;
>>
>>   ajaxProcess = Kumu.Ajax.executeTeedaAjax(
>>                              XXX_ajaxUpdate,
>>                              [param1, param2, param3],
>>                              Kumu.Ajax.RESPONSE_TYPE_TEXT);
>> }
>>
>> //自動更新処理開始/停止
>> function setAutoUpdate(obj) {	//<- objはチェックボックス
>>   if (obj.checked) {
>>     autoUpdateID = setTimeout("startAutoUpdate()", autoUpdateTimer);
>>   } else {
>>     clearTimeout(autoUpdateID);
>>   }
>> }
>>
>> 上記の処理ではメモリは一切増えないでほしいのですが...。
>>
>> メモリの増加量は、サーバからの送信データ量に比例しているようです。
>>
>> 使用ブラウザは IE6, Firefox3.5で、Firefoxのほうが増加量が多いです。
>>
>> 原因は何が考えられるでしょうか。
>>
>>
>> 高橋(良)
> 




Seasar-user メーリングリストの案内