JavaScript中的垃圾收集

  • 程序的运行需要内存。
  • javaScript使用自动内存管理,这被称为“垃圾回收机制”。
  • 优点是可以简化开发、节省代码
  • 缺点是无法完整的掌握内存的分配与回收的具体过程

NodeJS中的内存管理

  • 网页端的内存泄露
  • 对于持续运行的服务进程Node服务器端程序,必须及时释放不再用到的内存。否则内存占用越来越高, 轻则影响系统性能,重则导致进程崩溃。
  • 如果不再用到的内存没有及时释放,就叫做内存泄露。

V8内存管理

1. v8内存限制

  • 在62位操作系统可以使用1.4G内存
  • 在32位操作系统中可以使用0.7G内存

2. V8内存管理

  • Js对象都是通过V8进行分配管理内存的

  • process.memoryUsage返回一个对象,包含了Node进程的内存占用信息。

  • rss(resident set size):所有内存占用, 包括指令区和堆栈。

  • heapTotal: “堆”占用的内存,包括用到的和没用到的。

  • heapUsed:用到的堆的部分,判断内存泄露,以heapUsed字段为准。

  • external: V8引擎内部的C++对象占用的内存

3.为何限制内存大小

  • 因为V8的垃圾收集工作原理导致的,1.4G内存完成一次垃圾收集需要1S以上
  • 这个暂停时间成为 stop the world, 在这个期间,应用的性能和响应能力都会下降。

4. 如何打开内存内存限制

  • 一旦初始化成功, 生效后不能再修改
  • -max-new-space-size, 最大new space大小,执行scavenge回收,默认16M,单位KB
  • -max-old-space-size, 最大old space大小,执行MarkSweep回收,默认1M,单位MB

node --max-old-space-size=2000 单位是M

V8垃圾回收机制

  • V8是基于分代的垃圾回收。
  • 不同代的垃圾回收机制也不一样
  • 按存活时间分为新生代和老生代

1. 分代

  • 年龄小的是新生代,由From区域和To区域两个区域组成:
    在64位系统里,新生代内存是32M,From区域和To区域各占用16M
    在32位系统里,新生代内存是16M,From区域和To区域各占用8M

  • 年龄大的是老生代,默认情况下,
    64为系统下老生代内存是1400M
    32为系统下老生代内存是700M

分代示意图

2. 引用计数

  • 语言引擎有一张引用表,保存了内存里面所有的资源的引用次数。
  • 如果一个值的引用次数是0,就表示这个值不再用到了,因此可以将这块内存释放。

3,新生代垃圾回收

  • 新生代区域一分为二,每个16M,一个使用,一个空闲
  • 开始垃圾回收的时候,会检查FROM区域中的存活对象,如果还活着,拷贝到TO空间,完成后释 放空间
  • 完成后 FROM 和 TO 互换
  • 新生代扫描的时候是一种广度优先的扫描策略
  • 新生代的空间小,存活对象少
  • 当一个对象经历过多次的垃圾回收依然存活的时候,生存周期比较长的对象会被移动到老生代, 这个移动过程被成为晋升或者升级:
    经过5次以上的回收还存在
    TO的空间使用占比超过25%,或者超大对象



4.老生代

  • mark-sweep(标记清除) mark-compact(标记整理)
  • 老生代空间大,大部分都是活着的对象,GC耗时比较长
  • 在GC期间无法响应,STOP-THE-WORLD
  • V8有一个优化方案,增量处理,把一个大暂停换成多个小暂停 INCREMENT-GC

mark-sweep(标记清除)

  • 标记活着的对象,随后清除在标记阶段没有标记的对象,只清理死亡对象
  • 问题在于清除后会出现内存不连续的情况,这种内存碎片会对后续的内存分配产生影响
  • 如果要分配一个大对象,碎片空间无法分配

mark-compact(标记整理)

  • 标记死亡后会对对象进行整理,活着的对象向左移动,移动完成后直接清理掉边界外的内存

incremental marking 增量标记

  • 以上三种回收时都需要暂停程序执行,收集完成后才能恢复, STOP-THE-WORLD 在新生代影响 不大,但是老生代影响就非常大了
  • 增量标记就是把标记改为了增量标记,把一口气的停顿拆分成了多个小步骤,做完一步程序运行 一会儿,垃圾回收和应用程序运行交替进行,停顿时间可以减少到1/6左右 包括垃圾回收的占用时间
3种垃圾回收算法对比
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • JavaScript具有自动垃圾回收机制,垃圾回收机制会按照固定的时间间隔周期性地执行这一操作,垃圾回收机制必须跟...
    baiying阅读 1,111评论 0 1
  • 一、引言 JavaScript具有自动垃圾收集机制,即执行环境会负责管理代码执行过程中使用的内存。 垃圾收集机制的...
    清儿阿阅读 2,312评论 0 0
  • 1.哪些内存需要回收 程序计数器,虚拟机栈,本地方法栈随线程而生随线程而灭。栈中栈帧随着方法的调用与执行完毕而入栈...
    sizuoyi00阅读 3,401评论 0 1
  • JVM 垃圾回收器分类 新生代串行收集器 串行收集器主要有两个特点:第一,它仅仅使用单线程进行垃圾回收;第二,它独...
    AlanKim阅读 4,865评论 0 1
  • 查看垃圾回收器: 我们知道JVM分Client 和 Server模式。如果启动JVM不指定模式,JDK会根据当前的...
    xuxw阅读 3,226评论 0 0