深入浅出NodeJS——内存控制

基于无阻塞、事件驱动建立的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()操作大文件。

深入浅出NodeJS——内存控制,布布扣,bubuko.com

时间: 2024-10-21 04:02:07

深入浅出NodeJS——内存控制的相关文章

《深入浅出Nodejs》—— 读后总结

这一个月过去了三分之二,加上之前看过这本书三分之一,这才算是看完. 虽然看完一遍,但是这本书内容很深,以后肯定是还要继续翻阅的..... 什么是Nodejs Nodejs有几个特性:异步IO,事件驱动,单线程,跨平台 异步IO可以保证在CPU计算的同时,异步的加载IO,加快了应用的访问.不像传统的服务器是使用什么阻塞IO啊.轮训IO等等,它相当于在发送处理请求时,直接传一个回调函数,当异步的IO结束后,会自动的执行回调. 事件驱动,则是把粒度降低到事件级别.传统的服务器是一个请求分配一个线程进行

【读书笔记】《深入浅出nodejs》第五章 内存控制

海量请求+长时间运行 -> 内存控制 -> 一切资源高效循环利用 1. V8的垃圾回收机制与内存限制 在Node中通过JavaScript使用内存时,只能使用部分内存(64位系统下约1.4GB,32位系统下约为0.7GB). 在V8中,所有的JavaScript对象都是通过堆来进行分配的,当申请的堆空闲内存不够分配新的对象,将继续申请堆内存,直到堆得大小超过V8的限制为止. 为什么V8要限制堆得大小? -> (1)V8最初为浏览器设计,不太可能遇到用大量内存的场景. -> (2)V

深入浅出Nodejs读书笔记(转)

原文来自我的博客:http://tw93.github.io/2015-03-01/shen-ru-qian-chu-nodejs-reading-mind-map.html 今天终于把朴灵老师写的<深入浅出Node.js>给学习完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架.库的使用层面上,而是从不同的视角来揭示Node自己内在的特点和结构.建议有一定Node基础或者做过Node方面的小项目的同学阅读,看完以后你的思维会有很奇特的碰撞,我看的时候就常常会有这样

深入浅出Nodejs读书笔记

深入浅出Nodejs读书笔记 转:http://tw93.github.io/2015-03-01/shen-ru-qian-chu-nodejs-reading-mind-map.html category:node学习笔记       2015-03-01 今天终于把朴灵老师写的<深入浅出Node.js>给学习完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架.库的使用层面上,而是从不同的视角来揭示Node自己内在的特点和结构.建议有一定Node基础或者做过No

转载-----nodejs内存定位

追踪NodeJS代码中的内存泄漏一直是一个很有挑战的难题.本文讨论如何从一个node写的应用里自动的跟踪到内存泄漏问题,在这里笔者向大家推荐两款追查内存问题的神器 —— memwatch 和 heapdump 首先,我们来看一个简单的内存泄漏 var http = require('http'); var server = http.createServer(function (req, res) { for (var i=0; i<1000; i++) { server.on('request

深入浅出NodeJS——网络编程

Node提供丰富的网络编程模块 Node模块 协议 net TCP dgram UDP http HTTP https HTTPS TCP服务 TCP服务事件分为下面两类 (1).服务器事件 对于通过net.createServer()创建的服务器而言,它是一个EventEmitter实例,自定义事件有以下几种: listening:在调用listen()绑定端口或Domain Socket后触发,简写为server.listen(port, listener),通过第二个参数传入. conne

深入浅出NodeJS——Buffer

Javascript对字符串处理十分友好,无论是宽字节还是单字节字符串,都被认为是一个字符串.Node中需要处理网络协议.操作数据库.处理图片.文件上传等,还需要处理大量二进制数据,自带的字符串远不能满足这些要求,因此Buffer应运而生. Buffer结构 Buffer是一个典型的Javascript和C++结合的模块,性能相关部分用C++实现,非性能相关部分用javascript实现. Node在进程启动时Buffer就已经加装进入内存,并将其放入全局对象,因此无需require Buffe

&lt;&lt;深入浅出nodeJS&gt;&gt;读书笔记--&lt;一&gt;

前语:nodeJs这书早在五月份的时候就已经买了,那时候才刚刚接触node,本想着这书应该是node入门级比较系统化的书,可翻了几页之后呢,发现好多地方都晦涩难懂,特别是看到内建模块的C++实现时,瞬间有想瞌睡的感觉....-_-从这之后,这书一直被我闲置在书桌角落,再无动过,看书学习node的想法就这样放弃了,转为上网学习基础的语法API..就这样,边看API边跟着做一些小例子,慢慢的,发现基本的API用法都已经掌握了,于是,去搜搜与node有关的一些技术博客,希望能够进阶去了解node.开始

深入浅出NodeJS——异步编程

函数式编程 Javascript中函数作为一等公民,函数看成普通对象,可以作为参数或者返回值. 高阶函数:函数作为参数或者将函数作为返回值的函数 异步编程优势 基于事件驱动的非阻塞I/O模型 异步编程难点 (1) 异常处理,通常try/catch不一定适用,因为callback并不是在当前Tick中执行. Node在异常处理中约定将异常作为回调函数的第一个实参传回. (2)  函数嵌套过深 (3) 代码阻塞:没有sleep函数,通过setInterval()和setTimeout()模拟 (4)