Node.js process.memoryUsage () 'ın dönüş değerleri ne anlama geliyor?


132

Resmi belgelerden ( kaynak ):

process.memoryUsage ()

Bayt cinsinden ölçülen Düğüm işleminin bellek kullanımını açıklayan bir nesne döndürür.

var util = require('util');

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

Bu şunları üretecektir:

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

heapTotal ve heapUsed, V8'in bellek kullanımını ifade eder.

Rss , heapTotal ve heapUsed tam olarak ne anlama geliyor ?

Önemsiz bir soru gibi görünebilir ama arıyordum ve şu ana kadar net bir cevap bulamadım.

Yanıtlar:


156

Bu soruyu cevaplamak için önce V8'in Hafıza Şemasını anlamak gerekiyor.

Çalışan bir program her zaman bellekte ayrılmış bir alan aracılığıyla temsil edilir. Bu alana Yerleşik Set denir . V8, Java Sanal Makinesi'ne benzer bir şema kullanır ve belleği segmentlere ayırır:

  • Kod : yürütülen gerçek kod
  • Yığın : Yığın üzerindeki nesnelere referans veren işaretçiler ve programın kontrol akışını tanımlayan işaretçiler ile tüm değer türlerini (tamsayı veya Boolean gibi ilkel öğeler) içerir
  • Yığın : nesneler, dizeler ve kapanışlar gibi referans türlerini depolamaya ayrılmış bir bellek bölümü. görüntü açıklamasını buraya girin

Şimdi soruyu cevaplamak çok kolay:

  • rss : Yerleşik Set Boyutu
  • heapTotal : Toplam Boyutu
  • heapUsed : Gerçekte Kullanılan Heap

Referans : http://apmblog.dynatrace.com/2015/11/04/understanding-garbage-collection-and-hunting-memory-leaks-in-node-js/


41
Bir resim 1000 kelimeye bedel olabilir.
bmacnaughton

8
@bmacnaughton Bu, 1013 kelimeye değer :)
alex

2
[rss, heapTotal, heapUsed] => megabayt cinsinden boyut? kilobayt? bunu cevabına ekler misin? hepsi aynı birimler mi?
Alexander Mills

HeapTotal düğüm tarafından nasıl yönetilir? Uygulamamda, heapUsed sınırlı kalsa bile heapTotal'ın (GC'den bağımsız olarak) istikrarlı bir şekilde yükseldiğini görüyorum. HeapTotal'ın düğüm tarafından nasıl yönetildiğine dair herhangi bir açıklama görmedim ... Sanırım bu sadece gelecekteki tahsisler için ayrılmış bir yığın, ancak herhangi biri (kullanılmıyorsa) piyasaya sürüldü mü? Yüksek kalmasına ne sebep olur?
logidelic

1
process.memoryUsage () üzerinde yeni bir "harici" özelliği var, herkes bunu biliyor

39

RSS , yerleşik küme boyutudur , işlem belleğinin RAM'de tutulan kısmıdır (takas alanı veya dosya sisteminde tutulan bölümün aksine).

Yığın (düşünmek yeni ayrılan nesneler gelecektir hangi bellek kısmıdır mallocC veya newJavaScript).

Wikipedia'da yığın hakkında daha fazla bilgi edinebilirsiniz .


4
Bunun hafızanın tamamı olduğunu sanmıyorum. Makinemde toplam bellek 8 GB, ancak basit bir düğüm işlemi çalıştırdığımda RSS 13MB civarında gösteriyor, bu yüzden gerçekten bu işlemle RAM'de ne kadar bellek tutulduğunu gösterdiğini düşünüyorum.
Stefan

1
@Stefan doğru, o zamanlar bir tür hatayla karşılaştım, ancak RSS şimdi bana güvenilir görünüyor.
Mahn

4
Arasındaki fark nedir heapTotalve heapUsed?
tiblu

3
@tiblu heapTotal, dinamik ayırmalar için temeldeki V8 motoru tarafından ayrılmış toplam yığın alanıdır. heapUsedbu toplam alan içinde kullanılan hafızadır. Her ikisi de V8 tarafından yönetilir ve gerektiğinde büyümeye / küçülmeye tabidir.
elyas-bhy

4
Farklı bellek alanlarını görselleştiren bir görüntü: apmblog.dynatrace.com/wp-content/uploads/2015/11/DK_2.png
elyas-bhy

7

Node.js doumentation aşağıdaki gibi tanımlamaktadır:

heapTotal ve heapUsed , V8'in bellek kullanımını ifade eder. harici , V8 tarafından yönetilen JavaScript nesnelerine bağlı C ++ nesnelerinin bellek kullanımını ifade eder. rss, Yerleşik Küme Boyutu , yığın, kod bölümü ve yığını içeren işlem için ana bellek cihazında (yani toplam ayrılmış belleğin bir alt kümesidir) kaplanan alan miktarıdır.

Belirtilen tüm değerler bayt cinsinden ifade edilir. Dolayısıyla, yalnızca yazdırmak istiyorsanız, muhtemelen MB'ye yeniden ölçeklendirmek istersiniz:

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

Bu size şöyle bir çıktı verecektir:

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

0

Bunu bir Örnek ile yapalım

Bellek kullanımında artış aslında artacak nasıl Aşağıdaki örnek göstereceğim rssveheapTotal

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') )
    } 
}

Yukarıdakiler size şöyle bir şey verecektir:

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

Bu, değişken kullanımının ve bunun gerektirdiği alanı sürekli olarak artırmanın heapTotal'ı ve buna bağlı olarak Resident Set Size ( rss) değerini nasıl artırdığını açıkça gösterir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.