javascript рабочий забирает баранов после увольнения и удаления - PullRequest
0 голосов
/ 06 апреля 2020

Я играл с рабочими и хотел знать, что именно мне нужно сделать, чтобы полностью избавиться от него. До недавнего времени я думал, что их можно будет прекратить и удалить ссылки на них, но недавно я провел тест на нем и обнаружил, что все еще используется ram без необходимости.

Я использовал следующий код для создания и удалить некоторых рабочих (да, мне нужно было создать 100000 из них, чтобы получить заметный результат, но меня беспокоит только наличие потенциальной утечки поршня). после создания и удаления они использовали 2000 МБ оперативной памяти, которая быстро сократилась до 300 МБ после того, как был выполнен сбор мусора.

Кто-нибудь знает, для чего эти 300 МБ все еще используются и как я могу избавиться от них? их? мой код:

function inlineWorker (fun) {
    if (fun !== undefined && typeof fun === "function") {
        const burl = URL.createObjectURL(new Blob([
            "(" + fun.toString() + ")()"
        ], { type: 'application/javascript' }));

        const worker = new Worker(burl);

        URL.revokeObjectURL(burl);

        return worker;
    } else {
        throw "wrong argument";
    }
}

let workers = [];

for (let i = 0; i < 100000; i++) {
    workers.push(inlineWorker(function () {
        this.addEventListener("message", function (data) {
            this.postMessage(data.data);
        });
    }));
    workers[workers.length - 1].addEventListener("message", function (data) {
        console.log(data.data);
    });
    workers[workers.length - 1].terminate();
}

workers = undefined;

window.addEventListener("resize", function () {
    console.log(workers);
});

1 Ответ

0 голосов
/ 06 апреля 2020

Где 300Мб? В общем, сборщик мусора не имеет особой мотивации для очистки уже выделенной памяти в определенных пределах, поскольку он может позже использовать память для других объектов и данных. Не ожидайте, что используемая память будет точно соответствовать тем переменным, которые все еще используются.

Однако в вашем случае может быть вещь, которую даже продвинутые JS разработчики часто забывают: слушатели являются областями захвата, и они могут не удаляются вместе с объектом, который их создал. Попробуйте удалить все слушатели перед очисткой массива. Также попробуйте использовать один экземпляр fun. Хотя браузер должен это понять, я не уверен, что это так.

...