Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Утечки памяти JS [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): « 1 [2]   

> Описание: Утечки памяти JS
OrmaJever
Отправлено: 06 Февраля, 2014 - 11:38:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




MAXUS значит я плохо знаком в js'ом, я всегда думал что когда завершается функция leak то showStack очищается и больше не доступен.
Хотя из функции showStack мы имеем доступ к stack, поэтому память не совсем утекла, с неё можно ещё работать.
(Добавление)
Хотя... после прогрузки страницы память выдедилась под ноды и на протяжении всего скрипта не удаляется (ждёт вызова showStack) что тоже немного странно. По-моему в данном случае showStack не должна быть доступна снаружи leak иначе это и правда беда.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
MAXUS
Отправлено: 06 Февраля, 2014 - 12:40:40
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




nerv пишет:
еще ссылка
http://learn[dot]javascript[dot]ru/memory-leaks


Кстати, поизучав вопрос утечек в jq пришел к выводу, что в этом смысле опасно мешать его с нативным кодом. Например, любая навеска события через jq череповата боком, если мешать jq и нативный js.

CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. $( window ).load(function() {
  3.         $("#someElement").bind("click", function(){alert("jqBinded")});
  4.         document.getElementById("someElement").parentNode.removeChild(document.getElementById("someElement"));
  5. });
  6.  


Тут будет утечка.

CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. window.onload=function(){
  3.         document.getElementById("someElement").addEventListener("click", function(){alert("jsBinded")});
  4.         document.getElementById("someElement").parentNode.removeChild(document.getElementById("someElement"));
  5. }
  6.  


А тут не будет... Хотя операции одни и те же.

Соответственно, опасно мешать jq с другими фреймворками, которые работают с js напрямую. Во всяком случае, надо точно знать как работают оба и не давать им пересекаться в таком ключе.


(Добавление)
OrmaJever пишет:
Хотя... после прогрузки страницы память выдедилась под ноды и на протяжении всего скрипта не удаляется (ждёт вызова showStack) что тоже немного странно. По-моему в данном случае showStack не должна быть доступна снаружи leak иначе это и правда беда.


Дак в этом как раз смысл замыкания. Функция отрабатывает, но если на ее область видимости остаются ссылки, то эта область видимости сохраняется, пока эти ссылки не будут разорваны.

(Отредактировано автором: 06 Февраля, 2014 - 13:18:16)

 
 Top
OrmaJever
Отправлено: 06 Февраля, 2014 - 12:55:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




MAXUS пишет:
Функция отрабатывает, но если на ее область видимости остаются ссылки, то эта область видимости сохраняется, пока эти ссылки не будут разорваны.

Вот именно, область видимости! Почему когда завершается функция leak остаётся переменная showStack? Ведь она создана именно а функции и должна умереть вместе с ней.
По-моему так быть не должно Растерялся


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
IllusionMH
Отправлено: 06 Февраля, 2014 - 13:00:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




OrmaJever, функция ж присваивается глобальной переменной, а значит она и ее область видимости живут, пока ее не удалить/заменить.

(Отредактировано автором: 06 Февраля, 2014 - 13:01:16)

 
 Top
OrmaJever
Отправлено: 06 Февраля, 2014 - 13:14:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




IllusionMH аа ну тогда да.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
nerv
Отправлено: 06 Февраля, 2014 - 19:57:20
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




MAXUS пишет:
Или я чего-то не догоняю?

я привел утрированный пример

MAXUS пишет:
Во-вторых, объект-то у тебя не удаляется, а просто очищается

ну да. Чтобы удалить, нужно знать родителя или без ооп
http://learn[dot]javascript[dot]ru/play/gXLLRb


-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB