использует ли V8 стек и кучу, как JVM? если он помещает примитивы в стек и объекты в кучу?
Стек и куча в V8 (JavaScript)
Ответ 1
Да, V8 использует кучу, похожую на JVM и большинство других языков. Это, однако, означает, что локальные переменные (как общее правило) помещаются в стек и объекты в куче. Это может, например, не выполняться, если функция закрывается над этими значениями. Как и в JVM, примитивы могут храниться только в стеке, если они хранятся в локальной переменной.
Как пользователь, это не то, о чем вам обычно нужно беспокоиться.
Ответ 2
- В V8
null
,undefined
,true
иfalse
внутренне кучи выделенных объектов. Если вы отправляетесь с Java, вы можете сказать, чтоtrue
иfalse
в V8 больше похожи наBoolean.TRUE
иBoolean.FALSE
в Java. - Существует важное различие между реальными локальными переменными и переменными, которые захватываются закрытием или затенены eval/with. Захватывающие переменные хранятся в специальной структуре, выделенной кучей, называемой Context и доступны косвенно. Для получения дополнительной информации о реальном и контексте выделяет переменные, см. мой ответ на другой вопрос
-
У V8 есть два компилятора: не оптимизирующий (он же полный) и оптимизирующий:
- Не оптимизирующий компилятор не может хранить числа с плавающей запятой и целые числа за пределами 31-битного (32-разрядного на x64) в стеке, он всегда помещает их в HeapNumber s. Он не пытается выполнять распределение регистров и сохраняет реальные локальные переменные в стеке.
- Оптимизация компилятора намного умнее. Он регистрирует распределение (линейное сканирование) и может хранить полные 32-битные целые числа и числа с плавающей запятой в стеке и в регистрах (включая регистры XMM).
-
Говоря о JVM: он может выполнять так называемое распределение стека и выделять неэкранирующий объект в стеке вместо кучи. Более общая оптимизация (скалярная замена) иногда может полностью исключить выделение неэкранирующего объекта и взорвать его в отдельные поля.
Ответ 3
В наиболее общих терминах Да V8 использует кучу и стек для работы, где общие локальные переменные хранятся в стеке, а объекты, которые необходимо сохранить, хранятся в куче.