文档章节

nodejs的内存管理,垃圾回收机制

qingfeng哥
 qingfeng哥
发布于 2014/05/28 15:12
字数 1073
阅读 1568
收藏 2

要点记录:

1、网页js、命令行工具,快进快出的,即时内存泄露,无内存管理必要!

2、服务器端nodejs和其他正规语言一样存在内存泄露。

3、nodejs基于谷歌v8js引擎,速度很快,垃圾回收也是由v8维护的

4、通过查看源码可发现v8中用js使用内存的限制约为:64位-1.4G  32位 -0.7G。这是源于v8的垃圾回收机制的限制,可在node 后加 --max-old|new-space-size=xxx来改变内存限制

5、nodejs进程的内存占用:堆内内存+堆外内存=rss+swap+fs,
其中v8申请和分配的为堆内内存,所有js实体都是通过堆来分配的。process.memoryUsage() 可查看常驻内存rss,heapTotal总堆内存,和已分配的堆内存heapUsed
非V8分配的内存为堆外内存,如 Buffer对象占据的内存,用在网络流和文件流中
os.totalmem  os.freemem 可查看系统的总内存和可用 内存

6、v8的垃圾回收算法

统计学知识的应用,按对象存活时间将内存的垃圾回收进行不同的分代,对这些不同的分代分别实施不同的回收算法

v8中将内存主分为新生代 和 老生代 空间,前者存活时间短,后者较长或常驻

7、新生代中活对象较少,采用scavenge-cheney算法:将新生代一分为二,From ->To ,新对象分配在from中,回收时将From中活的对象从From复制到To,释放From,然后From和To互换角色。

8、一个对象从From复制到To时,如果ta之前经历过一次scavenge复制,或者to空间已经使用了25%了,则该对象会直接晋升到老生代空间中,接受其他回收算法

9、老生代活对象较多,采用mark-sweep和mark-compact相结合的方法:m-s,不再划分内存空间,标记阶段标记所有活的对象,清理阶段清除释放所有未标记(死了的)对象,这一步会产生内存空间碎片,因此出现了m-c,边标记边将活动的对象往内存空间的一端 移动,清理时直接清理活死对象边界死的那端。移动对象是耗时的,所以主要使用 m-s算法,当不足以分配空间给从新生代晋升来的对象时,才使用m-c回收。

10、全停顿---每次垃圾回收时都会暂停应用逻辑,是为了避免应用逻辑和回收器看到的对象不一致。

11、增量动作,v8的分代垃圾回收中,分为full和part方式,part只回收新生代的,因为新生代空间小啊,全停顿影响不大,但是full回收会回收老生代的,全停顿的时间就不能接受了,于是就有了 增量式标记incremental marking。即将标记工作分步,每步和应用逻辑交替执行,这样最大停顿时间减少很多,(六分之一);
其他阶段就有:延迟清理,增量式整理compact,利用多核来并行标记和清理

12、查看垃圾回收动作日志:启动node时 加 --trace_gc 参数, --prof参数可得到v8执行性能参数,用*-tick-processor查看

13、无法立即回收的内存有全局变量和闭包,尽量使用变量赋值为null|undefined来触发回收

14、内存泄露:该回收的对象出现意外没有被回收,来自于:缓存,队列消费不及时,作用域未释放

15、慎用内存当缓存,非用的话控制好缓存的大小和过期时间,方式出现永远无法释放的问题,采用redis,memX

16、数组、回调,生产者的速度比消费者速度快,堆积了大量生产者导致无法释放作用域或变量: 队列监控,异步调用应包含超时处理机制

17、内存泄露排查,网上搜索node应用内存查看分析工具

node-headdump

node-memwatch


18、大文件处理使用stream模块

© 著作权归作者所有

共有 人打赏支持
qingfeng哥

qingfeng哥

粉丝 45
博文 127
码字总数 64346
作品 0
湛江
技术主管
私信 提问
解读 V8 GC Log(一): Node.js 应用背景与 GC 基础知识

原作者:洗影 前言 本文基于我在 Node.js 基金会主办的 Node Live Beijing 的分享,因为微软准备了一个翻译,现场临时把英文的分享改成中文了,有点磕巴。加上分享时长有限很多地方没有展开,...

_朴灵_
2018/05/14
0
0
Chrome V8 与 Node.js

从某种意义上来说,Node.js 并不是一个从零开始编写的 JavaScript 运行时,它其实也是站在“巨人的肩膀”上进行了一系列的拼凑和封装得到的结果。它的高效离不开一些很牛的第三方程序和类库。...

博文视点
2018/06/14
0
0
javascript 垃圾回收算法了解一下

我们通常理解的 javascript 垃圾回收机制都停留在表面,"会释放不被引用变量内存",最近在读《深入浅出node.js》的书,详细了解了下 v8 垃圾回收的算法,记录了一些学习笔记。 敲黑板:v8引擎...

程序员解决师
2018/06/12
0
0
从闭包函数的变量自增的角度 - 解析js垃圾回收机制

前言 感觉每一道都可以深入研究下去,单独写一篇文章,包括不限于闭包,原型链,从url输入到页面展示过程,页面优化,react和vue的价值等等。 代码实现 原理 因为times变量一直被引用,没有被...

燕儿199606
2018/06/20
0
0
拒绝 Python、C# 和 Go,我只用 Node.js!

我要写很多脚本。很多很多脚本。许多时候只是因为许多任务太复杂,或者量太大,以致没法手工完成。所以任何需要花时间的任务我都会写脚本。脚本不仅能减少错误,还能提高效率。我常说的一句话...

CSDN资讯
2018/10/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java中的ReentrantLock和synchronized两种锁定机制的对比

多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言。核心类库包含一个 Thread 类,可以用它来构...

watermelon11
4分钟前
0
0
Tomcat的日志

Tomcat的日志 Tomcat日志在/usr/local/tomcat/logs目录下,大概有一下几类文件: catalina.outcatalina.xxx-xx-xx.loghost-manager.xxxx-xx-xx.logmanager.xxxx-xx-xx.loglocalhost.xxx......

wzb88
25分钟前
0
0
PHP7源码编译安装详解

下面进行编译安装PHP7.0,编译安装最头疼的就是因为某些类库没有安装而报错,所以编译前请确保以下包已安装。 $ yum groupinstall "development tools"$ yum install -y gcc gcc-c++ aut...

Linux就该这么学
44分钟前
3
0
Java引用传递和JVM堆栈的关系说明

通过代码说明 Java 引用传递在堆栈上的关系。 可以从JVM的内存空间存放上说明,值传递 和引用传递。 堆(线程共享):对象、对象的全局变量、数组 栈(线程私有):声明为局部变量的 基本数据...

冷基
今天
2
0
直接插入排序

直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。直接插入排序的时间复杂度为O(n^2),但性能比冒泡排序和简单选择排序的性能要好一点...

niithub
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部