jQuery + Google Chrome ( утечка памяти ??? )
Собственно вот код, при работе которого в «хромовском» диспетчере задач медленно, но верно растет кол-во потребляемой памяти для этой вкладки
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Test</title> </head> <body> <div class="testbox" id="test" ></div> <script type="text/javascript" src="/js/jquery.js"></script> <script type="text/javascript" > $(function(){ window.c = 0; window.xxx = null; window.test = document.getElementById('test'); function x() { window.c++; window.xxx = $('.testbox'); test.innerHTML = window.c; setTimeout(y,20); } function y() { setTimeout(x,20); } for(i=1; i<10; i++) x(); }); </script> </body> </html> OS: Debian Linux Google Chrome: 5.0.307.7 beta jQuery: 1.4.2 Такое только у меня? У вас воспроизводится? Есть мысли о том кто течет ( jQuery | Chrome | /dev/hands )? |
jQuery тут ни при чем:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Leak test</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <meta name="generator" content="Geany 0.18.1.1" /> </head> <body> <div id="output" class="testbox"></div> <script type="text/javascript"> <!-- (function(){ window.c = 0; window.qSA = null; window.output = document.getElementById('output'); function x() { window.c++; window.qSA = document.querySelectorAll('.testbox'); window.output.innerHTML = window.c; setTimeout(y,20); } function y() { setTimeout(x,20); } for (i=1; i<10; i++) { x(); } }()); //--> </script> </body> </html> OS: Windows 7 Google Chrome: 4.1.249.1045 (42898) jQuery: N/A Тоже потихоньку ликаем. |
Так тоже ликаем:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Leak test</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <meta name="generator" content="Geany 0.18.1.1" /> </head> <body> <div id="output" class="testbox"></div> <script type="text/javascript"> <!-- window.c = 0; window.qSA = null; window.output = document.getElementById('output'); function x() { window.qSA = document.querySelectorAll('.testbox'); window.output.innerHTML = window.c++; } setInterval(x, 20); //--> </script> </body> </html> OS: Windows 7 Google Chrome: 4.1.249.1045 (42898) jQuery: N/A |
Добрый день всем
Столкнулся с утечкой памяти вот в такой конструкции: <BODY onload='init_timers()' > <script type="text/javascript"> function init_timers() { query_timer = setInterval("ExtenQuery()",5000); ExtenQuery(); } function ExtenQuery() { $.getJSON("extensions-realtime.php?show=query", //запрос возвращает данные в таком виде: // { // "200_Status":"<div class='stat-1'> </div>", // "113_Status":"<div class='stat8'> </div>", // "200_Connected":"113", // "200_Duration":"00:03", // "200_Application":"Dial", // "200_CallerID":" ", // "200_Channel":"Local/200@from-internal-custom-3e97,2", // "113_Connected":"200", // "113_Duration":"00:03", // "113_Application":"Dial", // "113_CallerID":"menu-3 ", // "113_Channel":"LOCAL/113@ext-local|60|S(1361)M(mname})", // } //размер ответа в среднем 2..4 кб. function(obj) { j=j+1;//добавляем номер (с каждой итерацией увеличивается id, //чтоб знать, где удалить старое и вписать новое jQuery.each(obj, function(i, val) //отражаем изменения на странице в соответствии с результатом запроса { $("#" + i+" div").replaceWith("<div class=\"value"+j+"\">" + val+ "</div>"); }); //удаляем старое $(".value" + (j-1) ).replaceWith("<div class=\"value"+j+"\"> </div>"); }); } </script> ....тут обрабатываемые объекты..... <div class="reg1" id="exten_101"> <div class="stat0" id="101_Status"><div class="value"> </div></div> <div class=usernum>101:</div> <div class=username>Meleshko Ekaterina </div> <div class=stats id="101_Connected"><div class="value"> </div></div> <div class=stats>:</div> <div class=stats id="101_CallerID"><div class="value"> </div></div> <div class=time id="101_Duration"><div class="value"> </div></div> </div> .... таких объектов много.... <div class="reg1" id="exten_200"> <div class="stat0" id="102_Status"><div class="value"> </div></div> <div class=usernum>200:</div> <div class=username>Loginova Valeiya </div> <div class=stats id="200_Connected"><div class="value"> </div></div> <div class=stats>:</div> <div class=stats id="200_CallerID"><div class="value"> </div></div> <div class=time id="200_Duration"><div class="value"> </div></div> </div> все остальные части убрал, так как проверил их по отдельности, они не ведут к утечкам. подозрения: jquery не очищает старый экземпляр obj; DOM каким-нибудь образом заполняется неудаленными элементами, браузер кеширует запросы (в php добавляю заголовки, чтоб не кэшировал). Просто приложение должно работать круглосуточно, а за четыре часа работы размер окна браузера превышает 120 Мб (тестирую в хроме и лисе), что никуда не годится. Вопрос, собственно, такой: куда посмотреть, что копнуть, чтобы обнаружить и убрать утечку памяти. Или я использую jquery неправильно, что приводит к утечкам? От jquery отказываться не хочется, т.к. удобна она уж очень... |
удалось локализовать проблему.
Если заменять элементы так: $("#" + i+" div").replaceWith("<div class=\"value"+j+"\">" + val+ "</div>"); то память течет, но работает быстро. если сделать вот так $("#" + i+" div").html("<div class=\"value"+j+"\">" + val+ "</div>"); то память не течет, но загружает браузер впятеро сильнее. пробовал перед $("#" + i+" div").replaceWith(...) делать так $("#" + i+" div").empty(...) но эффекта никакого память все равно течет... (полагаю еще двойная нагрузка из-за селектора) что еще можно попробовать или как ускорить обработку $("#" + i+" div").html()? |
Часовой пояс GMT +3, время: 13:04. |