FATAL ERROR: CALL_AND_RETRY_LAST Phân bổ không thành công - xử lý hết bộ nhớ


186

Phiên bản nút là v0.11.13

Sử dụng bộ nhớ trong khi gặp sự cố theo sudo topkhông tăng3%

Mã tái tạo lỗi này:

var request = require('request')
var nodedump = require('nodedump')

request.get("http://pubapi.cryptsy.com/api.php?method=marketdatav2",function(err,res)
{
    var data
    console.log( "Data received." );
    data = JSON.parse(res.body)
    console.log( "Data parsed."   );
    data = nodedump.dump(data)
    console.log( "Data dumped."   ); 
    console.log( data )
})

Để kiểm tra xem sự cố kích thước ngăn xếp đệ quy đó có phải tôi đã chạy mã tiếp theo với tham số --stack-size = 60000

var depth = 0;

(function recurse() {
    // log at every 500 calls
    (++depth % 500) || console.log(depth);
    recurse();
})();

và đã có

264500 
Segmentation fault

Sau đó, tôi đã chạy mã mang lại cho tôi L ERI MẠNH: CALL_AND_RETRY_LAST Phân bổ không thành công - xử lý hết bộ nhớ với cùng tham số --stack-size = 60000 và không có Segmentation fault.

Vì vậy, tôi kết luận CALL_AND_RETRY_LASTkhông có gì phổ biến với kích thước ngăn xếp đệ quy.

Làm thế nào tôi có thể giải quyết vấn đề này? Tôi tin rằng có đủ bộ nhớ trống trên máy tính của tôi để hoàn thành nhiệm vụ này thành công.

Có những câu hỏi tương tự trên stackoverflow nhưng không có câu hỏi nào trong số này là về CALL_AND_RETRY_LASTlý do tại sao tôi tạo câu hỏi riêng biệt.


3
Mã của bạn hoạt động tốt với tôi với Node.js 0.10.28. Nó mất 1200 MB bộ nhớ ảo và in một lượng rác không thể tin được lên màn hình, nhưng nó dường như "hoạt động".
John Zwinck

1
Các rác là chính xác những gì tôi muốn nhận được. Điều tệ là nút 0.10. * Không hỗ trợ các trình tạo hài hòa do đó tôi không thể sử dụng nó cho mục đích này.
dùng619271

Câu trả lời:


112

Nếu bạn có một cái nhìn về nguồn: github / v8 , có vẻ như bạn cố gắng dự trữ một đối tượng rất lớn. Theo kinh nghiệm của tôi, điều đó xảy ra nếu bạn cố phân tích một đối tượng JSON lớn, nhưng khi tôi cố gắng phân tích kết quả đầu ra của bạn với JSON và node0.11.13, nó chỉ hoạt động tốt.

Bạn không cần nhiều hơn --stack-size, bạn cần thêm bộ nhớ: --max_new_space_sizevà / hoặc --max_old_space_size.

Gợi ý duy nhất tôi có thể cung cấp cho bạn bên cạnh đó là thử một trình phân tích cú pháp JSON khác và / hoặc cố gắng thay đổi định dạng đầu vào thành dòng JSON thay vì chỉ JSON.


10
Cảm ơn rât nhiều! Xác định --max_old_space_size = 2000000 mà tôi tin có nghĩa là ~ 2GB đã giải quyết vấn đề của tôi. Thay đổi --max_new_space_size dường như không có bất kỳ ảnh hưởng nào.
dùng619271

Tôi cũng đã xem qua nguồn v8 nhưng không hiểu điều gì đang xảy ra ở đó. Vì vậy, cơ hội của tôi để giải quyết điều này mà không có sự giúp đỡ của bạn có lẽ có xu hướng bằng không. Vì vậy, cảm ơn bạn một lần nữa.
dùng619271

1
@ theWanderer4865 có nghĩa là gì với "hãy thử thay đổi định dạng đầu vào thành dòng JSON thay vì chỉ JSON."? Bạn có thể vui lòng giải thích? Cảm ơn bạn.
Titusmagnus

16
@ user619271 --max_old_space_size = 2048 là 2gb
Vô tận

1
Haha .. @Timeless
technophyle

51
$ sudo npm i -g increase-memory-limit

Chạy từ vị trí gốc của dự án của bạn:

$ increase-memory-limit

Công cụ này sẽ nối thêm --max-old-space-size = 4096 trong tất cả các lệnh gọi bên trong các tệp node_modules / .bin / * của bạn.


Phiên bản Node.js> = 8 - THÔNG BÁO KHAI THÁC

Kể từ NodeJs V8.0.0, có thể sử dụng tùy chọn --max-old-space-size. NODE_OPTIONS = tùy chọn ...

$ export NODE_OPTIONS=--max_old_space_size=4096

xin chào, @ sol-ibit. Đối số 4096 có nghĩa là gì?
estebanpdl

1
Xin chào @estebanpdl, Giải pháp để chạy ứng dụng Node.js của bạn với bộ nhớ tăng là bắt đầu quá trình với một cờ V8 bổ sung: --max-old-space-size. Bạn cần phải thêm kích thước bộ nhớ mong muốn của bạn tính bằng megabyte. Lệnh sau sẽ khởi động ứng dụng của bạn với giới hạn bộ nhớ là 4 GB.
sol404

1
Đặt biến với export NODE_OPTIONS=--max_old_space_size=4096đã thực hiện các mẹo cho tôi! Cảm ơn!
Bói toán

46

Để giải quyết vấn đề này, bạn cần chạy ứng dụng của mình bằng cách tăng giới hạn bộ nhớ bằng cách sử dụng tùy chọn --max_old_space_size. Theo mặc định, giới hạn bộ nhớ của Node.js là 512 mb.

node --max_old_space_size=2000  server.js 

5
Có hướng dẫn từng bước về cách làm điều này xin vui lòng? Tôi dán mã trung thành này ở đâu: node --max_old_space_size=2000 server.js
Ông Benedict

@ Mr.Benedict bạn làm điều này khi bạn bắt đầu ứng dụng của bạn.
Easymoden00b

2
nút --max_old_space_size = 2048 server.js ... phù hợp hơn ... hoạt động cảm ơn
danday74

1
Tôi có một ứng dụng React trên google cloud. Tôi có thể làm cái này như thế nào? Ai có thể hướng dẫn, xin vui lòng?
Shubham Kushwah

1
@ Easymoden00b Không phải node server.jsvậy npm start. Tôi có thể làm cái này như thế nào?
Shubham Kushwah

30

Tôi thấy rằng đó max_new_space_sizekhông phải là một tùy chọn trong nút 4.1.1 và max_old_space_sizemột mình không giải quyết được vấn đề của tôi. Tôi đang thêm các mục sau vào shebang của mình và sự kết hợp của những thứ này dường như hoạt động:

#!/usr/bin/env node --max_old_space_size=4096 --optimize_for_size --max_executable_size=4096 --stack_size=4096

[EDIT]: 4096 === 4GB bộ nhớ, nếu thiết bị của bạn thiếu bộ nhớ, bạn có thể muốn chọn một lượng nhỏ hơn.

[CẬP NHẬT]: Cũng phát hiện ra lỗi này trong khi chạy grunt mà trước đây đã chạy như vậy:

./node_modules/.bin/grunt

Sau khi cập nhật lệnh sau đây, nó dừng có lỗi bộ nhớ:

node --max_old_space_size=2048 ./node_modules/.bin/grunt 

4
Tôi đã thêm --max_old_space_size = 8192, nó vẫn không giải quyết được vấn đề nhưng đã treo máy tính của tôi :(
Dhyey

Tôi đã giảm dung lượng bộ nhớ trong ví dụ từ 8Gb xuống 4Gb, nhờ phản hồi.
jfunk

28

Lưu ý: xem cảnh báo trong các nhận xét về cách điều này có thể ảnh hưởng đến các ứng dụng Electron.

Kể từ v8.0 được xuất xưởng vào tháng 8 năm 2017, biến môi trường NODE_OPTIONS hiển thị cấu hình này (xem NODE_OPTIONS đã hạ cánh trong 8.x! ). Trên mỗi bài viết, chỉ có các tùy chọn được liệt kê trong danh sách nguồn (lưu ý: không phải là liên kết cập nhật!) Được cho phép, bao gồm"--max_old_space_size" . Lưu ý rằng tiêu đề của bài viết này có vẻ hơi sai lệch - có vẻ như NODE_OPTIONS đã tồn tại, nhưng tôi không chắc nó đã phơi bày tùy chọn này.

Vì vậy, tôi đưa vào .bashrc:
export NODE_OPTIONS=--max_old_space_size=4096


Lời cảnh báo: không đặt đây là biến môi trường trên máy Windows của bạn. Nó phá vỡ mọi thứ . Nó đã phá vỡ GitKraken, Slack, trình cài đặt VS2017 (dựa trên crom), các tiện ích mở rộng VS2017 liên quan đến Azure và thậm chí cả mục trình đơn "Tiện ích mở rộng và cập nhật" trong VS2017.
Roman Starkov

Hãy xem github.com/electron/electron/issues/12695 - có vẻ như Electron sẽ không gặp sự cố từ NODE_OPTIONS trong 2.0.3 - nhưng tôi đặt NODE_OPTIONS chỉ sử dụng smartcd trong các thư mục dự án cụ thể để tránh sự cố này github.com/cxreg / smartcd
Ben Creasy

Ah, điều đó có thể giải thích tại sao Discord và VS Code không bị ảnh hưởng.
Roman Starkov

1
Làm thế nào để làm điều đó trên một máy tính windows?
Mahmoud Ezzat

16

Các increase-memory-limitmô-đun đã được phản đối bây giờ. Kể từ Node.js v8.0 được xuất xưởng vào tháng 8 năm 2017, giờ đây chúng ta có thể sử dụng NODE_OPTIONSbiến env để đặt max_old_space_sizetoàn cầu.

export NODE_OPTIONS=--max_old_space_size=4096

URL giới thiệu: https://github.com/endel/increas-memory-limit


Nơi nào bạn đặt điều này? Tôi đang sử dụng bản dựng và bản dựng Azure DevOps đang bị lỗi trong các tác nhân windows
int-i

Để tránh sự khác biệt giữa các nền tảng, hãy cài đặt cross-envmô-đun trên toàn cầu và chạy trên thiết bị đầu cuối với lệnh như vậy -cross-env PORT=8000 node --max-old-space-size=4096 server.js
Ali David

Các bản dựng Azure Devops được chạy trên các tác nhân MS trên đám mây, không có bảng điều khiển để thực thi chúng. Tôi tìm thấy một cách khác để đạt được những điều này bằng cách sử dụng powershell. Đã thêm nó như một câu trả lời ở đây.
int-i

13

Chỉ là một biến thể của các câu trả lời ở trên.

Tôi đã thử lệnh nút thẳng lên ở trên nhưng không thành công, nhưng gợi ý từ vấn đề CLI góc này đã làm việc với tôi - bạn tạo tập lệnh Node trongpackage.json tệp để tăng bộ nhớ có sẵn cho Node khi bạn chạy bản dựng sản xuất.

Vì vậy, nếu bạn muốn tăng bộ nhớ khả dụng cho Node lên 4gb ( max-old-space-size=4096), lệnh Node của bạn sẽ là node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod. (tăng hoặc giảm dung lượng bộ nhớ tùy theo nhu cầu của bạn - 4gb hoạt động với tôi, nhưng bạn có thể cần nhiều hơn hoặc ít hơn). Sau đó, bạn sẽ thêm nó vào phần 'script' của gói.json như thế này:

"prod": "node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod"

Nó sẽ được chứa trong đối tượng script cùng với các script khác có sẵn - ví dụ:

"scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e",
    "prod": "node --max-old-space-size=4096./node_modules/@angular/cli/bin/ng build --prod"
}

Và bạn chạy nó bằng cách gọi npm run prod(bạn có thể cần phải chạysudo npm run prod nếu bạn đang dùng Mac hoặc Linux).

Lưu ý rằng có thể có một vấn đề tiềm ẩn khiến Node cần thêm bộ nhớ - điều này không giải quyết được nếu đó là trường hợp - nhưng ít nhất nó cung cấp cho Node bộ nhớ mà nó cần để thực hiện quá trình xây dựng.


6

Giải pháp làm việc của tôi là:

  • Cài đặt chéo env
    npm install --save-dev cross-env hoặcnpm install -g cross-env .
  • Tệp package.jsonthêm tập lệnh xây dựng mới,
    vd
    ... "build:prod:ios": "cross-env NODE_OPTIONS='--max-old-space-size=8192' ionic cordova build ios --prod --release" ...
  • Sử dụng lệnh đó để xây dựng lần sau.
    npm run build:prod:ios

  • Vấn đề được giải quyết.


1

Tôi đã mất một số ngày với vấn đề này .... cho đến khi tôi thấy rằng trong một số tệp tôi đang nhập một tệp tĩnh, một tệp được xây dựng. Nó làm cho việc xây dựng không bao giờ kết thúc. Cái gì đó như:

import PropTypes from "../static/build/prop-types"; 

Sửa chữa với nguồn thực sự giải quyết tất cả các vấn đề.

Chia sẻ giải pháp của tôi. :)


2
bạn có thể giải thích giải pháp của bạn nhiều hơn một chút? Tôi đang gặp vấn đề tương tự và nó đang làm hỏng ứng dụng của tôi. Mọi thứ hoạt động tốt trong vài phút đầu tiên của ứng dụng đang chạy, nhưng sau đó nó cuối cùng bị hỏng do hết bộ nhớ. Nhưng trong thời gian đó Sequelize hoạt động tốt.
Porlune

1
Điều đáng mừng là IDE của tôi (WebStorm) tự động đưa js BUILDED vào nguồn của tôi ... khi một tệp (trên nguồn của tôi) bị thay đổi, nó sẽ xây dựng tất cả các tệp thành đầu ra js mới. Nhưng, nếu nguồn của tôi có tham chiếu đến các tệp được xây dựng, nó không bao giờ dừng để xây dựng. Kiểm tra những gì tập tin bao gồm một tập tin không chính xác.
Tiago Gouvêa

1

Tôi đã thấy vấn đề này khi tôi đang tạo ra một gói để phản ứng tự nhiên. Những điều tôi đã thử và không hoạt động:

  1. Gia tăng node --max_old_space_size, một cách vô tình điều này đã làm việc tại địa phương đối với tôi nhưng thất bại với jenkins và tôi vẫn không chắc chắn điều gì xảy ra với jenkins
  2. Một số nơi được đề cập để hạ phiên bản của nút xuống còn 6,9.1 và điều đó cũng không hiệu quả với tôi. Tôi chỉ muốn đặt nó ở đây vì nó có thể làm việc cho bạn.

Điều đó đã làm việc cho tôi: Tôi đã nhập một tệp thực sự lớn trong mã. Cách tôi giải quyết bằng cách đưa nó vào ignoredanh sách trong .babelrcmột cái gì đó như thế này:

{
    "presets": ["react-native"],
    "plugins": ["transform-inline-environment-variables"],
    "ignore": ["*.json","filepathToIgnore.ext"]
}

Đó là một .jstập tin không thực sự cần dịch mã và thêm nó vào danh sách bỏ qua đã giúp ích.


1

lỗi này xảy ra khi bộ nhớ được yêu cầu cấp phát để thực thi ít hơn bộ nhớ cần thiết cho quá trình chạy. Theo mặc định, kích thước bộ nhớ Node là 512 mb để tăng mức này, bạn cần gõ lệnh sau:

node --max-old-space-size= <NewSize> <fileName>

1
tên tập tin ở đây là gì?
Rashingul.Rubel

1

Tôi đã phải đối mặt với vấn đề này trong ion và đã thử nhiều giải pháp nhưng đã giải quyết vấn đề này bằng cách chạy nó.

Đối với MAC: nút --max-old-space-size = 4096 / usr / local / bin / ionic cordova build android --prod

Đối với Windows: node --max-old-space-size = 4096 / Users / {your user} / AppData / Roaming / npm / node_modules / ionic / bin / ionic cordova build windows --prod


1
npm install -g increase-memory-limit

tăng giới hạn bộ nhớ

HOẶC LÀ

  1. Điều hướng đến% appdata% -> thư mục npm hoặc C:\Users\{user_name}\AppData\Roaming\npm
  2. Mở ng.cmd trong trình chỉnh sửa yêu thích của bạn
  3. Thêm --max_old_space_size=8192vào IFELSEchặn

bây giờ tập tin ng.cmd trông như thế này sau khi thay đổi:

@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe" "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
)


0

Một giải pháp thay thế là vô hiệu hóa trình biên dịch AOT:

ng build --prod --aot false

1
bạn có thể giải thích tại sao sai?
Codebreker

0

Bất cứ ai cũng gặp lỗi này với các đường ống xây dựng Azure, hãy thử bước dưới đây để thay đổi biến môi trường của tác nhân xây dựng

Thêm một Azure build pipeline task-> Azure powershell script:Inlinescripttrước khi Biên dịch với các cài đặt bên dưới

- task: AzurePowerShell@3
  displayName: 'Azure PowerShell script: InlineScript'
  inputs:
    azureSubscription: 'NYCSCA Azure Dev/Test (ea91a274-55c6-461c-a11d-758ef02c2698)'
    ScriptType: InlineScript
    Inline: '[Environment]::SetEnvironmentVariable("NODE_OPTIONS", "--max_old_space_size=16384", "Machine")'
    FailOnStandardError: true
    azurePowerShellVersion: LatestVersion
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.