Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.12.2011, 17:13
Новичок на форуме
Отправить личное сообщение для evgkar Посмотреть профиль Найти все сообщения от evgkar
 
Регистрация: 27.12.2011
Сообщений: 2

Утечки памяти при использовании JSONP в IE 9
Необходимо делать опрос сервера с интервалом в 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.

Кстати, забавно — запускал нечто подобное и под Chrome, но там измерял размер хипа (с помощью встроенного средства профилирования памяти) — результат крайне интересный: при использовании $.ajax размер хипа увеличился за 17 часов ~ на 30МБ, а вот у плагина ($.jsonp) результат был неожиданно лучше — за 17 часов вырос всего на 30КБ =)

Поэтому хотелось бы узнать каким образом, используя JSONP, устранить такое неуемное потребление памяти?

PS. Провел тест с использованием вот этой штуки - результат тот же
Ответить с цитированием
  #2 (permalink)  
Старый 27.12.2011, 19:15
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

http://javascript.info/tutorial/memo...val-settimeout

поиск

Попробуйте не интервал, а таймаут, и попробуйте делать clear+set. Тоже течет?
Ответить с цитированием
  #3 (permalink)  
Старый 28.12.2011, 19:34
Новичок на форуме
Отправить личное сообщение для evgkar Посмотреть профиль Найти все сообщения от evgkar
 
Регистрация: 27.12.2011
Сообщений: 2

Сообщение от e1f Посмотреть сообщение
Попробуйте не интервал, а таймаут, и попробуйте делать clear+set. Тоже течет?
Да, с таймаутом та же проблема.

Решил вообще дистанцироваться от циклов и проверить просто обращения на сервер. Делал следующим образом: добавил на страницу кнопку, которая инициирует jsonp-запрос (для jsonp использовал Lightweight-JSONP, в силу ее компактности и наглядности).

Код с этой библиотечкой:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<script type="text/javascript">
			/*
			* Lightweight JSONP fetcher
			* Copyright 2010 Erik Karlsson. All rights reserved.
			* BSD licensed
			*/


			/*
			* Usage:
			* 
			* JSONP.get( 'someUrl.php', {param1:'123', param2:'456'}, function(data){
			*   //do something with data, which is the JSON object you should retrieve from someUrl.php
			* });
			*/
			var JSONP = (function(){
				var counter = 0, head, query, key, window = this;
				function load(url) {
					var script = document.createElement('script'),
						done = false;
					script.src = url;
					script.async = true;
			 
					script.onload = script.onreadystatechange = function() {
						if ( !done && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") ) {
							done = true;
							script.onload = script.onreadystatechange = null;
							if ( script && script.parentNode ) {
								script.parentNode.removeChild( script );
							}
						}
					};
					if ( !head ) {
						head = document.getElementsByTagName('head')[0];
					}
					head.appendChild( script );
				}
				function jsonp(url, params, callback) {
					query = "?";
					params = params || {};
					for ( key in params ) {
						if ( params.hasOwnProperty(key) ) {
							query += encodeURIComponent(key) + "=" + encodeURIComponent(params[key]) + "&";
						}
					}
					var jsonp = "json" + (++counter);
					window[ jsonp ] = function(data){
						callback(data);
						try {
							delete window[ jsonp ];
						} catch (e) {}
						window[ jsonp ] = null;
					};
			 
					load(url + query + "callback=" + jsonp);
					return jsonp;
				}
				return {
					get:jsonp
				};
			}());
		</script>		
	</head>
	<body>
		<h1> Test in progress... Please, don't close this page </h1>
		<script type="text/javascript">
			function send() {
				JSONP.get('http://localhost:8888/job/GetAllStatuses/jsonp',{},onReceive);
			}
			
			function onReceive(data) {
			
			}
		</script>
		
		<input type="button" onclick="send()" value="send" />
	</body>
</html>


Размер приходящих с сервера данных ~ 2.86 КБ.

Далее, сделал скрипт для Autohotkey следующего вида:
Код:
Loop {
   IfWinActive, D:\Tmp\testjsonp.html - Windows Internet Explorer
   {
       MouseClick, left,  30,  143
       Sleep, 250
   }
}
Основная и единственная задача сего скрипта - бесконечно кликать по сделанной мной кнопке "Send" в окошке IE (координаты соответствуют положению кнопки на моем экране с интервалом в ~250мс)

Если всю эту штуку запустить, то можно наблюдать как в IE9 растет память (за полчаса на 50МБ).
Ответить с цитированием
  #4 (permalink)  
Старый 28.12.2011, 19:40
Аватар для vflash
Профессор
Отправить личное сообщение для vflash Посмотреть профиль Найти все сообщения от vflash
 
Регистрация: 09.07.2007
Сообщений: 304

IE может не освобождать память до момента когда она понадобиться системе.
паника=off;
__________________
лучшая rss читалка zzreader.com
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема при воспроизведении аудио при использовании jplayer nemish Events/DOM/Window 0 01.12.2011 16:15
Сумасшедшая утечка памяти в Opera при использовании javascript в IFRAME Маэстро Opera, Safari и др. 12 18.11.2010 12:29
утечка памяти при создании DOM MadLord Общие вопросы Javascript 2 16.08.2010 12:01
Выделение текста при использовании слайдера x00xer Firefox/Mozilla 8 29.09.2009 07:45
Утечки памяти: как сделать ? Draeden Events/DOM/Window 10 30.08.2009 18:16