Подтвердить что ты не робот

Стек и куча в V8 (JavaScript)

использует ли V8 стек и кучу, как JVM? если он помещает примитивы в стек и объекты в кучу?

4b9b3361

Ответ 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 использует кучу и стек для работы, где общие локальные переменные хранятся в стеке, а объекты, которые необходимо сохранить, хранятся в куче.