第五章 内存控制
- 5.1.3
V8分配的堆内存在64位和32位下的的最大值分别为1400MB和700MB。堆分为新生代和旧生代两部分。新生内存的最大值在64位系统32位系统上分别为32 MB和16 MB。
- 5.1.4
垃圾回收时,新生代中的对象采用Scavenge算法进行垃圾回收
老生代采用 Mark-Sweep(标记清除) & Mark-Compact(标记整理)回收算法。
- 5.4
通常,造成内存泄漏的原因有如下几个:
第八章
8.1.6 缓存
If-Modified-Since/Last-Modified
缺点:只能精确到秒级,更新频繁的内容则无效,文件的时间戳改动文件内容不一定改动。
1 2 3 4 5 6 7
| if (lastModified === req.headers['if-modified-since']) { res.writeHead(304, "Not Modified"); res.end(); } else { fs.readFile(filename, function(err, file) { var lastModified = stat.mtime.toUTCString(); res.setHeader("Last-Modified", lastModified);
|
HTTP1.1中引入了ETag来解决这个问题, If-None-Match/ETag
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| var handle = function (req, res) { fs.readFile(filename, function(err, file) { var hash = getHash(file); var noneMatch = req.headers['if-none-match']; if (hash === noneMatch) { res.writeHead(304, "Not Modified"); res.end(); } else { res.setHeader("ETag", hash); res.writeHead(200, "Ok"); res.end(file); } }); };
|
Cache-Control(http1.1)
设置了 max-age,它比Expires 优秀的地方在于, Cache-Control能解决客户端与服务端时间不同步带来的不一致性问题,由于在HTTP1.0时还不支持max-age ,如今的服务器端同时支持对Expires和Cache-Control进行设置,此时max-age会覆盖Expires。
清除缓存
每次发布,路径中跟随Web应用的版本号:http://url.com/?v=20130501。
每次发布,路径中跟随文件内容的hash: http://url.com/?hash=afadfadwe。
8.2 数据上传
表单数据
- 默认的表单提交,请求头中的 Content-Type为 application/x-www-form-urlencoded,如:
Content-Type: application/x-www-form-urlencoded
- JSON和XML文件,JSON文件的Content-Type为 application/json ,XML的为application/xml
需要注意的是,在 Content-Type 中可能还附带如下的编码信息:
Content-Type: application/json; charset=utf-8
8.2.3 附件上传
1 2
| Content-Type: multipart/form-data; boundary=AaB03x Content-Length: 18231
|
8.2.4 数据上传与安全
- 内存限制
限制上传内容的大小,一旦超过限制,停止接收数据,并相应400状态码
通过流式解析,将数据导向磁盘中,Node只保存文件路径等小数据
8.5 页面渲染
- MIME
MIME的全称是Multipurpose Internet Mail Extensions,最早用在电子邮件中,后来也用到浏览器中。不同的文件类型有不同的MIME,浏览器也有相应不同的处理方式。
- 附件下载
设置Content-Disposition字段:
即时查看时字段为为 inline ,数据可以存为附件时,值为attachment,如:
Content-Disposition: attachment; filename="filename.ext"