Я хочу знать размер, занимаемый объектом JavaScript.
Возьмите следующую функцию:
function Marks(){
this.maxMarks = 100;
}
function Student(){
this.firstName = "firstName";
this.lastName = "lastName";
this.marks = new Marks();
}
Теперь я создаю экземпляр student
:
var stud = new Student();
так что я могу делать такие вещи, как
stud.firstName = "new Firstname";
alert(stud.firstName);
stud.marks.maxMarks = 200;
и т.п.
Теперь stud
объект будет занимать некоторый размер в памяти. У него есть некоторые данные и больше объектов.
Как узнать, сколько памяти stud
занимает объект? Что-то вроде sizeof()
в JavaScript? Было бы действительно здорово, если бы я мог найти это в одном вызове функции, как sizeof(stud)
.
Я искал в Интернете несколько месяцев - не смог его найти (спросили на нескольких форумах - нет ответов).
javascript
memory
object
sizeof
user4642212
источник
источник
Ответы:
Я пересмотрел код в моем первоначальном ответе . Я удалил рекурсию и удалил предполагаемые накладные расходы на существование.
источник
"よんもじ".length
это 4 в Javascript, но вы уверены, что это 8 байтов, как ваш код возвращает его?var a={n:1}; var b={a:function(){return a}}; roughSizeOfObject(b)
- здесьb
содержится ссылка наa
, ноroughSizeOfObject()
возвращается0
.Google Chrome Heap Profiler позволяет вам контролировать использование памяти объекта.
Вы должны быть в состоянии найти объект в трассировке, что может быть сложно. Если вы прикрепите объект к глобальному окну, его будет легко найти в режиме списка «Containment».
На прикрепленном скриншоте я создал объект «testObj» в окне. Затем я расположился в профилировщике (после создания записи), и он показывает полный размер объекта и все, что в нем находится в «сохраненном размере».
Подробнее о поломках памяти .
На приведенном выше снимке экрана объект показывает оставшийся размер 60. Я полагаю, что единица измерения - это байты.
источник
comparison
вид внизу. Это делает очевидным, какие объекты были созданы между двумя снимками.Shallow size
кажется как 40 для обоих{ a:"55c2067aee27593c03b7acbe", b:"55c2067aee27593c03b7acbe", c:null, d:undefined }
и{ c:null, d:undefined }
объектов. Это нормально?node --inspect
и в Chrome введитеabout:inspect
в строке URL-адреса и найдите открытие инспектора узлов. Создайте свой объект в CLI узла и затем сделайте снимок кучи.Я просто написал это, чтобы решить аналогичную проблему. Это не совсем то, что вы можете искать, то есть не учитывает, как интерпретатор хранит объект.
Но если вы используете V8, это должно дать вам довольно хорошее приближение, так как классные прототипы и скрытые классы поглощают большую часть накладных расходов.
источник
Иногда я использую это для пометки действительно больших объектов, которые могут отправляться клиенту с сервера. Это не представляет в памяти след. Он просто дает вам приблизительно столько, сколько стоило бы отправить его или сохранить.
Также обратите внимание, это медленно, только для разработчиков Но для получения приблизительного ответа с одной строкой кода это было полезно для меня.
источник
VM1409:1 Uncaught TypeError: Converting circular structure to JSON
:( все еще полезно, хотяВот несколько более компактное решение проблемы:
источник
typeof ...
не будут работать.Существует модуль NPM, чтобы получить размер объекта , вы можете установить его с
npm install object-sizeof
источник
Это хакерский метод, но я попробовал его дважды с разными числами, и он, кажется, соответствует.
Вы можете попытаться выделить огромное количество объектов, например, один или два миллиона объектов того типа, который вам нужен. Поместите объекты в массив, чтобы сборщик мусора не освободил их (обратите внимание, что это приведет к небольшим накладным расходам памяти из-за массива, но я надеюсь, что это не должно иметь значения, кроме того, если вы будете беспокоиться о том, что объекты находятся в памяти храните их где-нибудь). Добавьте предупреждение до и после выделения и в каждом предупреждении проверьте, сколько памяти занимает процесс Firefox. Прежде чем открыть страницу с тестом, убедитесь, что у вас есть свежий экземпляр Firefox. Откройте страницу, обратите внимание на использование памяти после появления предупреждения «до». Закройте оповещение, дождитесь выделения памяти. Вычтите новую память из старой и разделите ее на количество выделенных ресурсов.
Я попробовал это на своем компьютере, и у процесса было 48352 КБ памяти, когда было показано предупреждение «до». После выделения Firefox имел 440236 КБ памяти. Для 2 миллионов выделений это около 200 байтов для каждого объекта.
Я попробовал это снова с распределением в 1 миллион, и результат был похож: 196 байтов на объект (я полагаю, дополнительные данные в 2mill использовались для Array).
Итак, вот хакерский метод, который может вам помочь. JavaScript не предоставляет метод «sizeof» по причине: каждая реализация JavaScript отличается. Например, в Google Chrome та же страница использует около 66 байт для каждого объекта (судя по крайней мере из диспетчера задач).
источник
Извините, я не смог прокомментировать, поэтому я просто продолжаю работу от tomwrong. Эта расширенная версия не будет считать объект более одного раза, таким образом, нет бесконечного цикла. Кроме того, я считаю, что ключ объекта также должен быть приблизительно посчитан.
источник
typeof value === 'object'
не достаточна, и у вас будут исключения, если значение равноnull
.level
содержит данные, ноroughSizeOfObject(level)
возвращает ноль. (Конечно, мой уровень переменных не следует путать с вашим аргументом. Я не думаю, что затенение переменных должно вызывать здесь проблему, а также, когда я переименую «уровень» в вашем скрипте, я получаю тот же результат.) Снимок экрана : snipboard.io/G7E5yj.jpgИмея ту же проблему. Я искал в Google и хочу поделиться с сообществом stackoverflow этим решением.
Важно :
Что вы думаете об этом?
источник
Следуя этому комментарию, вот что вы должны сделать: Попробуйте создать проблему с памятью - напишите код, который создает все эти объекты и постепенно увеличивает верхний предел до тех пор, пока вы не столкнулись с проблемой (сбой браузера, зависание браузера или выход из строя). ошибка памяти). В идеале вы должны повторить этот эксперимент с разными браузерами и разными операционными системами.
Теперь есть два варианта: вариант 1 - вам не удалось создать проблему с памятью. Следовательно, вы беспокоитесь ни за что. У вас нет проблем с памятью, и ваша программа в порядке.
вариант 2 - у вас проблемы с памятью. Теперь спросите себя, является ли разумным предел, при котором возникла проблема (другими словами: вероятно ли, что это количество объектов будет создано при обычном использовании вашего кода). Если ответ «Нет», то все в порядке. В противном случае вы теперь знаете, сколько объектов может создать ваш код. Переработайте алгоритм так, чтобы он не нарушал этот предел.
источник
Если ваша основная проблема - использование памяти расширением Firefox, я советую проверить с разработчиками Mozilla.
Mozilla предоставляет в своей вики список инструментов для анализа утечек памяти .
источник
Эта библиотека Javascript
sizeof.js
делает то же самое. Включите это такФункция sizeof принимает объект в качестве параметра и возвращает его приблизительный размер в байтах. Например:
Функция sizeof может обрабатывать объекты, которые содержат несколько ссылок на другие объекты и рекурсивные ссылки.
Первоначально опубликовано здесь .
источник
Инструменты разработчика Chrome обладают этой функциональностью. Я нашел эту статью очень полезной и делает именно то, что вы хотите: https://developers.google.com/chrome-developer-tools/docs/heap-profiling
источник
Большое спасибо всем, кто работал над кодом для этого!
Я просто хотел добавить, что я искал точно такую же вещь, но в моем случае это для управления кэшем обработанных объектов, чтобы избежать необходимости повторного анализа и обработки объектов из вызовов ajax, которые могли или не могли быть кэшированы. браузером. Это особенно полезно для объектов, которые требуют большой обработки, обычно для всего, что не в формате JSON, но может оказаться очень дорогостоящим хранить эти вещи в большом проекте или в приложении / расширении, которое долго работает время.
Во всяком случае, я использую это для чего-то вроде:
Это упрощенный пример и может иметь некоторые ошибки, но он дает идею, поскольку вы можете использовать его для удержания статических объектов (содержимое не изменится) с некоторой степенью интеллекта. Это может значительно сократить любые дорогостоящие требования к обработке, которые объект должен был быть произведен в первую очередь.
источник
источник
Я использую вкладку « Временная шкала» инструментов Chrome dev , создаю все более и более крупные объекты и получаю такие хорошие оценки. Вы можете использовать html, подобный приведенному ниже, в качестве примера и изменить его, чтобы лучше имитировать характеристики ваших объектов (количество и типы свойств и т. Д.). Возможно, вы захотите щелкнуть значок мусорного ведра в нижней части вкладки инструментов разработчика, до и после запуска.
Создание 2 миллионов объектов только с одним свойством каждый (как в этом коде выше) приводит к грубому вычислению 50 байтов на объект, на моем Chromium, прямо сейчас. Изменение кода для создания случайной строки для объекта добавляет около 30 байт для объекта и т. Д. Надеюсь, это поможет.
источник
Если вам нужно программно проверить на aprox. Размер объектов Вы также можете проверить эту библиотеку http://code.stephenmorley.org/javascript/finding-the-memory-usage-of-objects/, которую я смог использовать для размера объектов.
В противном случае я предлагаю использовать Chrome / Firefox Heap Profiler.
источник
Я полагаю, вы забыли включить «массив».
источник
Я знаю, что это абсолютно неправильный способ сделать это, но в прошлом мне уже несколько раз приходилось получать приблизительный размер объектного файла:
Запишите ваш объект / ответ на консоль или новую вкладку, скопируйте результаты в новый файл блокнота, сохраните его и проверьте размер файла. Сам файл блокнота занимает всего несколько байтов, поэтому вы получите довольно точный размер объектного файла.
источник