博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nodejs内存控制
阅读量:4069 次
发布时间:2019-05-25

本文共 1372 字,大约阅读时间需要 4 分钟。

文章转自:http://blog.csdn.net/changer328/article/details/38173357

基于无阻塞、事件驱动建立的Node服务,具有内存消耗低的优点,非常适合处理海量的网络请求。

V8的垃圾回收机制与内存限制

Javascript和Java类似,由垃圾回收机制来进行自动内存管理,而Node是构建在V8虚拟机基础上,所以其内存回收和V8运行机制息息相关。

V8的内存限制:64位系统约为1.4GB、32位系统约为0.7GB

process.memoryUsage(),返回值包括heapTotal代表已申请到的堆内存,heapUsed当前使用的内存,rss(resident set size)进程的常驻内存。

V8的垃圾回收机制

V8采用基于分代式垃圾回收机制,堆内存结构如下所示,分为新生代和老生代,通过参数可以设置相应大小,但是一旦设置不能根据使用情况自动扩充。

新生代:复制算法、Scavenge算法,一个对象是否从新生代晋升到老生代主要根据以下两个条件。

a. 一个对象是否被Scavenge回收过;

b.To空间的内存占用比超过限制(25%);

老生代:Mark-Sweep & Mark-Compact

Mark-Sweep标记清除,只清理死亡对象,内存空间会存在大量碎片。

Mark-Compact标记整理,标记死亡对象后,将活着的对象往一端移动消除不连续的碎片,速度最慢

上述3种垃圾回收方法都需要将应用逻辑暂停下来,待垃圾回收完毕再继续执行应用逻辑,这种行为称为stop-the-world

查看垃圾回收日志:node --trace_gc -e test.js

V8性能分析数据:node --prof test.js   --->v8.log

linux-tick-processor v8.log

高效使用内存

JavaScript中作用域分为:函数作用域、with作用域、全局作用域

标示符查找会先从当前作用域,若没有找到将会向上级的作用域里查找

查看进程内存使用情况:process.memoryUsage()

查看系统内存占用:os.totalmem()和os.freemem(),系统总内存和闲置内存,以字节为单位

堆外内存:Buffer等

内存泄露

内存泄露的实质是应当回收的对象出现意外而没有被回收,变成了常驻在老生代中的对象。

通常造成内存泄露原因包括

(1) 缓存

Javascript对象本身就是key-value形式,可以用作缓存,但由于缺乏高效淘汰机制存在较多缺陷和问题。

由于模块的缓存机制,模块是常驻老生代的,在模块设计时,十分小心内存泄露。

解决方案:进程外的缓存,进程自身不存储状态,如Redis、memcached

(2) 队列消费不及时

(3) 作用域未释放

内存泄露排除工具

node-heapdump

node-memwatch

大内存使用

Node中提供stream模块用于处理大文件,分为可读和可写两种,Node中大部分模块都具有stream的应用如:

fs.createReadStream()、fs.createWriteStream(),可以避免由于V8内存限制不能通过fs.readFile()或fs.writeFile()操作大文件。

你可能感兴趣的文章
Linux常用统计命令之wc
查看>>
fastcgi_param 详解
查看>>
解析zookeeper的工作流程
查看>>
搞定Java面试中的数据结构问题
查看>>
慢慢欣赏linux make uImage流程
查看>>
linux内核学习(7)脱胎换骨解压缩的内核
查看>>
慢慢欣赏linux 内核模块引用
查看>>
kprobe学习
查看>>
慢慢欣赏linux CPU占用率学习
查看>>
Homebrew指令集
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>
Android自定义apk名称、版本号自增
查看>>
adb command not found
查看>>
Xcode 启动页面禁用和显示
查看>>
【剑指offer】q50:树中结点的最近祖先
查看>>
二叉树的非递归遍历
查看>>