Как я могу обеспечить полное удаление окон Electron из памяти? - PullRequest
0 голосов
/ 08 июня 2018

Я знаю, что сборка мусора является слабым местом JavaScript, но я бы хотел сделать это как можно лучше.

Я создаю новые окна из моего рендерера процессаиспользование remote в отличие от процесса main, который, как я подозреваю, приведет к дальнейшей очистке.Если это существенная проблема, я в порядке с их созданием из main процесса.

Вот как я сейчас создаю окна:

import { remote } from 'electron';

function openInternalImageViewer(url) {
  let imgViewer = new remote.BrowserWindow()
  imgViewer.loadURL(url);
}

Просто установите для переменной imgViewer значение null после закрытия окна с помощью предоставленных API, достаточных для достижения моих целей, или у меня есть подозрения, которые мне нужно сделатьправильнее?

1 Ответ

0 голосов
/ 08 июня 2018

Вы не можете напрямую гарантировать, что объекты JavaScript будут удалены из памяти.Вы просто избавляетесь от всех ссылок, которые вам больше не нужны, что позволяет сборщику мусора выполнять свою работу.(Я бы не назвал это «слабым местом» - по сравнению с ручным управлением памятью, сильной стороной JavaScript является то, что он выполняет всю вашу работу.)

Вам не нужнобеспокоиться о функционально-локальных переменных: когда функция возвращается, переменные все равно выходят из области видимости.«Очистка» их вручную прямо перед этим ничего не дает.Пример:

function openInternalImageViewer(url) {
  let imgViewer = new remote.BrowserWindow()
  imgViewer.loadURL(url);

  /* ...let user interact with imgViewer... */

  imgViewer = null;  // Useless assignment.
}

Это верно как для переменных let, так и var.

Конечно, это отличается для глобальных переменных (но, конечно, вы не должныу них их много):

var imgViewer;

(function openInternalImageViewer(url) {
  imgViewer = new remote.BrowserWindow()
  imgViewer.loadURL(url);
})(some_url);

/* ...let user interact with imgViewer... */

imgViewer = null;  // This cleanup makes sense!

/* program execution continues, imgViewer no longer needed */

С точки зрения движка не имеет значения, назначаете ли вы null, undefined или 123, поэтому вы можете выбрать любойЗначение имеет наибольшее значение для вас.

Кроме того, не имеет значения, откуда что-то было создано / выделено.Для сборки мусора важно, является ли объект «недоступным», т. Е. У вашего кода нет возможности когда-либо снова к нему добраться.

Чтобы проверить, работает ли он, вы должны использовать какую-то памятьинструмент анализа / профилирования.Простейшая форма - использовать диспетчер задач вашей операционной системы.Напишите тест примерно так:

for (var i = 0; i < 100; i++) {
  openWindow();
  closeWindow();
}

и посмотрите, продолжает ли потребление памяти всеми вовлеченными процессами возвращаться к своему первоначальному значению.Скорее всего, он этого не сделает сразу, вместо этого вы увидите «пилообразный» паттерн, где память продолжает расти, пока GC не сработает и снова не остановится.Вы можете рассмотреть форсирование циклов GC вручную в тесте;просто знайте, что в производственном коде это было бы пустой тратой времени, поскольку автоматическое поведение GC очень тщательно настраивало эвристику, чтобы сбалансировать время, затрачиваемое на сборку мусора, с доступной памятью.

...