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.