深入浅出node读书笔记(五)

  本篇文章说说JavaScript在v8引擎里面内存管理的相关问题。

  (1)从本质来讲,node是基于v8引擎才开发出来的,v8在给node带来一系列有点之余,也带来了一些缺陷,比如内存限制就是一个方面。因为v8的限制,node在64位机器下只能使用1.4G的内存,在32位机器下更是只能使用0.7G。v8进行内存限制是为了防止在垃圾回收时候所用时间过长导致卡顿。这在文章下边会有介绍。

  (2)所有的JavaScript对象都是通过堆来进行内存分配的,v8在最开始的时候有一个申请好的一块堆内存,创建js对象时候就是用该堆进行分配,如果已申请好的堆不够分配给新对象,就会接着申请堆,直至到达v8的限制内存上限。

  (3)v8的垃圾回收机制:分代式垃圾回收机制。

    在v8中,主要将内存分为两种:新生代中的对象存活时间较短,老生代中的对象存活时间较长或者常驻内存的对象。

    新生代内存对象垃圾回收算法:Scavenge算法:堆内存一分为二,一半使用(from空间),一半闲置(to空间),分配对象时候只分配到from空间,垃圾回收时候把from空间活着的对象拷贝到to空间,两者互换角色。缺点:只使用了堆内存的一半

    晋升:当一个对象多次复制依然存活时候,会被移动到老生代进行管理。这叫做晋升。晋升依据有两个:该对象是否经过Scavenge回收、to空间的占用比例是否超过25%,如果超过,不利于变成from空间后的对象分配。

    老生代内存对象垃圾回收机制:Mark-Sweep和Mark-Compact算法。即标记清除算法。第一个算法是遍历老生代内存中的对象,把活着的标记起来,把死的清除掉。但是会造成内存空间的不连续碎片,第二个算法是在标记的时候把活着的对象移动到同一边,把另一边的清除。

  注意:在进行垃圾回收时候会让js应用逻辑暂停,称为‘全停顿’,有一些方法缓解,此处不做讨论。

  

  接下来说说http协议的在node里面一些很基础的知识:

  (1)在node中有一个http模块,用来构建web服务。它将所用的套接字的读写抽象为ServerRequest和ServerResponse对象,分别对应请求和响应操作,当请求发生时候,http模块拿到连接中传来的数据,调用二进制模块http_parse来解析数据。

  (2)ServerRequest对象:

  (3)ServerResponse:结构与上边的类似,响应报文头部需要setHeader()和writeHeader()方法来写入  

           res.writeHead(200, {'Content-Type': 'text/plain'}); 

   报文体部分用res.write()和res.end()来写,当要关闭连接时候一定要调用用res.end(),不然会使连接一直处于等待状态。

 

 

 

 

 

 

 

  

posted @ 2016-01-12 22:37  阿鼻地狱  阅读(167)  评论(0编辑  收藏  举报