node中heaptotal缓慢增长内存泄漏导致重启
发布于 1 年前 作者 Borkes 904 次浏览 来自 问答

node统计的process.memoryUsage()中 rss heaptotal heapused external image.png

代码取和栈可以先不考虑。 对外内存external是buffer分配的,每天的对比没有什么变化 堆内存的分配就比较奇怪heaptotal每天是缓慢递增,大概一周增加了100~300M,而heapused对比没有变化,导致heap使用率每天都下降。 但是heaptotal递增到1.3G左右(应该是到了V8限制)node进程就会发生重启,这个是不希望出现的。

image.png

用heapdump获取两天的内存快照发现内存的使用都有增加,没有什么奇怪的地方。由于整个项目代码比较多,就不贴代码了。主要是有下面几个问题,希望大佬能帮忙解答一下 1.heaptotal和heapused分别是在什么情况下分配增加的? 2.想这种heaptotal分配增加,heapused不变,大致什么情况下回发生,算是内存泄漏吗?毕竟heaptotal分配过高会导致进程重启 3.heapdump获取的内存快照是rss的还是heaptotal的?

3 回复

看你的堆快照,堆内实际使用 50M,heapTotal 1.3G ?? 如果真的是这样,那说明全是 hole。。。

Note that if a page becomes too “popular”, i.e., there are too many pointers to be recorded to its objects from other pages, pointer location recording is disabled for that page, and the page cannot be evacuated until the next garbage collection cycle.

可以参考下这篇文章: A tour of V8: Garbage Collection

可以接入 Node.js 性能平台 做一个 gc trace 确认下

@hyj1991 那个是heapdump文件的大小,里面是各个节点指针。

回到顶部