V8主要将内存分为:新生代 和 老生代。

1、新生代

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

它将堆内存一分为二,每一部分空间称为 semispace,其中一个处于使用状态(from 空间),另一个处于闲置状态(to 空间)

内存限制:64位系统 和 32位系统分别为 32M 和 16 M (from 和 to 空间各占一半)

对于新对象,将从 from 空间中进行分配内存 。

垃圾回收策略:Scavenge 算法

首先检查from空间,将存活对象复制到 to 空间,非存活对象将会被释放。完成复制后,from 空间和 to 空间角色发生转换。新对象始终从 from 空间中分配内存,to空间为闲置。

当再次进行垃圾回收时,也会执行和第一次同样的复制操作,如果存在以下两种情况之一,存活对象会被复制到老生代空间中,这个过程称为 对象晋升。

  • 存活对象已经经历过一次Scavenge 回收
  • to 空间内存占用比例超过 25% (保证新对象有足够的内存可用)

2、老生代

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

内存限制:64位系统 和 32位系统分别为 1400M 和 700 M

垃圾回收策略:Mark-Sweep (标记清除)  、Mark-Compact (标记整理)

Mark-Sweep 分为标记 和清除 两个阶段 。

Mark-Sweep 在标记阶段,遍历堆中的所有对象,并标记活着的对象,在清理阶段,只清除没有标记的对象。

Mark-Sweep 内存碎片问题:进行一次标记清除后,内存空间会出现不连续的状态。这种内存碎片会对后续的内存分配造成问题 。

为了解决这个问题,Mark-Copact被提出来,它和 Mark-Sweep 的区别在于对象在标记死亡后,在整理过程中,将活着的对象往一端移动,移动完成后,直接清理掉边界外的内存。

3、三种回收策略比较

从图中可以看出,在Mark-Sweep 和 Mark-Copact 之间,由于Mark-Copact需要移动对象,所以它的执行速度不能很快。

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

4、垃圾回收引起的性能问题

为了避免出现JavaScript应用逻辑 与 垃圾回收器 产生冲突,垃圾回收的 3 种基本算法都需要将应用逻辑暂停下来,待执行垃圾回收后再恢复执行应用逻辑,这种行为被称为 全停顿 。

按官方说法,以1.5G的垃圾回收堆内存为例,V8做一次小的垃圾回收需要50ms以上,做一次非增量式垃圾回收甚至需要1s以上。这是垃圾回收中引起的 JavaScript 线程暂停执行时间,在这样的时间花销下,应用性能和响应能力都会直线下降。

在 V8 的分代式垃圾回收中,一次小垃圾回收只收集新生代,由于新生代默认配置的较小,且其中活动对象通常较少,所以,即便它是全停顿的影响也不大。

但 V8 的老生代通常配置较大,且存活对象较多,全堆垃圾回收的标记、清理、整理等动作造成的停顿就会比较严重。

为降低全堆垃圾回收带来的停顿时间,V8做了以下改善措施:

【1】限制堆内存大小

  • 新生代:64位系统 和 32位系统分别为 32M 和 16 M (from 和 to 空间各占一半)
  • 老生代:64位系统 和 32位系统分别为 1400M 和 700 M

【2】增量式垃圾回收

V8 先从标记阶段入手,将原来一口气停顿完成的动作改为增量标记(Incremental Marking),也就是拆分为许多小 步进,每做完一 步进,就让JavaScript应用逻辑执行一小会儿,垃圾回收与应用逻辑交替执行直到标记阶段完成。V8后续还引入Lazy Sweep(延迟清除)、Incremental Compaction (增量式整理),让清理与整理动作也变成增量式的。同时还计划引入并行标记与并行整理,进一步利用多核性能降低每次停顿的时间。

5、垃圾回收的触发条件

  • 作用域: 能形成作用域的函数调用、with 以及全局作用域。
  • 闭包:    V8无法主动回收内存中的闭包引用和全局变量引用。

6、内存泄漏

通常,造成内存泄漏的原因有如下几个:

  • 队列消费不及时
  • 作用域未释放

V8 内存控制的更多相关文章

  1. 《深入浅出Node.js》第5章 内存控制(未完)

    @by Ruth92(转载请注明出处) 第5章 内存控制 基于无阻塞.事件驱动建立的 Node 服务,具有内存消耗低的优点,非常适合处理海量的网络请求. 内存控制正是在海量请求和长时间运行的前提下进行 ...

  2. 【读书笔记】《深入浅出nodejs》第五章 内存控制

    海量请求+长时间运行 -> 内存控制 -> 一切资源高效循环利用 1. V8的垃圾回收机制与内存限制 在Node中通过JavaScript使用内存时,只能使用部分内存(64位系统下约1.4 ...

  3. V8 内存管理和垃圾回收机制总结

    这篇文章主要介绍 V8 的内存管理和垃圾回收知识. V8 内存管理及垃圾回收机制浅析 由于 V8 引擎的原因,Node 在操作大内存对象时受到了一些限制,在 64 位的机器上,默认最大操作的对象大小约 ...

  4. 《疯狂Java:突破程序员基本功的16课》读书笔记-第二章 对象与内存控制

    Java内存管理分为两个方面:内存分配和内存回收.这里的内存分配特指创建Java对象时JVM为该对象在堆内存中所分配的内存空间.内存回收指的是当该Java对象失去引用,变成垃圾时,JVM的垃圾回收机制 ...

  5. RabbitMQ 内存控制 硬盘控制

    RabbitMQ服务器在启动时以及abbitmqctl set_vm_memory_high_watermark fraction 执行时,会检查计算机的RAM总大小. 默认情况下下, 当 Rabbi ...

  6. 归纳整理Linux下C语言常用的库函数----字符串转换、字符测试、及内存控制

    在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...

  7. Java 对象及其内存控制

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 更新:其实这里有好多的变戏法,只要你理解了他们在JVM的中的实现机制,就豁然开朗了.有时间我会把这些变戏法的东西 ...

  8. Android内存控制小技巧-使用矢量图来节省你的内存并简化你的开发。

    先上一个 位图和矢量图的 说明.http://zhidao.baidu.com/link?url=xwvs5CBzWeh15O3Ee4bICwCqg4PCQWwg5oZ0a6CVydbVZzufqrI ...

  9. (二)Java对象与内存控制

    一.java的类变量和实例变量: java中的变量可分成两种:成员变量和局部变量. 1.局部变量包括以下几类: 方法内的局部变量:作用域为方法体. 代码块内的局部变量:作用域为代码块 形参:方法内的形 ...

随机推荐

  1. 使用Jenkins进行持续集成ionic3项目

    Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.  网上大多数是关于.net web网站以及 ...

  2. zabbix的Java API(一)

    上文说了,我是对zabbix做第二次开发的小白,既然要对zabbix做第二次开发又是小白,那么就得来研究zabbix提供的相关API了. 于是我在zabbix网站各种找,终于在下面网址找到了: htt ...

  3. Python开发【笔记】:单线程下执行多个定时任务

    单线程多定时任务 前言:公司业务需求,实例当中大量需要启动定时器的操作:大家都知道python中的定时器用的是threading.Timer,每当启动一个定时器时,程序内部起了一个线程,定时器触发执行 ...

  4. (转)mq经验总结-转

    场景:学习mq相关的知识,发现这是一篇总结性很强的文章,转过来学习学习! 1 mq经验总结 首先了解什么是mq?mq的作用是什么? mq是通讯中间件.他的作用是省去开发人员开发通讯工具的时间,节省开发 ...

  5. (转) Spring Boot JDBC 连接数据库

    文本将对在Spring Boot构建的Web应用中,基于MYSQL数据库的几种数据库连接方式进行介绍. 包括JDBC.JPA.MyBatis.多数据源和事务. 1 JDBC 连接数据库 1.1 属性配 ...

  6. React 实践项目 (五)

    React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...

  7. ctf中常见注入题源码及脚本分析

    1.代码审计发现 这里没有用escape_string,因此存在注入. function show($username){ global $conn; $sql = "select role ...

  8. Filter ,Interceptor,AOP

    一.Filter: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  9. LoadRunner性能测试-loadrunner事务

    事务(Transaction): 简单来说就是用来模拟用户的一个相对完整的业务过程.添加事务,是用来衡量响应时间的重要方法.我们可以通过事务计时来对不同压力负载下的性能指标进行对比. 插入事务的方法: ...

  10. Tornado-StaticFileHandler参考

    StaticFileHandler ====== tornado.web.StaticFileHandler 源代码中的解释 class StaticFileHandler(RequestHandle ...