JS GC имеет два пространства: молодое и старое. Во-первых, любое распределение переменных происходит в молодом пространстве, а затем некоторые из них могут быть переведены в старую коллекцию. Молодые коллекции ограничены 1-16 МБ. У меня вопрос: если разработчик объявит переменную, размер которой больше размера молодого пространства, что произойдет? Эта переменная напрямую перемещается в старое пространство?
@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.ссылка
Это означает, что потоковая передача выполняется быстрее, чем загрузка целых файлов сразу.
@Bergi а что с fit it New Space
Он просто говорит, что ожидается, что отдельный элемент потока уместится в «новом пространстве».
@Bergi хорошо, если размер чанка (отдельного элемента потока) умещается в новом пространстве, то он выделяется в новом пространстве. Что произойдет, если размер блока не соответствует размеру New Space?
Тогда вы делаете что-то не так, так как чанки размером mB нигде не должны появляться :-) Но они просто будут выделены в другом месте, и сборщик мусора, вероятно, соберет их позже, то есть менее эффективно.
)) Значит ли это, что этот чанк может быть размещен в Старом пространстве сразу, минуя Молодое поколение, где алгоритм GC более эффективен?
Скорее "Пространство больших объектов". Но это действительно зависит от того, откуда берется такой большой объект (возможно, строка или буфер).
@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 с менее эффективным алгоритмом. Иначе я не понимаю смысла.
Дело не в том, что алгоритм «быстрее» или «эффективнее» другого. Просто стратегия сборки мусора для нового пространства оптимизирована для небольших объектов, которые быстро выделяются, на них не часто ссылаются и которые снова быстро освобождаются. Если вы создаете (и забываете) много больших объектов в горячем коде (который часто выполняется), вы оказываете большее давление на распределитель, и сборщик мусора в целом становится менее эффективным.
@Bergi, спасибо) в этом есть смысл.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


То, как именно работает сборщик мусора (например, использует ли он Полукосмическое молодое поколение), зависит от реализации, то есть варьируется в зависимости от времени выполнения javascript, и это не так важно, если вы не хотите углубляться в территорию оптимизации производительности.
Описываемое вами поведение является специфическим для конкретной реализации, а не общим свойством стандартизованного языка javascript.
Что важно, сборщики обеспечивают поведение, предписанное спецификацией. И в спецификации ничего не говорится о конкретном пороге размера, таком как 16 МБ, после которого объекты должны обрабатываться по-другому.
Is this variable promoted to old space directly?
Это была бы одна из возможных стратегий реализации.
Вы не объявляете переменные с их размером в JS - поэтому нет, значение будет расти, и когда оно достигнет предела, оно будет перемещено. (Хотя действительно большие объекты, такие как буферы изображений и т. д., В любом случае выделяются в отдельном пространстве)