Сборщик мусора JS

JS GC имеет два пространства: молодое и старое. Во-первых, любое распределение переменных происходит в молодом пространстве, а затем некоторые из них могут быть переведены в старую коллекцию. Молодые коллекции ограничены 1-16 МБ. У меня вопрос: если разработчик объявит переменную, размер которой больше размера молодого пространства, что произойдет? Эта переменная напрямую перемещается в старое пространство?

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

Bergi 21.09.2018 18:11

@Bergi Не могли бы вы помочь понять, что эта статья говорит о Don’t add large files to memory This one is obvious and well known. If you have large files to process, for example a large CSV file, read it line-by-line and process in little chunks instead of loading the entire file to memory. There are rather rare cases where a single line of csv would be larger than 1mb, thus allowing you to fit it in New Space.ссылка

Vladimir Topolev 27.09.2018 11:04

Это означает, что потоковая передача выполняется быстрее, чем загрузка целых файлов сразу.

Bergi 27.09.2018 11:16

@Bergi а что с fit it New Space

Vladimir Topolev 27.09.2018 15:49

Он просто говорит, что ожидается, что отдельный элемент потока уместится в «новом пространстве».

Bergi 27.09.2018 15:52

@Bergi хорошо, если размер чанка (отдельного элемента потока) умещается в новом пространстве, то он выделяется в новом пространстве. Что произойдет, если размер блока не соответствует размеру New Space?

Vladimir Topolev 30.09.2018 22:09

Тогда вы делаете что-то не так, так как чанки размером mB нигде не должны появляться :-) Но они просто будут выделены в другом месте, и сборщик мусора, вероятно, соберет их позже, то есть менее эффективно.

Bergi 30.09.2018 22:33

)) Значит ли это, что этот чанк может быть размещен в Старом пространстве сразу, минуя Молодое поколение, где алгоритм GC более эффективен?

Vladimir Topolev 30.09.2018 22:48

Скорее "Пространство больших объектов". Но это действительно зависит от того, откуда берется такой большой объект (возможно, строка или буфер).

Bergi 30.09.2018 22:53

@Bergi Я не понимаю следующую фразу: Avoid large objects in hot functions Ideally you want to avoid large objects inside of hot functions so that all data is fit into New Space. Я предсказываю, что в New Space JS используется более эффективный алгоритм (Scavenge) и сборщик мусора не занимает много времени. Для старого поколения JS использует алгоритм Mark-Sweet, который требует больше времени. Поэтому, если мы пытаемся выделить большой объект (размер больше, чем размер New Space) в горячей функции, он напрямую выделяется в Old Space с менее эффективным алгоритмом. Иначе я не понимаю смысла.

Vladimir Topolev 30.09.2018 23:02

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

Bergi 30.09.2018 23:12

@Bergi, спасибо) в этом есть смысл.

Vladimir Topolev 30.09.2018 23:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
12
52
1

Ответы 1

То, как именно работает сборщик мусора (например, использует ли он Полукосмическое молодое поколение), зависит от реализации, то есть варьируется в зависимости от времени выполнения javascript, и это не так важно, если вы не хотите углубляться в территорию оптимизации производительности.

Описываемое вами поведение является специфическим для конкретной реализации, а не общим свойством стандартизованного языка javascript.

Что важно, сборщики обеспечивают поведение, предписанное спецификацией. И в спецификации ничего не говорится о конкретном пороге размера, таком как 16 МБ, после которого объекты должны обрабатываться по-другому.

Is this variable promoted to old space directly?

Это была бы одна из возможных стратегий реализации.

Другие вопросы по теме