当前位置:   article > 正文

Nodejs: MemoryUsage()返回的rss,heapTotal,heapUsed,external的含义和区别_process.memoryusage

process.memoryusage

process.memoryUsage()返回当前进程的内存使用情况,但不包括子进程。子进程的内存使用情况需要在子进程中单独调用process.memoryUsage()。

该函数返回4个参数,含义及差别如下:

  • rss: (Resident Set Size)操作系统分配给进程的总的内存大小。
  • heapTotal:堆的总大小,包括3个部分,
    • 已分配的内存,用于对象的创建和存储,对应于heapUsed
    • 未分配的但可用于分配的内存
    • 未分配的但不能分配的内存,例如在垃圾收集(GC)之前对象之间的内存碎片
  • heapUsed: 已分配的内存,即堆中所有对象的总大小,是heapTotal的子集。
  • external: 进程使用到的系统链接库所占用的内存, 如“/usr/lib64/libstdc++.so.6.0.19”

 用如下代码,打印一个子进程的内存使用情况,可以看出rss大致等于top命令的RES,或者等于ps aux --sort -rss命令中的RSS(单位KB)。另外,主进程的内存只有33M比子进程的内存还小,可见它们的内存占用情况是独立统计的。

  1. var showMem = function(){
  2. var mem = process.memoryUsage();
  3. var format = function(bytes){
  4. return (bytes / 1024 / 1024).toFixed(2) + ' MB';
  5. };
  6. console.log('Process: heapTotal ' + format(mem.heapTotal) + ' heapUsed ' + format(mem.heapUsed) + ' rss ' + format(mem.rss) + ' external:' + format(mem.external));
  7. console.log('-----------------------------------------------------------');
  8. };
  9. setInterval(showMem, 5000);

 控制台输出:

top命令: 

 

源码追踪:

rss,heapTotal,heapUsed,external都是从V8引擎获取的,其中,rss是通过调用libuv库函数int uv_resident_set_memory(size_t* rss)来获取的。堆细分为new_space,old_space,code_space,map_space,lo_space (large objects);heapTotal等于堆里面各个分区的总大小;而heapUsed则等于堆里面各个分区所有已创建对象的总大小。

src/node.cc

  1. void MemoryUsage(const FunctionCallbackInfo<Value>& args) {
  2. Environment* env = Environment::GetCurrent(args);
  3. size_t rss;
  4. int err = uv_resident_set_memory(&rss);
  5. if (err) {
  6. return env->ThrowUVException(err, "uv_resident_set_memory");
  7. }
  8. // V8 memory usage
  9. HeapStatistics v8_heap_stats;
  10. env->isolate()->GetHeapStatistics(&v8_heap_stats);
  11. Local<Number> heap_total =
  12. Number::New(env->isolate(), v8_heap_stats.total_heap_size());
  13. Local<Number> heap_used =
  14. Number::New(env->isolate(), v8_heap_stats.used_heap_size());
  15. Local<Number> external_mem =
  16. Number::New(env->isolate(),
  17. env->isolate()->AdjustAmountOfExternalAllocatedMemory(0));
  18. Local<Object> info = Object::New(env->isolate());
  19. info->Set(env->rss_string(), Number::New(env->isolate(), rss));
  20. info->Set(env->heap_total_string(), heap_total);
  21. info->Set(env->heap_used_string(), heap_used);
  22. info->Set(env->external_string(), external_mem);
  23. args.GetReturnValue().Set(info);
  24. }

deps\v8\src\api.cc

  1. void Isolate::GetHeapStatistics(HeapStatistics* heap_statistics) {
  2. i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
  3. i::Heap* heap = isolate->heap();
  4. heap_statistics->total_heap_size_ = heap->CommittedMemory();
  5. heap_statistics->total_heap_size_executable_ =
  6. heap->CommittedMemoryExecutable();
  7. heap_statistics->total_physical_size_ = heap->CommittedPhysicalMemory();
  8. heap_statistics->total_available_size_ = heap->Available();
  9. heap_statistics->used_heap_size_ = heap->SizeOfObjects();
  10. heap_statistics->heap_size_limit_ = heap->MaxReserved();
  11. }

deps/v8/src/heap/heap.cc 

  1. intptr_t Heap::SizeOfObjects() {
  2. intptr_t total = 0;
  3. AllSpaces spaces(this);
  4. for (Space* space = spaces.next(); space != NULL; space = spaces.next()) {
  5. total += space->SizeOfObjects();
  6. }
  7. return total;
  8. }
  9. intptr_t Heap::CommittedOldGenerationMemory() {
  10. if (!HasBeenSetUp()) return 0;
  11. return old_space_->CommittedMemory() + code_space_->CommittedMemory() +
  12. map_space_->CommittedMemory() + lo_space_->Size();
  13. }
  14. intptr_t Heap::CommittedMemory() {
  15. if (!HasBeenSetUp()) return 0;
  16. return new_space_.CommittedMemory() + CommittedOldGenerationMemory();
  17. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/75940
推荐阅读
相关标签
  

闽ICP备14008679号