Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   memory leaks (https://javascript.ru/forum/node-js-io-js/85516-memory-leaks.html)

fxobject 29.09.2023 20:07

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 )

Aetae 29.09.2023 21:17

Мб this.readSQLInfo запоминает.

fxobject 29.09.2023 21:30

непонятно.
все функции успешно отрабатывают, никаких "ожидающих", а соответственно их замыканий не остается.
Кто там и что запоминает - должен все что запомнил освободить, по причине - отсутствия ссылок на что либо.
единственное подозрение - это две разные области видимости (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
т.е. явный отказ от декларированных переменных - не помогает. только вариант как в начале поста
нигде в литературе не могу найти подобного.
хотелось бы разобраться

MallSerg 29.09.2023 21:41

Советую поискать на ютубе - "профилирование java script".
Думаю это очень полезно знать и уметь.

fxobject 29.09.2023 21:49

да я уже запрофилировался. нашел утечку именно профилированием. с инструментами разобрался. Я просто не понимаю - почему!!!

Aetae 29.09.2023 21:50

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

Есть вариант что это ленивый gc и он просто не успевает всё чистить, проверить это можно запустив код в ноде о флагом разрешающим запускать gc руками. Но я всё же склоняюсь к тому, что один из методов через которые ты прокидываешь эти твои opt и arg где-то умудряется сохранить ссылку. Может кэширование какое или мемоизация...

fxobject 29.09.2023 21:57

вот упрощенная давнишняя версия но точно с такой же утечкой:
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

будет наблюдаться утечка

fxobject 29.09.2023 21:59

не ленивый gc....... c нажатием кнопки чтения данных наблюдается резкое увеличение потребляемой памяти. с ключами пробовал, это не сборщик мусора.
кэширование какое или мемоизация - понимаю о чем, не использую.

MallSerg 29.09.2023 22:13

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

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

fxobject 29.09.2023 22:17

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


Часовой пояс GMT +3, время: 15:25.