ข้อผิดพลาด FATAL: มาร์ค - คอมแพ็คที่ไม่มีประสิทธิภาพใกล้ขีด จำกัด ฮีปการจัดสรรล้มเหลว - ฮีป JavaScript ไม่อยู่ในหน่วยความจำในไอออนิก 3


175

เมื่อฉันเรียกใช้โครงการไอออนิก 3 โดยใช้คำสั่ง "ไอออนิกให้บริการ" กว่าจะได้รับข้อผิดพลาดนี้:

ใส่คำอธิบายภาพที่นี่

คำตอบ:


164

สำหรับคำตอบทั่วไปที่ไม่ใช่เชิงมุมสำหรับผู้ที่ถามคำถามนี้จาก Google:

ทุกครั้งที่คุณพบข้อผิดพลาดนี้อาจเป็นเพราะหน่วยความจำรั่วหรือความแตกต่างระหว่างวิธีที่โหนด <= 10 และโหนด> 10 จัดการหน่วยความจำ โดยปกติแล้วเพียงแค่เพิ่มหน่วยความจำที่จัดสรรให้กับ Node จะทำให้โปรแกรมของคุณทำงานได้แต่อาจไม่สามารถแก้ปัญหาที่แท้จริงได้และหน่วยความจำที่ใช้โดยกระบวนการโหนดอาจยังเกินหน่วยความจำใหม่ที่คุณจัดสรร ฉันขอแนะนำให้ใช้หน่วยความจำโปรไฟล์ในกระบวนการโหนดของคุณเมื่อเริ่มทำงานหรืออัปเดตเป็นโหนด> 10

ฉันมีความทรงจำรั่วไหล นี่คือบทความที่ยอดเยี่ยมเกี่ยวกับการดีบักการรั่วไหลของหน่วยความจำในโหนด

ที่กล่าวว่าเพื่อเพิ่มหน่วยความจำในเทอร์มินัลที่คุณเรียกใช้กระบวนการโหนดของคุณ:

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

โดยที่ค่าmax-old-space-sizeสามารถเป็น: [2048, 4096, 8192, 16384]ฯลฯ

[UPDATE] ตัวอย่างเพิ่มเติมเพื่อความชัดเจนเพิ่มเติม:

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 ค่าเริ่มต้นคือ 512 MB คุณไม่จำเป็นต้องพุ่งตรงไปที่ 10x จำนวนนั้นคุณสามารถลองทำอะไรระหว่าง 512 ถึง 5120 ก่อนก็ได้
Cameron Hudson

ขอบคุณสิ่งนี้ใช้ได้กับแอปพลิเคชันทุกประเภทที่มีปัญหาเกี่ยวกับหน่วยความจำ
invinciblemuffi

5
เพียงต้องการชี้ให้เห็น - นั่นไม่ใช่สิ่งบ่งชี้ถึงการรั่วไหลของหน่วยความจำเสมอไป บางทีไลบรารีที่คุณใช้อยู่อาจใช้หน่วยความจำมากกว่าที่เคยเป็นมาเล็กน้อย สำหรับเราnext.jsเริ่มทำให้แอปของเราล่มด้วยคุณสมบัติการรีเฟรชอย่างรวดเร็ว
Daniel Cooke

@DanielCooke คุณใช้ค่าอะไรสำหรับ js ต่อไป? คุณช่วยแบ่งปันวิธีแก้ปัญหาที่คุณใช้สำหรับปัญหานี้กับ js ถัดไปได้ไหม
MSD

@MSD ดูเหมือนว่าเราจะได้รับ 4096 max-old-space-size ที่ถัดไป> 9.6 สำหรับการสร้างและพัฒนาการผลิต
Daniel Cooke

64

ในกรณีของฉันแก้ไขปัญหานี้ในการติดตั้ง NodeJs เวอร์ชัน 12.10.0


1
เหมือนกันที่นี่ ฉันเพิ่งเปลี่ยนเวอร์ชันและใช้งานได้
brunocascio

9
สำหรับบริบทโหนด 12 มีกลยุทธ์การจัดการฮีปที่แตกต่างกันซึ่งขึ้นอยู่กับหน่วยความจำที่มีอยู่แทนที่จะใช้ค่าเริ่มต้น รายละเอียดเพิ่มเติมที่นี่: foundation.nodejs.org/announcements/2019/04/24/…
Derek Dowling

ไม่มีอะไรอื่นที่ใช้ได้ผลสำหรับฉันนี่คือมัน ขอบคุณมาก :)
Hussain Alaidarous

เราอัปเดตเป็นโหนด 12 และข้อผิดพลาดหายไปง่ายกว่าการจัดการฮีปบนโหนด 10
Raffaeu

1
@DerekDowling Wayback ทำให้ลิงค์เสีย: web.archive.org/web/20191103115941/https://…
Grim

63

ปัญหาเดียวกันบนเซิร์ฟเวอร์ centos 7 แต่สิ่งนี้ช่วยแก้ปัญหาของฉันได้:

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

X = (2048 or 4096 or 8192 o..)ค่าของหน่วยความจำอยู่ที่ไหน


2
หลังจากเปลี่ยนค่า x .. ข้อผิดพลาดยังคงเหมือนเดิม
Sohail Ahmad

หากข้อผิดพลาดยังคงอยู่ให้เพิ่มขนาดต่อไปจนกว่าจะมีหน่วยความจำเพียงพอที่จะประมวลผลซึ่งจะป้องกันข้อผิดพลาดได้ในที่สุด ครั้งเดียวที่ฉันพบว่าฉันไม่สามารถผ่านข้อผิดพลาดนี้ได้ng serveและไฟล์. js ขนาดใหญ่ที่อ้างอิงในscriptsส่วนของไฟล์angular.jsonนั้นจำเป็นต้องโหลดลงในหน่วยความจำ
atconway

ฉันสามารถตั้งค่าของ X ที่มากกว่า 8192 ได้หรือไม่ ฉันมีแรม 32GB
Diego

สำหรับฉันการจัดหา max-old-space-size บนบรรทัดคำสั่งไม่ได้ผล นี่อาจเป็นการโต้ตอบกับโหนดที่ใช้ nvm หรือไม่ แทนที่จะอยู่ในสคริปต์ทุบตีฉันใช้ 'NODE_OPTIONS = "- max-old-space-size = 2048" node $ NG build --prod --progress = false' ซึ่งใช้งานได้ซึ่งต่างจาก 'node --max-old -space-size = 2048 $ NG build --prod --progress = false 'ซึ่งไม่ได้ ฉันยังไม่รู้ว่าทำไม
Simon H

26

ลองใช้วิธีนี้ซึ่งระบุไว้ในข้อความเก่าในฟอรัม: https://forum.ionicframework.com/t/3-7-0-ios-build-with-prod-not-working/107061/24

เปิด node_modules/@ionic/app-scripts/bin/ionic-app-scripts.js

เปลี่ยนบรรทัดแรกจาก:

#!/usr/bin/env node

ถึง

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

ลองใช้ค่า 1024 และ 2048 แต่สำหรับแอปที่ค่อนข้างใหญ่คุณอาจต้องใช้ 4096


25

ฉันได้รับข้อผิดพลาดเดียวกันเมื่อฉันรันng buildคำสั่งในรหัส Visual Studio แต่ฉันสามารถสร้างได้สำเร็จเมื่อฉันรันสิ่งเดียวกันในบรรทัดคำสั่งของ Windows ตามลำดับต่อไปนี้

ขั้นตอนที่ 1.

set NODE_OPTIONS=--max_old_space_size=4096

ขั้นตอนที่ 2.

ng build

ขอบคุณที่ช่วยฉันได้มากเพิ่งเปลี่ยนเทอร์มินัลของฉัน
Gayatri Dipali

11

ฉันได้รับข้อความแสดงข้อผิดพลาดเดียวกันเมื่อฉันรันคำสั่งต่อไปนี้ในรหัส Visual Studio แต่ฉันสามารถสร้างได้สำเร็จเมื่อฉันรันสิ่งเดียวกันในบรรทัดคำสั่งของ 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
แม้ว่ารหัสนี้อาจตอบคำถาม แต่การให้บริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีที่รหัสนี้ตอบคำถามช่วยเพิ่มมูลค่าในระยะยาว
Eric Leschinski

7

ด้วยเหตุผลบางประการที่คำตอบข้างต้นไม่ได้ผลสำหรับฉันฉันได้ดำเนินการต่อไปนี้เพื่อแก้ไขปัญหาของฉัน:

  1. ฉันต้องลบnode_modulesโฟลเดอร์ก่อน
  2. ติดตั้ง node.js ใหม่บนพีซีของฉันและ
  3. แล้ว npm install

ขั้นตอนที่ 2 ไม่บังคับ ฉันลองใช้โซลูชันด้านบนแล้วและมันก็ใช้ได้สำหรับฉันโดยไม่มีขั้นตอนที่ 2 เช่นกัน
นักวิเคราะห์

คุณอาจไม่ต้องการขั้นตอนที่ 2 ฉันแชร์เฉพาะสิ่งที่ใช้ได้ผลสำหรับฉัน :)
sambayour

5

แทนที่บรรทัด

"start": "ng serve -o --port 4300 --configuration=en" ด้วย

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

บันทึก:

  1. พอร์ต - 4300 ไม่คงที่ขึ้นอยู่กับพอร์ตที่คุณเลือก

  2. --max_old_space_size = 5096 ไม่คงที่เกินไป ค่าใดก็ได้ 1024,2048,4096 เป็นต้น


5

ในกรณีของฉันมันเป็นการเรียกซ้ำที่ทำให้เกิดการตอบสนองเพื่อใช้หน่วยความจำทั้งหมด

เหตุการณ์นี้เกิดขึ้นเมื่อฉันกำลังปรับรหัสใหม่และไม่สังเกตเห็นสิ่งนี้

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

ในแอปโหนดอื่น ๆ อาจมีลักษณะดังนี้:

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

1
เหตุใดจึงเป็นปัญหา <> </> ควรจะใช้ได้ใน React แทนที่จะใช้ <React.Fragment> ใช่ไหม
Joelgullander

@Codehiker ใช่ไวยากรณ์ใหม่ใน React 16
Rusty

4
การเรียกซ้ำคือSumComponentประกอบด้วย a SumComponent(ซึ่งมี a SumComponentซึ่งมีSumComponent... )
หิน

5

โหนด --max_old_space_size = 4096 ./node_modules/@angular/cli/bin/ng build --prod --build-optimizer

การเพิ่มพารามิเตอร์ช่วย--build-optimizer แก้ปัญหาในกรณีของฉัน

อัปเดต:

ฉันไม่แน่ใจว่าทำไมการเพิ่มเพียง --build-optimizer จึงแก้ปัญหาได้ แต่ตามเอกสารเชิงมุมควรใช้กับ aot ที่เปิดใช้งานดังนั้นคำสั่งที่อัปเดตควรเป็นดังนี้

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

เอกสารสร้างเชิงมุม


4

เรียกใช้คำสั่งนี้ในโฟลเดอร์โครงการของคุณ ใช้บริการแทนการสร้าง

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

3

สำหรับฉันมันเป็นปัญหากับแพ็คเกจ firebase

เพิ่มเฉพาะ "@ firebase / database": "0.2.1" สำหรับ package.json ของคุณติดตั้ง node_modules ใหม่และใช้งานได้




2

โปรดตรวจสอบเวอร์ชันโหนดของคุณ:

   $  node -v

หากเป็น 10.1.1 คุณต้องอัปเดตเวอร์ชันโหนดระดับรากของคุณผ่านคำสั่งด้านล่าง

$ 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

เมื่อเสร็จแล้วกรุณารีสตาร์ทเทอร์มินัลหรือสตูดิโอภาพของคุณ

มันทำงานได้ 100 $

สำหรับผู้ใช้ไอออนิกกรุณาเพิ่มรหัสด้านล่างใน package.json ของคุณ สำหรับผู้ใช้ไอออนิก

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


ใช้งานได้จริงถ้าการสร้างเว็บของคุณผ่านapp-scriptsแต่ถ้าคุณสร้าง android หรือสคริปต์เป็นionic cordova build androidอย่างไร
Muhammed Moussa

2

อีกคำตอบที่ไม่ใช่เชิงมุม (ฉันประสบปัญหาเดียวกันกับการสร้างแอปตอบกลับบน AWS Amplify)

ตามที่เอ็มมานูเอลกล่าวไว้ดูเหมือนว่ามันมาจากความแตกต่างในวิธีการจัดการหน่วยความจำโดยโหนด v10 กับโหนด v12

ฉันพยายามเพิ่มหน่วยความจำโดยไม่มีประโยชน์ แต่การใช้โหนด v12 ทำได้

ตรวจสอบว่าคุณสามารถเพิ่มnvm use $VERSION_NODE_12การตั้งค่าการสร้างของคุณได้อย่างไรตามที่ 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

สำหรับฉันปัญหาคือมีnode_modulesโฟลเดอร์พิเศษที่ฉันเปลี่ยนชื่อnode_modules_oldและเรียกใช้npm installเพื่อสร้างไฟล์node_modules. ยังไงก็ตามบิลด์ยังต้องรับnode_modules_oldโฟลเดอร์อยู่ดังนั้นฉันจึงย้ายnode_modules_oldออกจากไดเร็กทอรีเพื่อแก้ไขปัญหา




0

ตรวจสอบชื่อโฟลเดอร์ของคุณ หากชื่อโฟลเดอร์ของคุณมีช่องว่างปัญหาประเภทนี้จะสร้างขึ้น เปลี่ยนชื่อโดยไม่เว้นวรรค หวังว่ามันจะได้ผล


0

หากสิ่งนี้เกิดขึ้นกับการเรียกใช้แอปพลิเคชัน React บน VSCode โปรดตรวจสอบ propTypes ของคุณ Proptypes ที่ไม่ได้กำหนดจะนำไปสู่ปัญหาเดียวกัน


0

สำหรับฉันฉันได้รับข้อผิดพลาดนี้เนื่องจากฉันสูญเสียการเข้าถึงเส้นทางเอาต์พุตสำหรับโฟลเดอร์ dist ที่ตั้งไว้ในไฟล์ angular.json ของฉัน หลังจากที่ฉันเชื่อมต่อกับเส้นทางระยะไกลอีกครั้งด้วยข้อมูลรับรองที่อัปเดตแล้วข้อผิดพลาดก็หายไป


0

#! / usr / bin / env node --max-old-space-size = 4096 ในไอออนิก -app-scripts.js ทำงาน dint

กำลังแก้ไข

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

โดยการเพิ่ม:

@IF มีอยู่ "% ~ 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"% *)

ทำงานเป็นคู่หมั้น


0

สำหรับฉันฉันพบปัญหานี้เมื่อเรียกใช้ eslint และการแก้ไขที่สวยกว่าและจัดรูปแบบด้วยbuildไดเร็กทอรีในโครงการ React ของฉันหลังจากลบออกทุกอย่างก็ใช้ได้ ฉันเดาว่าเป็นเพราะมีไฟล์มากเกินไป


0

ฉันเดาว่ามีหลายวิธีในการเข้าถึงข้อผิดพลาดนี้!

ด้านข้างของฉันฉันมีห่วงในpackage.jsonไฟล์. โครงการ A มีการพึ่งพาโครงการ B ซึ่งมีการพึ่งพาโครงการ A


0

บางครั้งความเรียบง่ายเป็นกุญแจสู่ความสำเร็จ ค้นหาwhile (i <= 10000) {}โดยไม่ต้องเพิ่มiรหัสของคุณ;)


0

ปัญหานี้หมดไปหลังจากที่ฉันอัปเดตไลบรารีทั้งหมดของฉันเช่น nodejs, typescript, yarn, npm และอื่น ๆ สำหรับโครงการของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.