原创

内存控制

内存控制

v8垃圾回收机制与内存限制

内存问题

Node是 一个构建在Chrome的JavaScript运行时上的平台

内存控制正是在海量请求和长时间运行的前提下进行探讨的

在Node中通过JavaScript 使用内存时就会发现只能使用部分内存(无法操作大内存对象,例如读取2G的文件)

(64位系统下约为1.4 GB, 32位系统下约为0.7 GB)

V8限制内存的原因

开始是为浏览器设置的,不太可能会存在用到大量内存的场景

V8的垃圾回收机制限制,不控制内存会导致垃圾回收时间加长,阻塞 js 线程执行

这个限制可以通过 v8 提供的选项解除,如 node --max-old-space-size=1700 test.js

V8 的对象分配

在V8中,所有的JavaScript对象都是通过堆来进行分配的

根据对象的存货时间将内存的垃圾回收进行不同的分代,分别施以高效算法

老生代中的对象为存活时间较长或常驻内存的对象

新生代中的对象为存活时间较短的对象

V8 的垃圾回收机制

Scavenge算法:就是通过将存活对象在两个 semispace空间之间进行复制

典型的牺牲空间换取时间的算法,非常适合在生命周期短的新生代中应用

Mark-Sweep算法:通过标记活对象,清理死亡对象

Mark-Compact算法,将或对象移动到老生代一端,解决内存碎片问题

V8主要使用Mark-Sweep,在空间不足以对从新 生代中晋升过来的对象进行分配时才使用Mark-Compact。

垃圾回收需要将应用逻辑暂停下来即“全停顿”

垃圾回收的优化

· 拆分全停顿,应用执行一小会,垃圾回收执行一个拆分

· 延迟清理

· 增量式整理

高效使用内存

作用域

函数执行结束后,函数作用域被销毁,函数作用域中声明的变量也销毁

全局作用域需要直到 进程退出才能释放

如果需要释放常驻内 存的对象,可以通过delete操作来删除引用关系。或者将变量重新赋值,让旧的对象脱离引用关系。

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

闭包

作用域链上的对象访问只能向上,这样外部无法向内部访问

实现外部作用域访问内部作用域中变量的方法叫做闭包

即函数在定义的词法外部调用

闭包使得外部作用域对闭包定义的词法作用域有引用,因此词法作用域不会释放,内存也不会释放

在正常的JavaScript执行中,无法立即回收的内存有闭包和全局变量引用这两种情况

内存指标

进程的内存总共有几部分

rss 进程的常驻内存部分

交换区

文件系统

process.memoryUsage() 可以查看内存使用情况

堆中的内存用量总是小于进程的常驻内存用量,即内存并非都是通过V8分配的

不是通过V8分配的内 存称为堆外内存

os.totalmem() 可以查看系统的总内存

os.freemem() 可以查看系统的闲置内存

内存泄露

慎将内存当做缓存

在node 中一旦一个对象被缓存起来,就会被放到老生代中

长期存在的对象会使得垃圾回收扫描整理的时候对这些对象做无用功

由于模块的缓存机制,模块是常驻老生代的

采用进程外的缓存,进程自身不存储状态

关注队列外状态

一旦消费速度低于生产速度, 将会形成堆积

启用超时模式时,调用加入到队列中就 开始计时,超时就直接响应一个超时错误

拒绝模式时,当队列拥塞时,新到来的调用会直 接响应拥塞错误

内存泄露排查

node-heapdump

node-memwatch

通过对堆内存进行分析而找到

大内存应用

由于Node的内存限制,操作大文件 也需要小心,好在Node提供了stream模块用于处理大文件。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Nodejs·内存控制

    之前有考虑过Node中的内存管理,但是没想到Node的内存机制与JVM如此相像。 看完这部分的内容,基本可以了解Node中的内存使用技巧: 1 尽量不要做...

    用户1154259
  • 对象与内存控制

    JVM的垃圾回收机制是由一条后台线程执行的,其本身也是非常消耗内存的,因此,滥用创建对象,会导致性能大大下降,对内存的分配的了解就显得尤为重要

    迹_Jason
  • Node理论笔记:内存控制

    JavaScript和Java一样是由垃圾回收机制来进行自动内存管理的,对于浏览器,几乎不需要考虑内存回收的问题,但服务器对性能更为敏感,内存管理的好坏、垃圾回...

    Ashen
  • 图解 Java 数组与内存控制

    Java的数组变量是一种引用类型的变量,数组变量并不是数组本身,它只是指向堆内存中的数组对象,改变一个数组变量所引用的数组,可以造成数组长度可变的假象。

    CoderJed
  • 第012课 内存控制器与SDRAM

    如图是S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚),有串口控制器 (接有TXD RXD引脚)。

    韦东山
  • 详解 Java 对象与内存控制(下)

    以上程序说明:sub、mid和base这3个变量指向的Java对象拥有3个count实例变量,也就是说,需要3块内存来存储它们 当Sub sub = new ...

    CoderJed
  • 详解 Java 对象与内存控制(上)

    不管是类变量还是实例变量,你都不能引用一个还没有定义的变量,或者在引用之前没有定义的变量,如下图所示:

    CoderJed
  • 028. RabbitMQ 持久化机制、内存磁盘控制

    山海散人
  • 白话Elasticsearch52-深入聚合数据分析之fielddata内存控制、circuit breaker短路器、fielddata filter、预加载机制以及序号标记预加载

    fielddata加载到内存的过程是lazy加载的,对一个analzyed field执行聚合时,才会加载,而且是field-level加载的.

    小小工匠
  • 基于FPGA的内存128M flash芯片控制器设计

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。...

    FPGA技术江湖
  • Zynq:用PS控制DDR3内存读写

    本篇文章的目的主要用简明的方法对DDR3进行读写,当然这种方式每次读写都需要CPU干预,效率是比较低的,但是这是属于学习的过程,还是可以经历经历的。

    FPGA技术江湖
  • MYSQL 内存机制分析与监控

    种数据库都有它自己的内存机制,如果说汽车的三大件,发动机,变速箱,底盘。数据库的内存机制算是数据库核心的核心,一个没有好的内存管理和分配的数据库,一定是不会有好...

    AustinDatabases
  • Linux 内存管理的水位控制

    在讲分区页框分配器分配内存的时候,进入伙伴算法前用函数zone_watermark_fast(),来根据水位来判断当前内存情况。内存够的话采用伙伴算法分配,不够...

    刘盼
  • Matrix-iOS 内存监控

    FOOM(Foreground Out Of Memory),是指App在前台因消耗内存过多引起系统强杀。对用户而言,表现跟crash一样。Facebook早在...

    微信终端开发团队
  • zabbix监控jvm内存

    Zabbix自带监控系统的内存利用率和CPU利用率,但是系统内存并不能反应JVM内存情况

    陈灬大灬海
  • filter控制缓存WebCache

    上篇文章简述了一下使用Filter对url进行控制,这篇文章说一下缓存的控制。当然了以此类推的可以得到filter还可以对其他的内容进行控制,比如以前写的《通过...

    the5fire
  • HTTP之缓存控制

    http://www.nirsoft.net/utils/chrome_cache_view.html

    Ashen
  • iOS微信内存监控

    本文介绍如何实现离线化的内存监控工具,用于 App 上线后发现内存问题。

    WeTest质量开放平台团队
  • iOS微信内存监控

    目前iOS主流的内存监控工具是Instruments的Allocations,但只能用于开发阶段。本文介绍如何实现离线化的内存监控工具,用于App上线后发现内存...

    WeTest质量开放平台团队

扫码关注云+社区

领取腾讯云代金券