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

175

Kiedy uruchamiam projekt ionic 3 przy użyciu polecenia „ionic serv” niż otrzymuję ten błąd:

wprowadź opis obrazu tutaj

Himanshu Shekhar
źródło

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.
Emmanuel NK
źródło
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

Germán Ayala
źródło
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

Hakim CHRIFI ALAOUI
źródło
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
26

Wypróbuj to rozwiązanie, które wskazywało w starej wiadomości na forum: https://forum.ionicframework.com/t/3-7-0-ios-build-with-prod-not-working/107061/24

otwarty node_modules/@ionic/app-scripts/bin/ionic-app-scripts.js

Zmień pierwszą linię z:

#!/usr/bin/env node

do

#!/usr/bin/env node --max-old-space-size=4096

Wypróbuj wartości 1024 i 2048, ale w przypadku stosunkowo dużej aplikacji możesz potrzebować 4096.

runnerpaul
źródło
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
Sushrut Singh Sisodiya
źródło
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
heinele
źródło
7
node --max_old_space_size=4096 node_modules/@angular/cli/bin/ng build --baseHref=/baseUrl/ --prod=true
Mohammad Lockman
źródło
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
sambayour
źródło
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

Sarath Mohandas
źródło
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(); 
  ...
}
Zardzewiały
źródło
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

Akshay Naik
źródło
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
Deepu Reghunath
źródło
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.

Pol Fernández
źródło
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
Pritiranjan Swain
źródło
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",
    

Yogesh Kumar
źródło
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

Aktualizacja z Węzła 12 do Węzła 14 rozwiązała problem za mnie

Hakan Fıstık
źródło
1
gotowe, naprawdę działa
a2htray yuen
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
kartonnade
źródło
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.

badjr
źródło
1

Po prostu wpisz to w terminalu:

export NODE_OPTIONS="--max-old-space-size=8192"
Matt
źródło
1

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

JoshuaRDBrown
źródło
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.

Roney Francis
źródło
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.

kishorekumaru
źródło
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ął.

justTech
źródło
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

Subhamay
źródło
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.

Sean
źródło
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.

Remi
źródło
0

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

Matthis Kohli
źródło
0

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

Oguzhan KIRCALI
źródło