我有一个导致内存泄漏的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方法吗? 有什么考虑吗? 感谢
答案 0 :(得分:0)
我想说这看起来很可疑:
while(!gotNewData) {
Thread.sleep(4000);
}
gotNewData在哪里设置?如果您调用Web服务一次并将gotNewData设置为true然后调用另一个Web服务并将gotNewData设置为false,那么我认为您无法保证在同一个应用程序实例中设置该变量。因此,如果您不是,那么每次您访问Web服务时,您都会启动一个新线程,然后不断将其重新置于睡眠状态。