stack and heap in V8 (JavaScript)

Czy V8 używa stosu i sterty jak JVM? jeśli tak, to czy stawia prymitywy na stosie i przedmioty na stercie?

Author: Mathias Schwarz, 2011-07-07

3 answers

Tak, V8 używa sterty podobnej do JVM i większości innych języków. Oznacza to jednak, że zmienne lokalne (z reguły) są umieszczane na stosie, a obiekty na stosie. Może to na przykład nie zostać utrzymane, jeśli funkcja zamyka się nad tymi wartościami. Podobnie jak w JVM, prymitywy mogą być przechowywane na stosie tylko wtedy, gdy są przechowywane w zmiennej lokalnej.

Jako użytkownik nie jest to coś, o co normalnie trzeba się martwić.

 15
Author: Mathias Schwarz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-06 21:26:00
  • W V8 null, undefined, true i false wewnętrznie są przydzielonymi obiektami . Jeśli pochodzisz z Javy, możesz powiedzieć, że true i false W V8 są bardziej podobne do Boolean.TRUE i Boolean.FALSE w Javie.
  • istnieje istotna różnica między zmiennymi lokalnymi rzeczywistymi a zmiennymi, które są przechwytywane przez zamknięcia lub cieniowane przez eval/with. Zmienne przechwytujące są przechowywane w specjalnej strukturze przydzielonej stercie o nazwie Context i są dostępne pośrednio. Więcej szczegóły dotyczące real vs. kontekst przydziela zmienne zobacz moja odpowiedź na inne pytanie
  • V8 ma dwa Kompilatory: nie-optymalizujący (aka pełny) i optymalizujący jeden:

    • kompilator nie optymalizujący nie może przechowywać liczb zmiennoprzecinkowych i liczb całkowitych poza 31-bitowym (32-bitowym na x64) na stosie zawsze umieszcza je w HeapNumbers. nie próbuje przydzielać rejestrów i przechowuje rzeczywiste zmienne lokalne na stosie. stack.
    • optymalizacja kompilatora jest znacznie mądrzejsza. Zajmuje się alokacją rejestrów (skanowaniem liniowym) i może przechowywać pełne 32-bitowe liczby całkowite i zmiennoprzecinkowe na stosie i w rejestrach (w tym rejestrach XMM).
  • Mówiąc o JVM: może wykonywać tak zwaną alokację stosu i przydzielać obiekt nie uciekający na stosie zamiast sterty. Bardziej ogólna optymalizacja (zastępowanie skalarne) może czasami całkowicie wyeliminować alokację nie uciekającego obiektu i eksplodować go w oddzielne pola.

 29
Author: Vyacheslav Egorov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:37

W najbardziej ogólnym ujęciu, Yes V8 używa sterty i stosu do działania, w którym ogólne zmienne lokalne są przechowywane w stosie, podczas gdy obiekty, które muszą być utrzymywane, są przechowywane w stercie.

 0
Author: kg11,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-30 09:31:58