цикл, в нем генерируются объекты и добавляются в список. Время от времени удаляю из списка некоторые элементы при помощи slice и concat, но количество занятой памяти не изменяется. Как это возможно сделать?
советую почитать как вообще все устроено https://deepu.tech/memory-management-in-v8/
Ну исходя из этого все должно работать. Удаляю объект из списка, удаляется последняя ссылка на него, следовательно через время сборщик мусора должен очистить память, если я все верно понял
Часть объектов попадает в old space. Я думаю Major GC просто не выполняются потому что v8 думает что нет смысла это делать. Вот память и не освобождается в случае с нодой можно запустить процесс с параметром --expose-gc и потом запускать сборку мусора при помощи global.gc(); ну и да, я тут про в8. Другие движки могут себя вести немного иначе
Спасибо, попробую
Попробовал, не помогло. Также попробовал просто в цикле создавать переменные, не добавляя в список и в конце вызывать очистку, память всеровно медленно заполняется
Сделай хипдамп и посмотри на то чем занята память ну и на v8.getHeapStatistics() посмотри и на v8.getHeapSpaceStatistics() тоже
ну и запусти еще ноду с параметром --trace-gc для полноты картины
Запустил, посмотрел, но если честно понятнее ничего не стало, вижу что заполняется, меняется, а из-за чего именно, не пойму. Схематично, мой код выглядит так. Та часть что внутри цикла вызывает переполнение let listResults = []; async function main() { new Promise(resolve => start()); // next logic ... } async function start(): Promise < void> { while(true) { // if comment out everything below, memory consuming is ok await new Promise(resolve => setTimeout(resolve, 500)); let calculation = getCalculation(); let newObj = createObjByCalc(calculation); // if comment out the part below, memory filling slows down, but does not disappear listResults.push(newObj); clearUnuserdValsFromList(); }
https://github.com/nodejs/diagnostics/tree/main/documentation/memory
Обсуждают сегодня