LỖI FATAL: Mark-compacts gần giới hạn heap không hiệu quả Phân bổ không thành công - JavaScript heap hết bộ nhớ trong ionic 3


Câu trả lời:


136

Để có câu trả lời tổng quát không góc cạnh cho những ai đặt câu hỏi này từ Google:

Mỗi khi bạn gặp phải lỗi này có thể là do bộ nhớ bị rò rỉ hoặc do sự khác biệt giữa cách Node <= 10 và Node> 10 quản lý bộ nhớ. Thông thường, chỉ cần tăng bộ nhớ được cấp phát cho Node sẽ cho phép chương trình của bạn chạy nhưng có thể không thực sự giải quyết được vấn đề thực sự và bộ nhớ được sử dụng bởi tiến trình nút vẫn có thể vượt quá bộ nhớ mới mà bạn cấp phát. Tôi khuyên bạn nên lập hồ sơ sử dụng bộ nhớ trong quy trình nút của bạn khi nó bắt đầu chạy hoặc cập nhật lên nút> 10.

Tôi đã bị rò rỉ bộ nhớ. Đây là một bài viết tuyệt vời về cách gỡ lỗi rò rỉ bộ nhớ trong nút.

Điều đó nói rằng, để tăng bộ nhớ, trong thiết bị đầu cuối nơi bạn chạy quy trình Node của mình:

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

trong đó giá trị của max-old-space-sizecó thể là: [2048, 4096, 8192, 16384]vv

[UPDATE] Các ví dụ khác để rõ hơn:

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
Cảm ơn, cần lưu ý 8192 có nghĩa là 8 Gb.
jaggedsoft

11
FYI, mặc định là 512 MB. Bạn không cần phải tăng gấp 10 lần số tiền đó, trước tiên bạn có thể thử một cái gì đó từ 512 đến 5120.
Cameron Hudson

Cảm ơn điều này phù hợp với tất cả các loại ứng dụng có vấn đề về bộ nhớ.
invinciblemuffi

4
Chỉ muốn chỉ ra - đó không phải lúc nào cũng là dấu hiệu của việc rò rỉ bộ nhớ. Có lẽ thư viện bạn đang sử dụng đang sử dụng nhiều bộ nhớ hơn một chút so với trước đây. Đối với chúng next.jstôi, ứng dụng của chúng tôi đã bắt đầu bị lỗi với tính năng làm mới nhanh.
Daniel Cooke

62

Trong trường hợp của tôi, hãy khắc phục sự cố này khi cài đặt NodeJs, phiên bản 12.10.0


1
Ở đây cũng vậy. Tôi vừa thay đổi phiên bản và hoạt động của nó.
brunocascio

9
Đối với ngữ cảnh, Node 12 có một chiến lược quản lý heap khác dựa trên bộ nhớ khả dụng thay vì sử dụng giá trị mặc định. Thông tin chi tiết tại đây: foundation.nodejs.org/anosystemments/2019/04/24/…
Derek Dowling

Không có gì khác làm việc cho tôi, đây là nó. Cảm ơn bạn rất nhiều :)
Hussain Alaidarous

Chúng tôi đã cập nhật lên Node 12 và lỗi đã biến mất, dễ dàng hơn so với việc quản lý heap trên Node 10
Raffaeu

1
@DerekDowling Wayback khiến liên kết bị hỏng: web.archive.org/web/20191103115941/https://…
Grim

61

vấn đề tương tự trên máy chủ centos 7, nhưng điều này đã giải quyết được vấn đề của tôi:

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

Ở đâu X = (2048 or 4096 or 8192 o..)là giá trị của bộ nhớ


2
sau khi thay đổi giá trị của x .. lỗi vẫn giữ nguyên
Sohail Ahmad

Nếu lỗi vẫn tiếp diễn, hãy tiếp tục tăng kích thước cho đến khi có đủ bộ nhớ để xử lý, điều này cuối cùng sẽ ngăn được lỗi. Lần duy nhất tôi thấy mình không thể vượt qua lỗi này là với ng servevà một tệp .js lớn được tham chiếu trong scriptsphần của tệp angular.jsonđó cần được tải vào bộ nhớ.
atconway

Tôi có thể đặt giá trị của X lớn hơn 8192 không? Tôi có 32GB RAM
Diego

đối với tôi, việc cung cấp max-old-space-size trên dòng lệnh KHÔNG hoạt động. Đây CÓ THỂ là một tương tác với nút dựa trên nvm? thay vào đó bên trong một tập lệnh bash, tôi đã sử dụng 'NODE_OPTIONS = "- max-old-space-size = 2048" node $ NG build --prod --progress = false' đã hoạt động, trái ngược với 'node --max-old -space-size = 2048 $ NG build --prod --progress = false 'mà không. Tôi vẫn không biết tại sao.
Simon H

25

Hãy thử giải pháp này đã được chỉ ra trong một thông báo cũ trên diễn đàn: https://forum.ionicframework.com/t/3-7-0-ios-build-with-prod-not-working/107061/24

Mở node_modules/@ionic/app-scripts/bin/ionic-app-scripts.js

Thay đổi dòng đầu tiên từ:

#!/usr/bin/env node

đến

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

Hãy thử các giá trị 1024 và 2048, nhưng đối với một ứng dụng tương đối lớn, bạn có thể cần 4096.


20

Tôi gặp lỗi tương tự khi thực hiện ng buildlệnh trong mã Visual Studio. Nhưng tôi có thể xây dựng thành công khi thực hiện cùng một điều trong dòng lệnh Windows theo trình tự sau.

Bước 1.

set NODE_OPTIONS=--max_old_space_size=4096

Bước 2.

ng build

10

Tôi nhận được thông báo lỗi tương tự khi thực thi các câu lệnh sau trong mã Visual Studio. Nhưng tôi có thể xây dựng thành công khi thực thi điều tương tự trong dòng lệnh 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

20
Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp thêm ngữ cảnh liên quan đến lý do và / hoặc cách mã này trả lời câu hỏi sẽ cải thiện giá trị lâu dài của nó.
Eric Leschinski

7

Vì một số lý do mà tất cả câu trả lời ở trên không thực sự phù hợp với tôi, tôi đã làm như sau để khắc phục sự cố của mình:

  1. Đầu tiên tôi phải xóa node_modulesthư mục
  2. cài đặt lại node.js trên PC của tôi và
  3. sau đó npm install

bước 2 là không bắt buộc. Tôi đã thử giải pháp trên và nó cũng hiệu quả với tôi mà không cần đến bước 2
Nhà phân tích

5

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

thêm thông số đã --build-optimizer giải quyết vấn đề trong trường hợp của tôi.

Cập nhật:

Tôi không chắc tại sao chỉ thêm --build-Optimizer mới giải quyết được vấn đề nhưng theo tài liệu góc, nó nên được sử dụng với aot được bật, vì vậy lệnh cập nhật sẽ giống như bên dưới

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

Tài liệu xây dựng góc


4

Chạy lệnh này trong thư mục dự án của bạn. Sử dụng giao bóng thay vì xây dựng

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

4

Thay thế dòng

"start": "ng serve -o --port 4300 --configuration=en" với

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

GHI CHÚ:

  1. cổng - 4300 không phải là hằng số phụ thuộc vào cổng bạn chọn.

  2. --max_old_space_size = 5096 quá không phải là hằng số; bất kỳ giá trị nào 1024,2048,4096, v.v.


4

Trong trường hợp của tôi, đó là một phép đệ quy gây ra phản ứng sử dụng hết bộ nhớ.

Điều này xảy ra khi tôi đang cấu trúc lại mã của mình và không nhận thấy điều này.

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

Trong các ứng dụng nút khác, điều này có thể giống như sau:

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

Tại sao đây là một vấn đề? <> </> nên hợp lệ trong React thay vì sử dụng <React.Fragment> phải không?
Joelgullander

@Codehiker Đúng là một cú pháp mới trong React 16
GoalsAndGambles

1
Đệ quy SumComponentcó chứa a SumComponent(trong SumComponentđó có chứa a SumComponent...)
stone

3

Đối với tôi, đó là một vấn đề với gói firebase.

Chỉ thêm "@ firebase / database": "0.2.1", cho package.json của bạn, cài đặt lại node_modules và hoạt động.


2

Tôi đã xóa mô-đun nút hiện có và chạy các lệnh bên dưới để khắc phục sự cố của mình

npm install -all
npm audit fix

2

Một câu trả lời không góc cạnh khác (tôi cũng gặp phải vấn đề tương tự khi xây dựng ứng dụng phản ứng trên AWS Amplify).

Như đã đề cập bởi Emmanuel, có vẻ như nó đến từ sự khác biệt trong cách bộ nhớ được xử lý bởi nút v10 so với nút v12.

Tôi đã cố gắng tăng trí nhớ mà không có kết quả. Nhưng sử dụng nút v12 đã làm được điều đó.

Kiểm tra cách bạn có thể thêm nvm use $VERSION_NODE_12vào cài đặt bản dựng của mình như được giải thích bởi @atlesp tại đây https://github.com/aws-amplify/amplify-console/issues/440#issuecomment-602626451 hình ảnh


1

Đối với tôi, vấn đề là có một node_modulesthư mục bổ sung mà tôi đã đổi tên thành node_modules_oldvà chạy một thư mục npm installđể tạo mới node_modules. Bằng cách nào đó, bản dựng vẫn đang chọn node_modules_oldthư mục, vì vậy tôi đã di chuyển node_modules_oldra khỏi thư mục để khắc phục sự cố.


1

Vui lòng kiểm tra phiên bản nút của bạn:

   $  node -v

Nếu 10.1.1 của nó là gì đó, thì bạn cần cập nhật phiên bản nút cấp gốc của mình thông qua các lệnh bên dưới

$ 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

Sau khi hoàn tất, vui lòng khởi động lại thiết bị đầu cuối hoặc studio trực quan của bạn.

Nó làm việc 100 đô la

Đối với người dùng ion, vui lòng thêm mã bên dưới vào package.json của bạn cho người dùng ion

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


thực sự điều này hoạt động nếu bạn xây dựng web thông qua app-scripts, nhưng nếu bạn xây dựng android hoặc script như ionic cordova build androidthế nào?
Muhammed Moussa

0

Kiểm tra tên thư mục của bạn. Nếu tên thư mục của bạn có khoảng trắng, những loại vấn đề này sẽ phát sinh. Đổi tên không có khoảng trắng. hy vọng nó sẽ hoạt động.


0

Nếu điều này xảy ra khi chạy ứng dụng React trên VSCode, vui lòng kiểm tra propTypes của bạn, Proptypes không xác định dẫn đến cùng một vấn đề.


0

Đối với tôi, tôi gặp lỗi này vì tôi mất quyền truy cập vào đường dẫn đầu ra cho thư mục dist được đặt trong tệp angle.json của mình. Sau khi tôi kết nối lại với đường dẫn từ xa với thông tin đăng nhập được cập nhật, lỗi đã biến mất.


0

Nút #! / usr / bin / env --max-old-space-size = 4096 trong ionic-app-scripts.js không hoạt động

Sửa đổi

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

Bằng cách thêm:

@IF TỒN TẠI "% ~ 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"% *)

Đã làm việc đầu tiên


0

Đối với tôi, tôi đã gặp sự cố này khi chạy bản sửa lỗi và định dạng eslint and beautiful hơn với một buildthư mục trong dự án React của tôi, sau khi loại bỏ nó, mọi thứ đều hoạt động. Tôi đoán điều này là do có quá nhiều tệp.


0

Tôi đoán có rất nhiều cách để đạt được lỗi này!

Về phía tôi, tôi đã có một vòng lặp trong của tôi package.json. Dự án A có sự phụ thuộc vào dự án B, có sự phụ thuộc vào dự án A.


0

Đôi khi sự đơn giản là chìa khóa thành công. Tìm kiếm while (i <= 10000) {}mà không tăng imã của bạn;)


0

Vấn đề này đã không còn nữa, sau khi tôi đã cập nhật tất cả các thư viện như nodejs, stylescript, fiber, npm, v.v. cho dự án của mình.


0

Chỉ cần nhập điều này vào thiết bị đầu cuối:

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

0

Cập nhật từ Node 12 lên Node 14 đã giải quyết được vấn đề cho tôi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.