2011-07-06 30 views
0

我有一個導致內存泄漏(特別是在IE)的ajax代碼。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動作(對每個請求約5KB)返回消息。首先,我認爲它涉及到將文本設置爲textarea,但經過一些測試後得出結論並非如此。它可以是setInterval方法嗎? 有什麼注意事項嗎? 感謝

+3

題外話:你爲什麼在'setInterval'中爲'_Event'封裝__two__額外的函數? 'setInterval(getEvents,5000)'。話題方面:我沒有看到任何應該泄漏的東西 –

+0

還有另一個功能,它將來還會調用getEvents。 –

+0

這與包裝'getEvents'兩次有什麼關係? –

回答

0

我會說這看起來很可疑:

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

哪裏是gotNewData設置?如果你調用Web服務一次並將gotNewData設置爲true,然後調用另一個Web服務並將gotNewData設置爲false,我不認爲有保證可以在應用程序的同一實例中設置該變量。因此,如果你不是,那麼每次你打網絡服務時,你都會開始一個新線程,然後不斷地讓它重新入睡。

+0

gotNewData是靜態的,所以這不是問題 –

+0

是否爲靜態,是否確保您的調用在後續Web服務調用中碰到應用程序的同一實例?如果不是這樣,那麼每次調用服務時都會進入無限循環。 – MoarCodePlz

+0

而且無論如何,這部分是在服務器端,它與客戶端RAM使用無關。內存問題是在客戶端和IE浪費內存,而不是Java。 –