BŁĄD KRYTYCZNY: Nieefektywne kompaktowanie znaczników w pobliżu limitu sterty Alokacja nie powiodła się - brak pamięci w stercie JavaScript w module ionic 3


Odpowiedzi:


164

Aby uzyskać ogólną odpowiedź nie-kątową dla tych, którzy trafiają na to pytanie od Google:

Za każdym razem, gdy napotykasz ten błąd, prawdopodobnie jest to spowodowane wyciekiem pamięci lub różnicą między sposobem zarządzania pamięcią przez Node <= 10 i Node> 10. Zwykle samo zwiększenie pamięci przydzielonej do Node pozwoli na uruchomienie programu, ale może nie rozwiązać rzeczywistego problemu, a pamięć używana przez proces węzła może nadal przekraczać nową przydzieloną pamięć. Radziłbym profilować użycie pamięci w procesie węzła, gdy zaczyna działać lub aktualizować do węzła> 10.

Miałem wyciek pamięci. Oto świetny artykuł na temat debugowania wycieków pamięci w węźle.

To powiedziawszy, aby zwiększyć pamięć, w terminalu, w którym uruchamiasz proces Node:

export NODE_OPTIONS="--max-old-space-size=8192"

gdzie wartości max-old-space-sizemogą być: [2048, 4096, 8192, 16384]itp

[AKTUALIZACJA] Więcej przykładów dla większej przejrzystości:

export NODE_OPTIONS="--max-old-space-size=5120" #increase to 5gb
export NODE_OPTIONS="--max-old-space-size=6144" #increase to 6gb
export NODE_OPTIONS="--max-old-space-size=7168" #increase to 7gb
export NODE_OPTIONS="--max-old-space-size=8192" #increase to 8gb

# and so on...

# formula:
export NODE_OPTIONS="--max-old-space-size=(X * 1024)" #increase to Xgb

# Note: it doesn't have to be multiples of 1024. 
# max-old-space-size can be any number of memory megabytes(MB) you have available.

14
FYI, wartość domyślna to 512 MB. Nie musisz od razu przeskakiwać do 10-krotności tej kwoty, możesz najpierw spróbować czegoś między 512 a 5120.
Cameron Hudson

Dzięki temu działa to dla wszystkich typów aplikacji mających problemy z pamięcią.
invinciblemuffi

5
Chcę tylko podkreślić - to nie zawsze wskazuje na wyciek pamięci. Być może biblioteka, której używasz, zużywa nieco więcej pamięci niż kiedyś. Dla nas next.jszaczął upaść naszą aplikację z funkcją szybkiego odświeżania.
Daniel Cooke,

@DanielCooke jaką wartość użyłeś dla następnego js? czy możesz podzielić się, jakie rozwiązanie zastosowałeś dla tego problemu, w następnym js
MSD

@MSD Wydaje się, że radzimy sobie z 4096 max-old-space-size z następnym> 9,6. Dla wersji produkcyjnych i deweloperów
Daniel Cooke

64

W moim przypadku napraw ten problem, instalując NodeJs w wersji 12.10.0


1
To samo tutaj. Właśnie zmieniłem wersję i jej działanie.
brunocascio

9
W kontekście Node 12 ma inną strategię zarządzania stertą, która opiera się na dostępnej pamięci zamiast na używaniu wartości domyślnych. Więcej szczegółów tutaj: Foundation.nodejs.org/announcements/2019/04/24/…
Derek Dowling

Nic innego nie działało dla mnie, to było to. Dziękuję bardzo :)
Hussain Alaidarous

Zaktualizowaliśmy do węzła 12 i błąd zniknął, łatwiejszy niż zarządzanie stertą na węźle 10
Raffaeu,

1
@DerekDowling Wayback Link przyczyna łamane: web.archive.org/web/20191103115941/https://...
Grim

63

ten sam problem na serwerze centos 7, ale to rozwiązało mój problem:

node --max-old-space-size=X node_modules/@angular/cli/bin/ng build --prod

Gdzie X = (2048 or 4096 or 8192 o..)jest wartość pamięci


2
po zmianie wartości x .. błąd pozostaje taki sam
Sohail Ahmad

Jeśli błąd będzie się powtarzał, zwiększaj rozmiar, aż będzie wystarczająco dużo pamięci do przetworzenia, co ostatecznie zapobiegnie błędowi. Jedyny raz znalazłem nie mogłem ominąć ten błąd był z ng servei a masywne js pliku określonego w scriptsczęści angular.json, która musiała zostać załadowane do pamięci.
atconway

czy mogę ustawić wartość X większą niż 8192? Mam 32 GB pamięci RAM
Diego

dla mnie podanie max-old-space-size w linii poleceń NIE działało. MOŻE to być interakcja z węzłem opartym na NVM? zamiast tego wewnątrz skryptu bash użyłem 'NODE_OPTIONS = "- max-old-space-size = 2048" node $ NG build --prod --progress = false', który działał, w przeciwieństwie do 'node --max-old -space-size = 2048 $ NG build --prod --progress = false ', co nie. Nadal nie wiem dlaczego.
Simon H


25

Wystąpił ten sam błąd, gdy wykonuję ng buildpolecenie w kodzie programu Visual Studio. Ale mogę pomyślnie budować, gdy wykonuję to samo w wierszu poleceń systemu Windows w następującej kolejności.

Krok 1.

set NODE_OPTIONS=--max_old_space_size=4096

Krok 2.

ng build

Dzięki, że bardzo mi pomogło, właśnie
zmieniłem

11

Otrzymałem ten sam komunikat o błędzie, gdy wykonuję następujące instrukcje w kodzie programu Visual Studio. Ale mogę pomyślnie budować, gdy wykonuję to samo w wierszu poleceń systemu Windows.

npm install -g increase-memory-limit
increase-memory-limit
set NODE_OPTIONS=--max_old_space_size=4096
ng build -c deploy --build-optimizer --aot --prod --sourceMap

7
node --max_old_space_size=4096 node_modules/@angular/cli/bin/ng build --baseHref=/baseUrl/ --prod=true

21
Chociaż ten kod może odpowiedzieć na pytanie, zapewnia dodatkowy kontekst dotyczący tego, dlaczego i / lub jak ten kod odpowiada, poprawia jego długoterminową wartość.
Eric Leschinski

7

Z pewnych powodów wszystkie powyższe odpowiedzi tak naprawdę nie działały dla mnie, wykonałem następujące czynności, aby rozwiązać problem:

  1. Musiałem najpierw usunąć node_modulesfolder
  2. ponownie zainstaluj node.js na moim komputerze i
  3. następnie npm install

krok 2 nie jest obowiązkowy. Wypróbowałem rozwiązanie górne i zadziałało również bez kroku 2
analityk,

cóż, możesz nie potrzebować kroku 2, podzieliłem się tylko tym, co działało dla mnie :)
sambayour

5

Wymień linię

"start": "ng serve -o --port 4300 --configuration=en" z

"start": "node --max_old_space_size=5096 node_modules/@angular/cli/bin/ng serve -o --port 4300 --configuration=en"

UWAGA:

  1. port - 4300 nie jest stałą, zależy od wybranego portu.

  2. --max_old_space_size = 5096 zbyt niestała; dowolna wartość 1024,2048,4096 itd


5

W moim przypadku była to rekurencja która powodowała, że ​​reakcja zużywała całą pamięć.

Stało się to podczas refaktoryzacji kodu i tego nie zauważyłem.

const SumComponent = () => {
  return (
    <>
      <SumComponent />
    </>
  ) 
}

W innych aplikacjach węzłów może to wyglądać tak:

const someFunction = () => {
  ...
  someFunction(); 
  ...
}

1
Dlaczego to był problem? <> </> powinno być poprawne w React zamiast używać <React.Fragment>, prawda?
Joelgullander

@Codehiker Tak, to nowa składnia w React 16
Rusty

4
Rekursja polega na tym, że SumComponentzawiera SumComponent(który zawiera a, SumComponentktóry zawiera SumComponent...)
kamień

5

node --max_old_space_size = 4096 ./node_modules/@angular/cli/bin/ng build --prod --build-optimizer

dodanie parametru --build-optimizer rozwiązało problem w moim przypadku.

Aktualizacja:

Nie jestem pewien, dlaczego dodanie tylko --build-optimizer rozwiązuje problem, ale zgodnie z dokumentami kątowymi powinno być używane z włączonym aot, więc zaktualizowane polecenie powinno wyglądać jak poniżej

--build-optimizer=true --aot=true

Dokumentacja kompilacji Angular


4

Uruchom to polecenie w folderze projektu. Użyj służyć zamiast budowania

node --max_old_space_size=8000 node_modules/@angular/cli/bin/ng serve  --prod --port=4202

3

Dla mnie był to problem z pakietem firebase.

Dodaj tylko "@ firebase / database": "0.2.1", dla twojego package.json, zainstaluj ponownie node_modules i działa.


2

Usunąłem istniejący moduł węzła i uruchomiłem poniższe polecenia, aby naprawić mój problem

npm install -all
npm audit fix

2

Pls sprawdź wersję swojego węzła:

   $  node -v

Jeśli jest to coś 10.1.1, musisz zaktualizować wersję węzła poziomu głównego za pomocą poniższych poleceń

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash


$ source ~/.nvm/nvm.sh

$ nvm ls

$ nvm install 12.18.1

Po zakończeniu uruchom ponownie terminal lub studio wizualne.

To praca 100 $

Dla użytkowników jonowych proszę dodać poniższy kod do pliku package.json dla użytkownika jonowego

 "ionic:build": "node --max-old-space-size=16384 ./node_modules/@ionic/app-scripts/bin/ionic-app-scripts.js build",
    


faktycznie to działa app-scripts, jeśli budujesz sieć internetową , ale jeśli budujesz Androida lub skrypt, jak w ionic cordova build androidjaki sposób?
Muhammed Moussa


2

Kolejna nie-kątowa odpowiedź (miałem ten sam problem podczas budowania aplikacji reagującej na AWS Amplify).

Jak wspomniał Emmanuel, wydaje się, że wynika to z różnicy w sposobie obsługi pamięci przez węzeł v10 i węzeł v12.

Bezskutecznie próbowałem zwiększyć pamięć. Ale użycie węzła v12 zrobiło to.

Sprawdź, jak możesz dodać nvm use $VERSION_NODE_12do swoich ustawień kompilacji, jak wyjaśnił Richard

frontend:
  phases:
    preBuild:
      commands:
        - nvm use $VERSION_NODE_12
        - npm ci
    build:
      commands:
        - nvm use $VERSION_NODE_12
        - node -v
        - npm run-script build

1

U mnie problem polegał na tym, node_modulesże miałem dodatkowy folder, na który zmieniłem nazwę, node_modules_oldi uruchomiłem, npm installaby wygenerować nowy plik node_modules. W jakiś sposób kompilacja musiała nadal pobierać node_modules_oldfolder, więc wyprowadziłem node_modules_oldsię z katalogu, aby naprawić problem.


1

Po prostu wpisz to w terminalu:

export NODE_OPTIONS="--max-old-space-size=8192"

1

U mnie wystąpił błąd składni (który się nie pojawił) i spowodowałem ten błąd.


0

Sprawdź nazwę swojego folderu. Jeśli nazwa folderu zawiera spacje, wygenerują się tego rodzaju problemy. Zmień nazwę bez spacji. mam nadzieję, że to zadziała.


0

Jeśli dzieje się tak podczas uruchamiania aplikacji React na VSCode, sprawdź swoje właściwości propTypes, niezdefiniowane Proptypes prowadzą do tego samego problemu.


0

U mnie pojawił się ten błąd, ponieważ utraciłem dostęp do ścieżki wyjściowej dla folderu dist ustawionego w moim pliku angular.json. Po ponownym połączeniu się ze zdalną ścieżką ze zaktualizowanymi poświadczeniami błąd zniknął.


0

#! / usr / bin / env node --max-old-space-size = 4096 w pracy ionic-app-scripts.js dint

Modyfikowanie

node_modules / .bin / ionic-app-scripts.cmd

Poprzez dodanie:

@IF EXIST "% ~ dp0 \ node.exe" ("% ~ dp0 \ node.exe" "% ~ dp0 .. @ ionic \ app-scripts \ bin \ ionic-app-scripts.js"% *) ELSE ( @SETLOCAL @SET PATHEXT =% PATHEXT:;. JS; =;% node --max_old_space_size = 4096 "% ~ dp0 .. @ ionic \ app-scripts \ bin \ ionic-app-scripts.js"% *)

Pracował fianlly


0

U mnie napotkałem ten problem podczas uruchamiania eslint i ładniejszej poprawki i formatowania z buildkatalogiem w moim projekcie React, po usunięciu go wszystko działało. Myślę, że dzieje się tak, ponieważ jest zbyt wiele plików.


0

Myślę, że istnieje wiele sposobów na osiągnięcie tego błędu!

Po mojej stronie miałem pętlę w moim package.json. Projekt A miał zależność od projektu B, który miał zależność od projektu A.


0

Czasami prostota jest kluczem do sukcesu. Szukaj while (i <= 10000) {}bez zwiększania ikodu;)


0

Ten problem zniknął po zaktualizowaniu wszystkich moich bibliotek, takich jak nodejs, maszynopis, przędza, npm itp. Dla mojego projektu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.