我想自定义节点应用程序内存大小,我还想添加一些中间件来记录实时应用程序内存使用情况和容量。
我知道通过将--max-old-space-size设置为最大~1gb(32位)和~1.7gb(64位)来提高内存限制
示例:
node --max-old-space-size=1024 app.js
但是当我使用v8时,如何验证内存容量和使用情况?
更新
我使用了另一种方法来为v8提高app的内存。
const v8 = require('v8');
v8.setFlagsFromString('--max_old_space_size=2048');
这是HeapSpaceStatistics的日志
########## v8.getHeapSpaceStatistics()################[
{
"space_name": "new_space",
"space_size": 1048576,
"space_used_size": 781704,
"space_available_size": 249464,
"physical_space_size": 798416
},
{
"space_name": "old_space",
"space_size": 18874368,
"space_used_size": 16844024,
"space_available_size": 270840,
"physical_space_size": 18772464
},
{
"space_name": "code_space",
"space_size": 4718592,
"space_used_size": 4344800,
"space_available_size": 95424,
"physical_space_size": 4586176
},
{
"space_name": "map_space",
"space_size": 1572864,
"space_used_size": 962104,
"space_available_size": 584648,
"physical_space_size": 1187888
},
{
"space_name": "large_object_space",
"space_size": 1626112,
"space_used_size": 1603664,
"space_available_size": 1471614464,
"physical_space_size": 1626112
}
]
我已经设置了2GB的内存限制,基于日志,如何验证?
答案 0 :(得分:0)
--trace_gc
V8 option和process.memoryUsage()
可以为您提供良好的总体数字
node --trace_gc --max_old_space_size=4096 -e '
let a = []
for( let i=1; i>0; i++){
a.push({ a: "testing" })
if ( i % 1000000 === 0 ) console.log("%j", process.memoryUsage())
if ( i % 10000000 === 0 ) console.log(v8.getHeapSpaceStatistics())
}
'
请注意,vm不会以设置的大小启动,但可以增长到它。我不相信V8有像JVM那样设置最小旧空间大小的概念。
另请注意,其他空格(如新内存和可能的外部内存)将在旧空间大小的顶部使用,因此您为max_old_space_size
设置的内容不是实际的进程内存限制。
答案 1 :(得分:0)
这里有好的描述谢谢!我遇到了'socket hang up'的NodeJS问题,经过很长一段时间评估根本原因后,我得出结论,它与Memory Leak有关。所以我使用了--trace_gc选项来分析我的应用程序的运行时内存使用情况,并根据我对--trace_gc分析的推断,我调整了--max_old_space_size,修复了我的应用程序的nodejs'socket hang up'问题。