繁体   English   中英

ajax 中的 memory 泄漏 - setInterval

[英]memory leak in ajax - setInterval

我有一个 ajax 代码导致 memory 泄漏(尤其是在 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;
       } 
    }
)}

启动EP

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

我会说这看起来很可疑:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM