Làm thế nào để giám sát việc sử dụng bộ nhớ của Node.js?


Câu trả lời:


66

node-memwatch : phát hiện và tìm rò rỉ bộ nhớ trong mã Node.JS. Xem hướng dẫn này Theo dõi rò rỉ bộ nhớ trong Node.js


1
node-memwatch dường như không còn tồn tại nữa (cập nhật lần cuối vào tháng 3 năm 2013). Có bất kỳ lựa chọn thay thế nào không?
Golo Roden

6
@GoloRoden npm cài đặt memwatch-next hoạt động tốt. Đây là repo: github.com/marcominetti/node-memwatch
fre2ak

Một hơn lên đến tài nguyên ngày cho săn bắn xuống rò rỉ bộ nhớ apmblog.dynatrace.com/2015/11/04/...
saintedlama

22
memwatch không được duy trì nữa và sẽ không hoạt động trên phiên bản gần đây của nút, vì vậy đừng bận tâm.
Mike


153

Mô- đun quy trình tích hợp có một phương pháp memoryUsagecung cấp thông tin chi tiết về việc sử dụng bộ nhớ của quy trình Node.js hiện tại. Đây là một ví dụ từ Node v0.12.2 trên hệ thống 64 bit:

$ node --expose-gc
> process.memoryUsage();  // Initial usage
{ rss: 19853312, heapTotal: 9751808, heapUsed: 4535648 }
> gc();                   // Force a GC for the baseline.
undefined
> process.memoryUsage();  // Baseline memory usage.
{ rss: 22269952, heapTotal: 11803648, heapUsed: 4530208 }
> var a = new Array(1e7); // Allocate memory for 10m items in an array
undefined
> process.memoryUsage();  // Memory after allocating so many items
{ rss: 102535168, heapTotal: 91823104, heapUsed: 85246576 }
> a = null;               // Allow the array to be garbage-collected
null
> gc();                   // Force GC (requires node --expose-gc)
undefined
> process.memoryUsage();  // Memory usage after GC
{ rss: 23293952, heapTotal: 11803648, heapUsed: 4528072 }
> process.memoryUsage();  // Memory usage after idling
{ rss: 23293952, heapTotal: 11803648, heapUsed: 4753376 }

Trong ví dụ đơn giản này, bạn có thể thấy rằng việc phân bổ một mảng gồm 10 triệu phần tử mà người tiêu dùng có xấp xỉ 80MB (hãy xem qua heapUsed).
Nếu bạn nhìn vào mã nguồn V8 của ( Array::New, Heap::AllocateRawFixedArray, FixedArray::SizeFor), sau đó bạn sẽ thấy rằng bộ nhớ được sử dụng bởi một mảng là một giá trị cố định cộng với chiều dài nhân với kích thước của một con trỏ. Sau đó là 8 byte trên hệ thống 64 bit, điều này xác nhận rằng sự khác biệt bộ nhớ quan sát được là 8 x 10 = 80MB là có ý nghĩa.


1
@MestreSan Phiên bản Node nào không cần --expose-gccho gcchức năng?
Rob W

1
@MestreSan Tôi chưa bao giờ nói rằng bạn cần --expose-gccho process.memoryUsage(). gc()(Yêu cầu --expose-gc) được sử dụng trong câu trả lời để kích hoạt xác định việc thu gom rác để giúp bạn dễ dàng xem các process.memoryUsagebáo cáo hơn.
Rob W

Đó là một câu trả lời tuyệt vời để đo lường JS-Stuff theo đúng cách. Cảm ơn bạn vì câu trả lời đó.
suther

Bạn đã làm việc với các lãnh chúa này. Tôi vừa nhận ra tất cả các phương pháp được hiển thị bởi quá trình gọi sẽ giúp tôi tạo ra một ứng dụng hiệu quả hơn. Cảm ơn.
Andrew

40

Ngoài ra, nếu bạn muốn biết bộ nhớ chung hơn là quy trình nút ':

var os = require('os');

os.freemem();
os.totalmem();

Xem tài liệu


1
Tuy nhiên, freemem () không giống như bộ nhớ khả dụng trên máy chủ. Có cách nào để tìm bộ nhớ khả dụng hơn là bộ nhớ trống không?
Alex


5

Trên Linux / Unix (lưu ý: Mac OS là Unix) sử dụng topvà nhấn M ( Shift+ M) để sắp xếp các quy trình theo mức sử dụng bộ nhớ.

Trên Windows sử dụng Trình quản lý Tác vụ.


@majidarif Truy cập Applications > Utilitiesvà bạn sẽ tìm thấy một Activity Monitorứng dụng. Cái đó tương đương với Task Manager. OS X cũng có toplệnh.
Ingwie Phoenix

3
sử dụng htopthay vì hàng đầu trên Linux. Đó là điều tốt hơn nhiều.
Ryan Shillington
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.