node中的内存控制

基于无阻塞、事件驱动建立的Node服务,具有内存消耗低的优点,非常适合处理海量的网络 请求。
内存控制正是在海量请求和长时间运行的前提下进行探讨 的。在服务器端,资源向来就寸土寸金,要为海量用户服务,就得使一切资源都要高效循环利用。

在Node中通过JavaScript 使用内存只能使用部分内存64位系统下约为1.4 GB,32位系统下约为0.7 GB)

V8的对象分配

在V8中,所有的JavaScript对象都是通过堆来进行分配的。Node提供了V8中内存使用量的查 看方式
process.memoryUsage()

//进程的常驻内存部分
{
    rss: 31272960,
//V8的堆内存使用情况,已申请到的堆内存
 heapTotal: 9682944,
//V8的堆内存使用情况,当前使用的量
 heapUsed: 5400792,
 //V8 引擎内部的 C++ 对象占用的内存
 external: 16905 }

进程的内存总共有几部分,一部分是rss,其余部分在交换区(swap)或者文件系统(filesystem)中.除了rss外,heapTotal和heapUsed对应的是V8的堆内存信息。heapTotal是堆中总共申请的内
存量,heapUsed表示目前堆中使用中的内存量。这3个值的单位都是字节

Node在启动时可以传递–max-old-space-size或–max-new-space-size来调整内存限制的大小

//用于设置老生代内存空间的最大值
node --max-old-space-size=1700 test.js // 单位为MB
// 或者  设置新生代内存空间的大小的
node --max-new-space-size=1024 test.js // 单位为KB

上述参数在V8初始化时生效,一旦生效就不能再动态改变。如果遇到Node无法分配足够内
存给JavaScript对象的情况,可以用这个办法来放宽V8默认的内存限制,避免在执行过程中稍微
多用了一些内存就轻易崩溃

v8的垃圾回收机制

V8的垃圾回收策略主要基于分代式垃圾回收机制
在V8中,主要将内存分为新生代和老生代两代。
新生代中的对象为存活时间较短的对象新生代中的对象主要通过Scavenge算法进行垃圾回收
老生代中的对象为存活时间较长或常驻内存的对象Mark-Sweep和Mark-Compact相结合的方式进行垃圾回收

高效使用内存

在JavaScript中能形成作用域的有函数调用、with以及全局作用域
闭包是JavaScript的高级特性,利用它可以产生很多巧妙的效果。它的问题在于,一旦有变量 引用这个中间函数,这个中间函数将不会释放,同时也会使原始的作用域不会得到释放,作用域 中产生的内存占用也不会得到释放。除非不再有引用,才会逐步释放。

在V8中通过delete删除对象的属性有可能干扰V8的优化,所以通过赋值方式解除引用更好

查看内存使用情况

写一个方法不停的分配内存 但不释放 ,并打印日志

// 格式化内存使用情况
var showMem = function () {
   
    var mem = process.memoryUsage();
    var format = function (bytes) {
   
        //toFixed 四舍五入number值
        return (bytes / 1024 / 1024).toFixed(2) + ' MB';
    };
    console.log('Process: heapTotal ' + format(mem.heapTotal) +
    ' heapUsed ' + format(mem.heapUsed) 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值