Вкратце: необходимо делать опрос сервера с интервалом в 250мс. Сервер находится в другом домене, поэтому для обращения был выбран JSONP. Однако, оказалось, что в Internet Explorer 9 происходит нечто очень похожее на утечку памяти. Приведу пример:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="scripts/jquery-1.7.1.min.js"></script>
<script src="scripts/jquery.jsonp-2.2.0.min.js" type="text/javascript"></script>
</head>
<body>
<h1> Test in progress... Please, don't close this page </h1>
<script type="text/javascript">
function send(){
$.ajax({
url: "http://localhost:81/job/GetAllStatuses/jsonp",
success: onReceive,
dataType: 'jsonp',
cache: false
});
// Вариант со сторонним плагином - то же самое
// $.jsonp({
// url: "http://localhost:81/job/GetAllStatuses/jsonp?callback=?",
// success: onReceive
// });
}
function onReceive(message) {
// Даже если здесь ничего не делать - утечка есть
}
setInterval(send, 250);
</script>
</body>
</html>
Как видно, было сделано 2 теста — с использованием jQuery и отдельного плагина. Результат приблизительно один и тот же — линейный рост памяти, потребляемой процессом IE. За 1,5 часа рост ~ на 270 MB.
На багтрекере jQuery нашел следующую заметку.
Кстати, забавно — запускал нечто подобное и под Chrome, но там измерял размер хипа (с помощью встроенного средства профилирования памяти) — результат крайне интересный: при использовании $.ajax размер хипа увеличился за 17 часов ~ на 30МБ, а вот у плагина ($.jsonp) результат был неожиданно лучше — за 17 часов вырос всего на 30КБ =)
Поэтому хотелось бы узнать каким образом, используя JSONP, устранить такое неуемное потребление памяти?
Здравствуйте, boot, Вы писали:
B>Здравствуйте, evgkar, Вы писали:
E>>...
B>ИЕ кэширует запросы XMLHttpRequest. Как это побороть читайте
Ну тут, к сожалению, не XMLHttpRequest. Тем не менее, на сервере проставляются соответствующие заголовки, в строку запроса вносится рандомное значение. Не помогает — рост на 25МБ за 8 минут на приведенном выше примере. Кстати, за ночь размер увеличился до 1.8ГБ. Жест...
Re[3]: Утечки памяти при использовании JSONP в IE 9
Здравствуйте, evgkar, Вы писали:
E>Здравствуйте, boot, Вы писали:
B>>Здравствуйте, evgkar, Вы писали:
E>>>...
B>>ИЕ кэширует запросы XMLHttpRequest. Как это побороть читайте
E>Ну тут, к сожалению, не XMLHttpRequest. Тем не менее, на сервере проставляются соответствующие заголовки, в строку запроса вносится рандомное значение. Не помогает — рост на 25МБ за 8 минут на приведенном выше примере. Кстати, за ночь размер увеличился до 1.8ГБ. Жест...
Да, не все написал, но копать все равно в эту сторону. ИЕ все равно создает объект используя ActiveX, и, собака, не удаляет его, не важно как он называется, рассмотрим на примере XMLHttpRequest.
Делаете стек объектов stack, новый запрос получаете не так
usedXhr=new XMLHttpRequest();
, а так
usedXhr=stack.pop()||new XMLHttpRequest();
, а в обработке запроса, когда все получили, или в случае ошибки, пихаем его обратно
stack.push(usedXhr);
Таким образом, мы вторично юзаем ActiveX-объекты, не создавая новых.
Так сделано в AdBlock, а там интенсивно юзаются запросы.
Жизнеспособность прямо пропорциональна простоте!
Re[4]: Утечки памяти при использовании JSONP в IE 9
От:
Аноним
Дата:
27.12.11 10:25
Оценка:
Здравствуйте, boot, Вы писали:
B>Здравствуйте, evgkar, Вы писали:
E>>Здравствуйте, boot, Вы писали:
B>>>Здравствуйте, evgkar, Вы писали:
E>>>>...
B>>>ИЕ кэширует запросы XMLHttpRequest. Как это побороть читайте
E>>Ну тут, к сожалению, не XMLHttpRequest. Тем не менее, на сервере проставляются соответствующие заголовки, в строку запроса вносится рандомное значение. Не помогает — рост на 25МБ за 8 минут на приведенном выше примере. Кстати, за ночь размер увеличился до 1.8ГБ. Жест...
B>Да, не все написал, но копать все равно в эту сторону. ИЕ все равно создает объект используя ActiveX, и, собака, не удаляет его, не важно как он называется, рассмотрим на примере XMLHttpRequest. B>Делаете стек объектов stack, новый запрос получаете не так
B>
B>usedXhr=new XMLHttpRequest();
B>
B>, а так
B>
B>usedXhr=stack.pop()||new XMLHttpRequest();
B>
Спасибо за совет, тут некоторое недопонимание произошло. Речь идет о jsonp, где кроссдоменный запрос осуществляется посредством тега <script src="...">, а не XMLHttpRequest и ему подобных.
Re[5]: Утечки памяти при использовании JSONP в IE 9
Здравствуйте, Аноним, Вы писали:
А>Спасибо за совет, тут некоторое недопонимание произошло. Речь идет о jsonp, где кроссдоменный запрос осуществляется посредством тега <script src="...">, а не XMLHttpRequest и ему подобных.
Возможно я чего-то не понимаю, но все равно там там надо копать. Других ям нету. В спецификации можете поискать, любая обертка использует одно и то же, только по разному.