NodeJS输出内存使用信息到日志
如需转载请标明出处:http://blog.csdn.net/itas109
前言
内存信息是应用程序非常重要的信息,尤其是在排查内存相关问题的时候。
本文将介绍NodeJS如何输出内存使用信息到日志。
1. 原理简介
1.1 参数说明
process.memoryUsage()
{
rss: 24416256,
heapTotal: 5222400,
heapUsed: 2987984,
external: 1584357,
arrayBuffers: 74935
}
参数 | 英文 | 中文 | 说明 |
---|
rss | resident set size | 驻留集大小 | 进程在主内存设备(即总分配内存的子集)中占用的空间量,包括所有 C++ 和 JavaScript 对象和代码 |
heapTotal | heap total | 堆内存总大小 | v8堆内存总大小 |
heapUsed | heap used | 堆内存已使用大小 | v8堆内存总大小 |
external | external | 额外大小 | 绑定到 V8 管理的 JavaScript 对象的 C++ 对象的内存使用量 |
arrayBuffers | array buffers | 数组缓冲大小 | 为 ArrayBuffer 和 SharedArrayBuffer 分配的内存,包括所有 Node.js Buffer |
![node memory scheme](https://img-blog.csdnimg.cn/bdbec1607d50445eb82cd08c2c07a462.png#pic_center)
1.2 实现原理
在nodejs源码中,
rss通过libuv的uv_resident_set_memory函数实现
其他的通过v8的GetHeapStatistics函数实现
static void MemoryUsage(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
Isolate* isolate = env->isolate();
// V8 memory usage
HeapStatistics v8_heap_stats;
isolate->GetHeapStatistics(&v8_heap_stats);
NodeArrayBufferAllocator* array_buffer_allocator =
env->isolate_data()->node_allocator();
// Get the double array pointer from the Float64Array argument.
Local<ArrayBuffer> ab = get_fields_array_buffer(args, 0, 5);
double* fields = static_cast<double*>(ab->Data());
size_t rss;
int err = uv_resident_set_memory(&rss);
if (err)
return env->ThrowUVException(err, "uv_resident_set_memory");
fields[0] = static_cast<double>(rss);
fields[1] = static_cast<double>(v8_heap_stats.total_heap_size());
fields[2] = static_cast<double>(v8_heap_stats.used_heap_size());
fields[3] = static_cast<double>(v8_heap_stats.external_memory());
fields[4] =
array_buffer_allocator == nullptr
? 0
: static_cast<double>(array_buffer_allocator->total_mem_usage());
}
2. 代码
dump.js
const process = require('process');
const fs = require('fs');
const FILE_NAME = `memory_${process.pid}.csv`;
const INTERVAL_MS = 1000; // 1s
function FormatBytes(bytes) {
return (bytes / 1048576).toFixed(2);
}
function showMemory() {
const memoryObj = process.memoryUsage();
// time, rss(MB), heapTotal(MB), heapUsed(MB), external(MB), arrayBuffers(MB)
let result = `${new Date().toLocaleString('chinese', { hour12: false })}, ${FormatBytes(memoryObj.rss)}, ${FormatBytes(memoryObj.heapTotal)}, ${FormatBytes(memoryObj.heapUsed)}, ${FormatBytes(memoryObj.external)}, ${FormatBytes(memoryObj.arrayBuffers)}\n`;
// console.log(result);
fs.writeFileSync(FILE_NAME, result, { flag: 'a+' });
}
showMemory();
setInterval(() => { showMemory(); }, INTERVAL_MS);
test.js
require('./dump');
3. 测试
node test.js
2023-3-10 22:30:26, 23.14, 5.68, 2.69, 0.96, 0.02
2023-3-10 22:30:27, 24.53, 5.68, 2.72, 0.96, 0.02
2023-3-10 22:30:28, 24.55, 5.68, 2.72, 0.96, 0.02
2023-3-10 22:30:29, 24.64, 5.68, 2.73, 0.96, 0.02
2023-3-10 22:30:30, 24.70, 5.68, 2.74, 0.96, 0.02
2023-3-10 22:30:31, 24.71, 5.68, 2.74, 0.96, 0.02
...
License
License under CC BY-NC-ND 4.0: 署名-非商业使用-禁止演绎
如需转载请标明出处:http://blog.csdn.net/itas109
Reference:
- https://nodejs.org/api/process.html#process_process_memoryusage
- https://www.dynatrace.com/news/blog/understanding-garbage-collection-and-hunting-memory-leaks-in-node-js/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)