读书笔记之《深入浅出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系列八】一个基于Node.js完整的Web应用实战

1 Web用例 我们来把目标设定得简单点,不过也要够实际才行: 用户可以通过浏览器使用我们的应用。 当用户请求http://domain/start时,可以看到一个欢迎页面,页面上有一个文件...
  • zhangyuan19880606
  • zhangyuan19880606
  • 2016年05月26日 17:42
  • 1984

传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(day01~day10)(2015年11月17日20:51:59)

day01 win 7系统打开DOS有趣方法:按住shift+右键,单击“在此处打开命令窗口”(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复?!! ...
  • juliantem
  • juliantem
  • 2015年08月30日 13:09
  • 3495

深入java虚拟机第二版阅读笔记(不断整理中)

1 class文件是如何被调入内存执行的? 加载原理?   深入探讨 Java 类加载器:http://www.ibm.com/developerworks/cn/java/j-lo-classloa...
  • ajian005
  • ajian005
  • 2014年03月05日 11:25
  • 1339

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

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

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

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

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

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

深入浅出Node.js读书笔记

今天终于把朴灵老师写的《深入浅出Node.js》给学习完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架、库的使用层面上,而是从不同的视角来揭示Node自己内在的特点和结构...
  • he90227
  • he90227
  • 2015年10月09日 17:03
  • 571

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

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

深入浅出MFC读书笔记2

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

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

JS执行是单线程的,但Node底层有一个线程池,使用多线程来实现异步I/O Node的异步I/O 几大要素:事件循环、观察者、请求对象、I/O线程池。 事件循环 进程启动,会创建一个whil...
  • pengpengrose0406
  • pengpengrose0406
  • 2015年07月20日 10:08
  • 337
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:读书笔记之《深入浅出Node.js》(2)
举报原因:
原因补充:

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