Ограничение памяти JavaScript - PullRequest
53 голосов
/ 30 мая 2010

Существует ли максимальное количество данных, которое может хранить приложение JavaScript?

Я полагаю, это обрабатывается браузером, и у каждого есть свои ограничения?

Если ограничения нет, будет ли создан файл подкачки? Если так, разве это не небезопасно?

Ответы [ 5 ]

35 голосов
/ 30 мая 2010

AFAIK, верхнего предела нет, ваш сценарий может в основном использовать память до тех пор, пока система не исчерпает память (включая обмен) Отсутствие верхнего предела не означает, что вы должны съесть все это, пользователям это может не понравиться.

25 голосов
/ 28 августа 2012

В Chrome и Chromium OS ограничение памяти определяется браузером, и вы можете проверить ограничение с помощью следующей команды в командной строке инструментов разработчика, нажав F12:

> window.performance.memory.jsHeapSizeLimit
1090519040

В моей ОС Windows 10 оно составляет около 1 ГБ.

В Chrom (e / ium) вы можете обойти ограничение размера кучи, выделив собственные массивы:

var target = []
while (true) {
    target.push(new Uint8Array(1024 * 1024)); // 1Meg native arrays
}

Это приводит к сбою вкладки размером около 2 ГБ, что происходит очень быстро. После этого Chrom (e / ium) выходит из строя, и повторный тест невозможен без перезапуска браузера.

Я также рекомендую прочитать блог TrackJS о Мониторинг памяти JavaScript , прежде чем углубляться в сорняки, пытаясь диагностировать или измерить что-либо, связанное с браузером в памяти.

Вы также можете искать в comp.lang.javascript значение ограничение памяти javascript .

Смотрите также эти сообщения о переполнении стека:

  1. Максимальный размер массива в Javascript , который предполагает, что вы можете хранить до 2 32 -1 = 4 294 967 295 = 4,29 млрд элементов.

  2. Максимальное количество аргументов, которые может принять функция JavaScript

На веб-сайте библиотеки отображения астрономических изображений JS9 есть дополнительные сведения: Работа с ограничениями памяти .

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

Вот некоторые компоненты, которые я нашел очень хорошо масштабируемыми как по производительности процессора, так и по производительности памяти:

  1. Редактор Microsoft Monaco
    • Используется несколькими коммерческими проектами:
      1. Почтальон, начиная с v7.1.1-canary08
      2. VS Код

Вот несколько примеров платформ с известным снижением производительности:

  1. Angular: Плохой подход к обнаружению изменений.
    • Для каждого асинхронного события сравните каждую из привязок (привязка Model-Dom) со старым значением, чтобы решить, следует ли повторно визуализировать.
      1. NG1:> 2500 зрителей, производительность останавливается
      2. NG2: та же проблема остается, но у вас есть долгий утомительный обходной путь: переключитесь на неизменяемый файл и распространите ChangeDetectionStrategy.onПроведите по всему приложению, чтобы отключить проблемную стратегию по умолчанию
  2. Реагировать
    • Опять же, неизменные коллекции объектов JS пока только масштабируются.
      1. create-реагировать-приложение внутренне использует Immutable.JS и Immutable.JS может только создать около 500k неизменяемых коллекций, прежде чем оно умрет.

Вот еще несколько вещей, о которых стоит подумать:

  1. Используйте array.slice для манипулирования массивами , чтобы минимизировать дополнительные выделения массива; array.slice изменит массив на месте, что уменьшит сборку мусора и общий размер кучи.
4 голосов
/ 12 февраля 2017

Firefox поддерживает опцию " javascript.options.mem.max ", и если вы выполняете поиск по этому вопросу, вы можете найти обсуждения разумных ценностей, которые люди сочли работоспособными.

Не уверен, сколько людей может быть обеспокоено, заходя туда и устанавливая его, но, говоря для себя, я установил его на 128000 (что составляет 128M).

3 голосов
/ 06 декабря 2018

Я думаю, что ограничение памяти из браузера. Мы можем использовать DevTools, чтобы понять это. Как и в Chrome, нажмите F12 и введите window.performance.memory, чтобы просмотреть информацию о памяти.

 window.performance.memory

enter image description here

3 голосов
/ 30 мая 2010

Нет ограничений памяти для программы Javascript. Ваш скрипт может захватить всю оперативную память на вашем компьютере. Однако не рекомендуется использовать всю память на компьютере пользователя. Если вы имеете дело с большим количеством данных, я бы посоветовал вам проверить кэширование.

...