如何限制节点应用程序内存大小,以及如何验证当前内存使用情况和容量?

时间:2017-10-24 18:29:01

标签: node.js logging

我想自定义节点应用程序内存大小,我还想添加一些中间件来记录实时应用程序内存使用情况和容量。

我知道通过将--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的内存限制,基于日志,如何验证?

2 个答案:

答案 0 :(得分:0)

--trace_gc V8 optionprocess.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'问题。