关于nodejs内存的一些问题。
发布于 7 年前 作者 binginto 6839 次浏览 来自 问答

通过 process.memoryUsage();可以获取nodejs堆内存使用情况。 获取的几个变量分别为, rss是Resident Set Size的缩写,为常驻内存的总大小 heapTotal是V8为堆分配的总大小 heapUsed是已使用的堆大小。 external是程序使用V8外部的内存。

关于内存问题是否只要heapUsed稳定则,表示没内存泄漏问题?

12 回复

一定程度上可以这么认为,反正泄漏能让开发者感知到的时候,表象一定是 heapUsed 和 heapTotal 都暴涨,且基本是只增不减

我现在有个问题 heapTotal heapUsed external 都很稳定(30M左右),但是rss能涨到比较高(大约300M),而且下不来,不知道为什么

我的版本是7.9.0,用了一些比较大的Buffer(1~2M)

@QLLNNH rss表示 v8 堆外分配的内存,可能是 buffer 或者别的 c++ 插件直接 malloc 分配的内存

来自酷炫的 CNodeMD

我对sever进行断开连接测试。每隔30s进行一个gc(),定时打印其堆内存使用情况。目前数据如下。 最初内存使用情况:

[2017-05-25 20:02:05.077] [WARN] log_file - { rss: 64958464,
  heapTotal: 18911232,
  heapUsed: 12900536,
  external: 74452 }
[2017-05-25 20:02:35.112] [WARN] log_file - { rss: 64970752,
  heapTotal: 18911232,
  heapUsed: 12897888,
  external: 74452 }
[2017-05-25 20:03:05.148] [WARN] log_file - { rss: 64983040,
  heapTotal: 18911232,
  heapUsed: 12898952,
  external: 74452 }
[2017-05-25 20:03:35.181] [WARN] log_file - { rss: 65036288,
  heapTotal: 18911232,
  heapUsed: 12943384,
  external: 74452 }

最终时候内存使用情况

[2017-05-26 09:24:05.714] [WARN] log_file - { rss: 75079680,
  heapTotal: 18911232,
  heapUsed: 13323896,
  external: 148180 }
[2017-05-26 09:24:35.747] [WARN] log_file - { rss: 75075584,
  heapTotal: 18911232,
  heapUsed: 13321840,
  external: 148180 }
[2017-05-26 09:25:05.786] [WARN] log_file - { rss: 75075584,
  heapTotal: 18911232,
  heapUsed: 13322248,
  external: 148180 }

headused有小幅度上升,且没有回落,rss上升幅度较大。不知道这是代码出现问题所致,还是nodejs和linux内存回收机制所致?@hyj1991 对内存回收这方面还不是很懂,还望指教。谢谢。

@bingino rss是实际进程驻留在内存的大小… heapTotal 稳定,rss 变大也是也是有可能的,buffer 或者别的 c++ 扩展不走 v8 的 handle 引用管理的内存比较多吧

我自身代码并没有引用c++扩展,或使用buffer。估计是吸入第三方包的缘故。RSS有所上升且在几小时内没有下降到原位,而是在较初始值高出10M左右的节点波动。通过一些查询linux和nodejs都是惰性内存管理机制,不知道这是因为内存尚有空间,linux惰性回收机制没有进行回收,还是第三方包buffer 或者别的 c++ 扩展有所泄漏?依靠这日志信息能否做出一些判断?如果你也不确定,你只要用你经验说出你的想法就好啦。我实在有点疑惑。 还有,我想咨询一下。V8 引擎管理的内存只是堆内存 ,即heapTotal部分。也就是说V8引擎限定的64位1.4G最大内存,指的是heapTotal最大为1.4G,而buffer或c++ 扩展?抑或是RSS为1.4G? 问题有点多,有点麻烦你啦。谢谢。

@bingino 你运行linux的释放内存命令看看 echo 1 > /proc/sys/vm/drop_caches

@bingino heapTotal 限制为 1.4g

@sunwukong2012 运行了

echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches

这几个,但都没有效果。linux减小了内存使用,但进程的RSS不降反在执行echo 3之后增长了不少,从74993664增长到 81014784。

[2017-05-26 13:28:23.096] [WARN] log_file - { rss: 74993664,
  heapTotal: 18911232,
  heapUsed: 13432920,
  external: 148180 }
[2017-05-26 13:28:53.128] [WARN] log_file - { rss: 74997760,
  heapTotal: 18911232,
  heapUsed: 13432656,
  external: 148180 }
[2017-05-26 13:29:23.158] [WARN] log_file - { rss: 75005952,
  heapTotal: 18911232,
  heapUsed: 13432808,
  external: 148180 }
[2017-05-26 13:29:53.198] [WARN] log_file - { rss: 75005952,
  heapTotal: 18911232,
  heapUsed: 13432656,
  external: 148180 }
[2017-05-26 13:30:23.238] [WARN] log_file - { rss: 75005952,
  heapTotal: 18911232,
  heapUsed: 13432560,
  external: 148180 }
[2017-05-26 13:30:53.271] [WARN] log_file - { rss: 75010048,
  heapTotal: 18911232,
  heapUsed: 13434672,
  external: 148180 }
[2017-05-26 13:31:23.310] [WARN] log_file - { rss: 81014784,
  heapTotal: 18911232,
  heapUsed: 13432656,
  external: 148180 }
[2017-05-26 13:31:53.353] [WARN] log_file - { rss: 81014784,
  heapTotal: 18911232,
  heapUsed: 13432912,
  external: 148180 }
[2017-05-26 13:32:23.384] [WARN] log_file - { rss: 81014784,
  heapTotal: 18911232,
  heapUsed: 13432656,
  external: 148180 }
回到顶部