读书笔记之《深入浅出Node.js》(2)

原创 2016年05月30日 17:25:12

上一篇读书笔记中中我们讲到了异步,这里不得不提一下Promise,现在的ES6已经原生支持Promise对象。所谓的Promise对象,其实就是一个异步操作,使用Promise的好处在于,我们可以把异步操作用同步的方式来写,避免了层层嵌套的回调函数(俗称callback hell)。以下的内容主要来自陈天大大的一篇文章讲Promise的文章,然后又加上了Node.js中Promise的一种实现方法。

Promise的状态机

简易版状态机
具体代码逻辑
具体代码,这里首先连接数据库,然后打开某一个某,最后插入数据,一个三层的嵌套
具体代码例子
用Promise改造后就变成类似同步方法的写法,其中为了实现链式调用,每一个then语句中都要返回一个Promise对象,且最后的catch语句处理之前的then语句中发生的所有异常。
Promise改造后的代码
下面是我自己写的一个实现了链式调用Promise且能在得到不想要的结果时退出的一段代码

<script type="text/javascript">
  var getDate = function(url) {
    var promise = new Promise((resolve, reject) => {
      var xhr;
      if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest();
      } else {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
      }
      xhr.onreadystatechange = handler;
      xhr.open("GET", url);
      xhr.send(null);
      function handler() {
        if (this.readyState === this.DONE) {
          if (this.status === 200) {
            resolve(this);
          } else {
            reject(this);
          }
        }
      }
    });
    return promise;
  }
  getDate("http://127.0.0.1:3000/data").then(function (data) {
    //判断结果,若不是Frontend,则直接抛出异常,跳转到最后的catch语句中
    if (data.response !== "Frontend") {
      throw "Error";
    }
    console.log('Correct');
    //再次返回一个Promise对象,实现链式调用
    return getDate(data.responseURL)
  }).then(function (data) {
    console.log(data.response);
  }).catch(function (err) {
    console.log(err);
  });
</script>

第五章 内存控制

背景

因为Node.js处于服务器端,所以内存的问题就必须重视起来,这里与浏览器中很少会碰到内存的一些问题,很多时候当发生垃圾回收造成页面加载缓慢时,用户一般就不耐烦地刷新了页面。但是在Node.js中,面对海量请求的时候,哪怕是一丁点的内存泄漏也会越积越多,最后造成服务器的崩溃!

介绍

首先,Node.js使用V8作为执行引擎,所有它的内存管理是交给V8来实现的。Node.js中的内存分为两部分:

  • V8分配的内存(受内存管理的限制),在32位系统下默认为0.7GB,64位系统下默认为1.4GB,但这个限制可以在启动Node时改变。
    node --max-old-space-size=2400 app.js //指定老生代内存大小,单位为MB
    node --max-new-space-size=1024 app.js //指定新生代内存大小,单位为KB

  • Node自行分配的内存(例如Buffer对象,不受到V8内存管理的限制,在处理几个GB的大文件时特别有用)。
    同时在V8中,内存被分为两部分:

    • 老生代(占比98%,存放存活时间较长的对象 ,应用Mark-Sweep和Mark-Compact算法)
    • 新生代(占比2%,存放存活时间较短的对象,应用半空间复制算法Scavenge)

V8中一次小的垃圾回收要50ms,一次大的非增量的垃圾回收要1s以上,这是几乎无法忍受的,所以它内部通过各种算法来优化垃圾回收,算法细节有兴趣的可以自行Google。

我们可以通过分析V8执行时的日志来查看垃圾回收所占用的时间,用如下的方法来启动Node
启动Node并生成日志,这样在根目录中会生成对应的日志文件,如下图所示:
日志文件
对应的GC.js文件的代码

for (var i = 0; i < 1000000; i++) {
  var a = {};
}
for (var j = 0; j < 1000000; j++) {
  var b = {};
}

然后在安装了tick模块后,我们就可以看到垃圾回收实际产生的影响了。这里我是在WebStrom中直接用集成好了的工具来做的,省时省力。
WebStorm中集成的分析工具
分析结果如下图
分析结果
从结果里可以看到,由于不断分配对象,垃圾回收所占的比列为1%(我的Node版本是6.2.0,已经对垃圾回收做了很多优化),这意味着事件循环每执行1000ms,就要抽出10ms的事件来执行垃圾回收。

高效使用内存

为了高效使用内存,我们在开发中要注意几点:

  • 减少全局变量的使用,通过重新赋值(null或undefined)来释放全局变量,虽然删除对象也可以取得相同的效果,但删除对象有可能干扰到V8的垃圾回收机制,所以采用重新赋值的方法来解除占用会更好。
  • 减少闭包的使用
  • 不要把内存当做缓存,这样会干扰垃圾回收,且还要自己制定缓存的过期策略,推荐使用Redis或者Memcached。

大内存应用

在需要操作大文件时,由于V8内存的限制,不能直接通过fs.readFile()和fs.writeFile()进行操作,而是需要用到stream模块或者继承stream的模块。代码如下

var fs = require('fs');
var reader = fs.createReadStream('../../public/v8_log.log');
var writer = fs.createWriteStream('../../public/v8_log_copy.log');
reader.on('data', function (chunk) {
  writer.write(chunk);
});
reader.on('end',function(){
  writer.end();
});
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

读书笔记——深入浅出node.js——构建http服务

朴灵大师的书确实不错,让我受益非浅。 个人理解,仅做参考。构建http服务在Web领域,大多编程语言需要专门的Web服务器作为容器,如ASP、ASP.NET需要IIS,PHP需要搭载Apache或Ng...

《深入浅出Node.js》读书笔记+个人思考(二):异步I/O

对异步的理解
  • nzyalj
  • nzyalj
  • 2017年03月12日 14:08
  • 233

读书笔记之《深入浅出Node.js》(4)

第八章 构建Web应用在具体的业务中,我们有如下的这些需求(实际开发中一般用 Express框架,它帮我们做了很多事情),这里以访问 http://127.0.0.1/admin/head/on?so...

JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记2

根据功能设计,可以先写好 HTML 结构基础,再配好 CSS 做出大致效果,最后用 JavaScript加上各种动作。首先请看 HTML 代码结构。...
  • kgsew
  • kgsew
  • 2014年10月24日 11:27
  • 1273

深入浅出MFC读书笔记2

  • 2010年08月28日 08:11
  • 5.51MB
  • 下载

[读书笔记]深入浅出NodeJS——Node中的异步I/O

JS执行是单线程的,但Node底层有一个线程池,使用多线程来实现异步I/O Node的异步I/O 几大要素:事件循环、观察者、请求对象、I/O线程池。 事件循环 进程启动,会创建一个whil...

深入浅出Ext JS(第2版)读书笔记(1)

第1章 EXT概述 1.1  EXT版本变迁 q  EXT1.0 发布于2007年2月,这标志着EXT正式从YUI社区中独立出来,不再仅仅支持YUI,而是提供了ext-base、prototy...
  • mouyong
  • mouyong
  • 2012年03月27日 08:48
  • 1525

JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记4

只要图片高度不一致,通过这样的思路很快就可以看到一个“瀑布流”,这仅仅是静态的,一般滚动的时候瀑布流都会添加数据,所以接下来就是添加滚动事件,只要有滚动就计算然后补充数据。...
  • kgsew
  • kgsew
  • 2014年11月10日 11:45
  • 868

redis 学习记录总结(Node.js实战-读书笔记)

redis中的五种类型一年前已经对redis进行了学习,一直没有系统的记录总结,最近读过一本redis的书和Node.js 实战一书再次进行回顾和系统的总结来简要记录redis:全局操作: flas...

《Node.js开发指南》读书笔记

继续学学node.js。翻开书首先被惊到=。=:作者BYVoid是清华大学2010级本科……同样是2010级本科,我真是无语凝噎,大学浪费了好多时间。不过过去的已经过去了,接下来好好努力提高才好,加油...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:读书笔记之《深入浅出Node.js》(2)
举报原因:
原因补充:

(最多只允许输入30个字)