Mam problemy ze zrozumieniem, jak działa Node.js na podstawie parametru max-old-space-size
.
Na przykład w moim przypadku uruchamiam dwie t2.small
instancje AWS (2 GB pamięci RAM).
Nie wiem dlaczego, ale ustawiłem max-old-space-size=4096
(4 GB). Co w tym przypadku robi node? Czy ta konfiguracja może prowadzić do możliwego błędu alokacji pamięci?
Jak określić poprawną wartość na max-old-space-size
podstawie zasobów serwera?
Moja aplikacja stale zwiększa wykorzystanie pamięci i staram się zrozumieć wszystko na temat wewnętrznych elementów węzła.
--optimize-for-size
zmniejszyć zużycie pamięci.Odpowiedzi:
„Stare miejsce” to największa i najbardziej konfigurowalna sekcja zarządzanej (czyli zbieranej bezużytecznie) stosu V8 (czyli miejsca, w którym znajdują się obiekty JavaScript), a
--max-old-space-size
flaga kontroluje jej maksymalny rozmiar. Gdy zużycie pamięci zbliża się do limitu, V8 poświęci więcej czasu na czyszczenie pamięci w celu zwolnienia nieużywanej pamięci.Jeśli zużycie pamięci sterty (tj. Obiektów na żywo, których GC nie może zwolnić) przekroczy limit, V8 zawiesi twój proces (z powodu braku alternatywy), więc nie chcesz ustawiać go zbyt nisko. Oczywiście, jeśli ustawisz go zbyt wysoko, dodatkowe użycie sterty, na które pozwoli V8, może spowodować wyczerpanie pamięci w całym systemie (i zamianę lub zabicie przypadkowych procesów, z braku alternatywy).
Podsumowując, na komputerze z 2 GB pamięci prawdopodobnie
--max-old-space-size
ustawiłbym około 1,5 GB, aby zostawić trochę pamięci do innych zastosowań i uniknąć zamiany.źródło
d8 --help
:--max-old-space-size (max size of the old space (in Mbytes))
Aktualizacja 2020
Te opcje są teraz oficjalnie udokumentowane według węzła . W przypadku maszyny 2 GB prawdopodobnie powinieneś użyć:
NODE_OPTIONS=--max-old-space-size=1536
Aby określić ilość do wykorzystania : Możesz sprawdzić dostępną pamięć na komputerze z systemem Linux za pomocą
free -m
. Należy pamiętać, że można użyćfree
, abuffers/cache
pamięć łączy się, jakbuffers/cache
można wyrzucić (te bufory i cache są sposobem miły w użyciu inaczej nieużywaną pamięć).Zwróć uwagę na oficjalną dokumentację dla
max-old-space-size
wzmianek:Stąd powyższa wartość. Weź pod uwagę, że ilość pamięci potrzebnej dla podstawowego systemu operacyjnego nie zmienia się zbytnio, więc możesz szczęśliwie zrobić 3.5 na maszynie 4 GB itp.
źródło
Ten błąd występuje, gdy pamięć przydzielona aplikacji wykonującej jest mniejsza niż wymagana pamięć. Domyślnie limit pamięci w Node.js wynosi 512 MB. Aby zwiększyć tę kwotę, musisz ustawić argument limitu pamięci
—-max-old-space-size
. Pomoże to uniknąć problemu z limitem pamięci.node --max-old-space-size=1024 index.js #increase to 1gb node --max-old-space-size=2048 index.js #increase to 2gb node --max-old-space-size=3072 index.js #increase to 3gb node --max-old-space-size=4096 index.js #increase to 4gb node --max-old-space-size=5120 index.js #increase to 5gb node --max-old-space-size=6144 index.js #increase to 6gb node --max-old-space-size=7168 index.js #increase to 7gb node --max-old-space-size=8192 index.js #increase to 8gb
https://medium.com/@vuongtran/how-to-solve-process-out-of-memory-in-node-js-5f0de8f8464c
źródło
node --v8-options
), że domyślnie zgłaszany jest 4096 i bez ustawiania używanego przeze mniemax-old-space-size
zestawu testów uzyskuje przydzielone do 1,5 Gb bez żadnych problemów. Artykuł w medium, do którego prowadzi link, pochodzi z 2016 roku, więc prawdopodobnie od czasu jego napisania sytuacja się zmieniła.node -e "console.log(`node heap limit = ${require('v8').getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)"
-> wersja 12.18.0 i wersja 14.3.0 -> 2096 MB, wersja 10.20.1 -> 1432 MBheap_size_limit
. W przypadku normalnej powłoki UNIX należy ją cytować inaczej:node -e 'console.log(`node heap limit = ${require("v8").getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)'
Jeśli chcesz, aby wszystko działało z projektu, nad którym pracujesz, wykonaj dwa kroki:
W twoim projekcie cd to node_module / @ angular cd node_module / @ angular
Teraz uruchom poniższe polecenie export NODE_OPTIONS = - max-old-space-size = 8192
źródło