2011-07-06 18 views
0

メモリリークを引き起こすajaxコードがあります(特にIEの場合)。ajaxのメモリリーク - setInterval

function setStatus() {    
    var formInput=$(this).serialize(); 
    $.getJSON('CheckStatus.action', formInput, function(data) {         
      if(data == false) {  
       function getEventsPeriodicaly() { 
        getEvents(); 
       }; 

       var timer = setInterval(function() {getEventsPeriodicaly();}, 5000); 
      } 
     } 
    ); 
} 

function getEvents() { 
    var formInput=$(this).serialize(); 
    $.getJSON('StartEP.action', formInput,function(data) {     
     var txt = $("#txtEventsArea");    
     if(data != null && data.toString().length!=0) {              
     txt.val(data.join('\n') + '\n' + txt.val()); 
     data=null; 
     } 
    } 
)} 

StartEP

public String startEP() throws Exception { 
    logger.info("[EP] In startEP"); 
    try { 
     synchronized(status) { 
      if(!getStatus()) {  
       EventProcessor amiep = EventProcessor.getInstance();        
       amiep.addObserver(this); 
       new Thread(amiep).start();           
       setStatus(true);     
      }    
     } 

    } catch (Exception ex) {  
     logger.error("Unable to start EP", ex);     
     return ERROR;     
    } 
    logger.info("[EP] In startEP, before loop"); 
    while(!gotNewData) { 
     Thread.sleep(4000);       
    }    
    gotNewData = false; 
    logger.info("[EP] Out startEP"); 
    return SUCCESS; 
} 

StartEPアクションは、(それぞれの要求に5キロバイト程度)メッセージを返します。まずテキストをテキストエリアに設定することを考えましたが、いくつかのテストではそれが理由ではありません。それはsetIntervalメソッドですか? 何か考慮すべき点はありますか?私はこれはかなり疑わしいに見えると言うでしょう おかげ

+3

オフトピック:なぜあなたの 'setInterval'に__two__余分な関数で' getEvents'がラップされていますか? 'setInterval(getEvents、5000)'。トピック:私はその中に漏れてはならないものは何も見ません –

+0

今後getEventsを呼び出す別の関数があります。 –

+0

これは 'getEvents'を二度ラップすることと何が関係していますか? –

答えて

0

while(!gotNewData) { 
    Thread.sleep(4000);       
} 

gotNewDataセットがありますか?一度Webサービスを呼び出してgotNewDataをtrueに設定してから別のWebサービスを呼び出し、gotNewDataをfalseに設定すると、アプリケーションの同じインスタンス内で変数を設定しているという保証はないと思います。したがって、そうでない場合は、Webサービスを起動するたびに新しいスレッドを開始してから、継続的にスリープ状態に戻します。

+0

gotNewDataは静的なので問題はありません –

+0

静的であるかどうかにかかわらず、後続のWebサービスコールでアプリケーションの同じインスタンスが呼び出されることはありますか?そうでない場合は、サービスを呼び出すたびに無限ループに入ります。 – MoarCodePlz

+0

これはとにかくこの部分はサーバー側にあり、クライアントのRAMの使用とは関係ありません。メモリの問題はクライアント側であり、IEはそのメモリを無駄にしています。 –

関連する問題