Я активно профилировал код, пока не обнаружил, что следующий код выделяет более 1 ГБ ОЗУ в последней версии Chrome в приватном режиме, когда размер «массива» составляет около 33 МБ, размер на самом деле не имеет значения, этотолько файл такого размера, с которым я запускал свои тесты.Я не знаю, как сгенерировать такой большой массив Uint8Array в тестовом коде, чтобы код, приведенный ниже, не мог быть выполнен как есть, но, возможно, вы все равно можете понять это и помочь мне с этим.
const bytesToString = function (array) {
let uint8Array = new Uint8Array(array);
let length = uint8Array.byteLength;
let stringToEncode = "";
for (let i = 0; i < length; i++) {
stringToEncode += String.fromCharCode(uint8Array[i]);
}
return stringToEncode;
}
Когда раскомментируется цикл for, потребление оперативной памяти остается на том же уровне во время выполнения моего кода, как только активируется цикл for, потребление увеличивается до 1 ГБ.Это, конечно, происходит в какой-то момент GC, но у меня есть общая проблема с памятью, когда браузер в конечном итоге падает из-за чрезмерного потребления памяти, и я пытаюсь выяснить, является ли эта функция проблемой.С помощью анализатора производительности из Chrome я мог видеть, что GC вызывается много раз, я не знаю, как работает GC из Chrome, потому что вы можете прочитать много "Minor GC" и в какой-то момент в конце "Major GC" иМне было интересно, если «Minor GC» на самом деле не означает, что оперативная память освобождается, а скорее «собирается», и только на более позднем этапе «Major GC» действительно освобождает оперативную память.Если это так, то я предполагаю, что между вызовом этой функции и «Major GC» мой код запускает что-то, что также требует больше оперативной памяти, чем обычно, и затем происходит сбой браузера.Если это так, то вопрос в том, есть ли лучшая реализация для моей функции или я могу манипулировать GC?Насколько я мог читать, я не могу.