ajax中的内存泄漏 - setInterval

时间:2011-07-06 17:20:40

标签: javascript html jquery

我有一个导致内存泄漏的ajax代码(特别是在IE中)。

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方法吗? 有什么考虑吗? 感谢

1 个答案:

答案 0 :(得分:0)

我想说这看起来很可疑:

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

gotNewData在哪里设置?如果您调用Web服务一次并将gotNewData设置为true然后调用另一个Web服务并将gotNewData设置为false,那么我认为您无法保证在同一个应用程序实例中设置该变量。因此,如果您不是,那么每次您访问Web服务时,您都会启动一个新线程,然后不断将其重新置于睡眠状态。