首页 技术 正文
技术 2022年11月19日
0 收藏 952 点赞 4,155 浏览 1622 个字

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、内存泄漏

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

  • 队列消费不及时
  • 作用域未释放
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,493
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295