Các giá trị trả về của node.js process.memoryUsage () là gì?


132

Từ tài liệu chính thức ( nguồn ):

process.memoryUsage ()

Trả về một đối tượng mô tả việc sử dụng bộ nhớ của quá trình Node được đo bằng byte.

var util = require('util');

console.log(util.inspect(process.memoryUsage()));

Điều này sẽ tạo ra:

{ rss: 4935680, heapTotal: 1826816, heapUsed: 650472 }

heapTotal và heapUsed đề cập đến việc sử dụng bộ nhớ của V8.

Chính xác thì rss , heapTotalheapUsed dùng để làm gì?

Nó có vẻ như là một câu hỏi tầm thường, nhưng tôi đã tìm kiếm và tôi không thể tìm thấy câu trả lời rõ ràng cho đến nay.

Câu trả lời:


156

Để trả lời câu hỏi này, trước tiên người ta phải hiểu Sơ đồ bộ nhớ của V8.

Một chương trình đang chạy luôn được thể hiện thông qua một số không gian được phân bổ trong bộ nhớ. Không gian này được gọi là Resident Set . V8 sử dụng sơ đồ tương tự như Máy ảo Java và chia bộ nhớ thành các phân đoạn:

  • : mã thực tế đang được thực thi
  • Ngăn xếp : chứa tất cả các loại giá trị (nguyên thủy như số nguyên hoặc Boolean) với các đối tượng tham chiếu con trỏ trên heap và các con trỏ xác định luồng điều khiển của chương trình
  • Heap : một phân đoạn bộ nhớ dành riêng để lưu trữ các loại tham chiếu như các đối tượng, chuỗi và các bao đóng. nhập mô tả hình ảnh ở đây

Bây giờ thật dễ dàng để trả lời câu hỏi:

  • rss : Kích thước cài đặt thường trú
  • heapTotal : Tổng kích thước của Heap
  • heapUsed : Heap thực sự được sử dụng

Tham khảo : http://apmblog.dynatrace.com/2015/11/04/under Hiểu-garbage-collection-and-hunting-memory-leaks-in-node- js /


41
Một bức tranh có thể có giá trị 1000 từ.
bmacnaughton

8
@bmacnaughton Cái này đáng giá 1013 từ :)
alex

2
[rss, heapTotal, heapUsed] => kích thước tính bằng megabyte? kilobyte? bạn có thể thêm nó vào câu trả lời của bạn? Có phải tất cả họ cùng một đơn vị?
Alexander Mills

HeapTotal được quản lý bởi nút như thế nào? Trong ứng dụng của tôi, tôi thấy heapTotal tăng lên đều đặn (không phân biệt GC) mặc dù heapUsed vẫn bị giới hạn. Tôi chưa thấy bất kỳ lời giải thích nào về cách heapTotal được quản lý bởi nút ... Tôi đoán đó chỉ là heap dành riêng cho các phân bổ trong tương lai, nhưng có bất kỳ phần nào được phát hành (nếu không được sử dụng)? Điều gì sẽ khiến nó ở lại cao?
logidelic

1
có một thuộc tính mới "bên ngoài" trên process.memoryUsage (), bất cứ ai cũng biết về điều đó

39

RSSkích thước cài đặt thường trú , phần bộ nhớ của tiến trình được giữ trong RAM (trái ngược với không gian hoán đổi hoặc phần được giữ trong hệ thống tệp).

Các đống là một phần của bộ nhớ từ đó đối tượng mới được phân bổ sẽ đến từ (nghĩ malloctrong C, hoặc newtrong JavaScript).

Bạn có thể đọc thêm về heap tại Wikipedia .


4
Tôi không nghĩ đó là tổng số bộ nhớ. Trên máy của tôi, tổng bộ nhớ là 8GB, nhưng khi tôi chạy một quy trình nút đơn giản, RSS hiển thị khoảng 13 MB, vì vậy tôi nghĩ rằng nó thực sự cho thấy dung lượng bộ nhớ được giữ trong RAM theo quy trình này.
Stefan

1
@Stefan đúng, tôi đã gặp một số loại lỗi sau đó, nhưng RSS có vẻ đáng tin cậy đối với tôi bây giờ.
Mahn

4
Sự khác biệt giữa heapTotalvà là heapUsedgì?
tiblu

3
@tiblu heapTotallà tổng không gian heap được phân bổ bởi động cơ V8 bên dưới, để phân bổ động. heapUsedlà bộ nhớ được sử dụng trong tổng không gian đó. Cả hai đều được quản lý bởi V8 và có thể tăng / thu hẹp bất cứ khi nào cần thiết.
elyas-bhy

4
Một hình ảnh hiển thị các không gian bộ nhớ khác nhau: apmblog.dynatrace.com/wp-content/uploads/2015/11/DK_2.png
elyas-bhy

7

Phép nhân đôi Node.js mô tả nó như sau:

heapTotal và heapUsed đề cập đến việc sử dụng bộ nhớ của V8. bên ngoài đề cập đến việc sử dụng bộ nhớ của các đối tượng C ++ được liên kết với các đối tượng JavaScript được quản lý bởi V8. rss, Resident Set Size , là dung lượng chiếm dụng trong thiết bị bộ nhớ chính (là tập hợp con của tổng bộ nhớ được phân bổ) cho quy trình, bao gồm heap, phân đoạn mã và ngăn xếp.

Tất cả các giá trị được đề cập được thể hiện bằng byte. Vì vậy, nếu bạn chỉ muốn in chúng, có lẽ bạn muốn bán lại chúng cho MB:

const used = process.memoryUsage();
for (let key in used) {
  console.log(`Memory: ${key} ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`);
}

Điều đó sẽ cung cấp cho bạn một đầu ra như:

Memory: rss 522.06 MB
Memory: heapTotal 447.3 MB
Memory: heapUsed 291.71 MB
Memory: external 0.13 MB

0

Hãy làm điều này với một ví dụ

Ví dụ sau đây sẽ cho bạn thấy mức tăng sử dụng bộ nhớ sẽ thực sự tăng rssheapTotal

const numeral = require('numeral');
let m = new Map();
for (let i = 0; i < 100000; i++) {
    m.set(i, i);
    if (i % 10000 === 0) { 
        const { rss, heapTotal } = process.memoryUsage();
        console.log( 'rss', numeral(rss).format('0.0 ib'), heapTotal, numeral(heapTotal).format('0.0 ib') )
    } 
}

Chạy ở trên sẽ cung cấp cho bạn một cái gì đó như thế này:

rss 22.3 MiB 4734976 4.5 MiB
rss 24.2 MiB 6483968 6.2 MiB
rss 27.6 MiB 9580544 9.1 MiB
rss 27.6 MiB 9580544 9.1 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 32.8 MiB 15093760 14.4 MiB
rss 32.9 MiB 15093760 14.4 MiB
rss 32.9 MiB 15093760 14.4 MiB

Điều này cho bạn thấy rõ cách sử dụng biến và tăng liên tục không gian theo yêu cầu của nó làm tăng heapTotal và tương ứng Kích thước cài đặt thường trú ( rss)

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.