Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.09.2023, 20:07
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 133

memory leaks
столкнулся с утечкой. устранить удалось, но почему возникает - понимания не возникло. может кто-нибудь внятно разъяснить? спасибо
упрощенный код :

getInfo( options, argument ){
    let __this = this;
    this.readSQLInfo(options, argument).then(( result )=>{
	  //--- result большой массив с данными
      return __this.sendResult( options,argument, result.slice() )
	  
    }).catch( error => { ....... });
}

sendResult( objectQuery,options,resultInfo ){
    options.message = resultInfo;  //--- большой массив
     .................
     .................
    options.message = null;  // --- если закоментарить строку то будет утечка
    return true;
  }
///--- opt и arg не глобальные переменные, они имеют блоковую видимость
let opt = { a:0,b:10 }
let arg = { c:0,d:10 }
this.getInfo( opt,arg )

Последний раз редактировалось fxobject, 29.09.2023 в 20:10.
Ответить с цитированием
  #2 (permalink)  
Старый 29.09.2023, 21:17
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

Мб this.readSQLInfo запоминает.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 29.09.2023, 21:30
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 133

непонятно.
все функции успешно отрабатывают, никаких "ожидающих", а соответственно их замыканий не остается.
Кто там и что запоминает - должен все что запомнил освободить, по причине - отсутствия ссылок на что либо.
единственное подозрение - это две разные области видимости (options и resultInfo) (хотя и они потом уничтожаются) и перекрестная ссылка между ними
options.message = resultInfo
причем вот так вот:
let opt = { a:0,b:10 }
let arg = { c:0,d:10 }
this.getInfo( opt,arg )
arg = null
opt = null
т.е. явный отказ от декларированных переменных - не помогает. только вариант как в начале поста
нигде в литературе не могу найти подобного.
хотелось бы разобраться
Ответить с цитированием
  #4 (permalink)  
Старый 29.09.2023, 21:41
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

Советую поискать на ютубе - "профилирование java script".
Думаю это очень полезно знать и уметь.
Ответить с цитированием
  #5 (permalink)  
Старый 29.09.2023, 21:49
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 133

да я уже запрофилировался. нашел утечку именно профилированием. с инструментами разобрался. Я просто не понимаю - почему!!!
Ответить с цитированием
  #6 (permalink)  
Старый 29.09.2023, 21:50
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

fxobject, покажи полный код - можно будет о чём-то говорить.

Есть вариант что это ленивый gc и он просто не успевает всё чистить, проверить это можно запустив код в ноде о флагом разрешающим запускать gc руками. Но я всё же склоняюсь к тому, что один из методов через которые ты прокидываешь эти твои opt и arg где-то умудряется сохранить ссылку. Может кэширование какое или мемоизация...
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 29.09.2023, 21:57
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 133

вот упрощенная давнишняя версия но точно с такой же утечкой:
function onConnect( wsClient ) {
  wsClient.on('message', function (message) {
      let options = JSON.parse( message );
      let sendResult = function( resultInfo,statusInfo = true ){
        options.status  = statusInfo;
        if( resultInfo !== undefined ) options.message = resultInfo; else options.message = {}
        wsClient.send( JSON.stringify( options ));
        return true;
      }
    let info = []  //--- большой	 массив данных
   sendResult( info  ,false);
   return

будет наблюдаться утечка
Ответить с цитированием
  #8 (permalink)  
Старый 29.09.2023, 21:59
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 133

не ленивый gc....... c нажатием кнопки чтения данных наблюдается резкое увеличение потребляемой памяти. с ключами пробовал, это не сборщик мусора.
кэширование какое или мемоизация - понимаю о чем, не использую.
Ответить с цитированием
  #9 (permalink)  
Старый 29.09.2023, 22:13
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

Замыкание функционального выражения на каждый вызов "wsClient.on ( ...." это накладная операция.

Из кода непонятно зачем на каждый вызов создавать уникальную для этого вызова функцию вместо использования одной на все вызовы "wsClient.on ( ....".
Ответить с цитированием
  #10 (permalink)  
Старый 29.09.2023, 22:17
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 133

это старая версия функции и приведена только в учебных целях.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Out of memory (IE8). Непонятные причины. bodeaux Internet Explorer 0 17.12.2013 11:26
Memory Leak при работе с $.getJSON и циклом $.each Fareastaz jQuery 11 06.03.2013 08:07
<= IE8 memory leak, IE9 - fine AbNormy Internet Explorer 1 20.05.2011 19:47
Out of memory in IE Slimy Internet Explorer 0 18.02.2010 14:08