← 返回目录

第 7 卷

第 7 / 10 卷日期:

14setTimeout(() => {//宏任务(timers阶段)
15console.log('宏任务setTimeout');// 5.执行宏任务
16}, 0);

17 18console.log('同步任务2'); // 同步任务,立即执行

19 20// 最终执行结果:

21// 同步任务1 → 同步任务2 → nextTick1 → nextTick2 → 普通微任务Promise → 宏任务 setTimeout

process.nextTick的使用场景与注意事项

  • 适用场景
  1. 确保回调函数在当前同步任务执行完后,立即执行(如修改全局变量后,立即执行依赖该变量的回

调);

  1. 解决异步回调的执行顺序问题,强制插队执行;
  2. 避免I/O操作的延迟,提升执行效率。
  • 注意事项(禁止滥用)
  1. 避免递归调用process.nextTick(),会导致nextTick队列无限循环,阻塞事件循环,无法执行宏任

务和普通微任务;

  1. nextTick队列执行耗时过长,会阻塞I/O操作和定时器,影响服务性能;
  2. 优先使用 queueMicrotask()(ES6标准微任务)替代,兼容性更好,避免Node.js专属API的

耦合。

核心总结

process.nextTick() 是Node.js微任务的最高优先级,执行顺序:

同步任务 > process.nextTick() > 普通微任务(Promise) > 宏任务。

  1. 什么是垃圾回收机制,并且它是如何在现代编程语言中管理内存的?

垃圾回收机制(Garbage Collection,GC)的定义

垃圾回收机制是编程语言的自动内存管理技术,由垃圾回收器自动完成内存分配、内存使用、内存回收的全流程,无需开发者手动申请/释放内存,解决内存泄漏、内存溢出问题,提升开发效率,降低内

计算机内存是有限资源,程序运行时会申请内存存储数据(变量、对象、函数),若数据不再使用,内存未及时释放,会导致:

  1. 内存泄漏:无用内存持续占用,内存占用率越来越高,程序运行变慢;
  2. 内存溢出:内存占用超过系统分配的上限,程序崩溃;
  3. 手动管理风险:C/C++需手动 malloc() 申请、 free() 释放内存,易出现忘记释放、重复释

放、野指针等问题。

垃圾回收机制的核心原理

  1. 内存分配:程序创建变量/对象时,垃圾回收器自动向操作系统申请内存,分配给对应数据;
  2. 可达性分析:垃圾回收器定期扫描内存中的数据,判断数据是否可达(是否有引用指向该数据);
  • 可达对象:有变量/函数/对象引用,仍在使用,需保留内存;
  • 垃圾对象:无任何引用指向,不再使用,标记为垃圾,等待回收;
  1. 垃圾回收:垃圾回收器释放垃圾对象的内存,将内存归还给操作系统,供后续数据使用;
  2. 内存碎片整理:回收内存后,整理内存空间,减少内存碎片,提升内存分配效率。

现代编程语言中GC的核心实现方式(3种主流)

  • 1. 引用计数法(Reference Counting)

原理

为每个内存对象维护一个引用计数器,记录对象被引用的次数:

  • 对象被创建/引用时,计数器**+1**;
  • 对象的引用被销毁/赋值时,计数器**-1**;
  • 计数器为0时,标记为垃圾,立即回收内存。

优点

  • 回收及时,计数器为0时立即回收,无内存占用延迟;
  • 实现简单,垃圾回收器逻辑轻量。

缺点

  • 无法解决循环引用问题:两个对象互相引用,计数器永远不为0,无法回收,导致内存泄漏;
  • 计数器的增减操作有性能开销,高并发场景影响效率;
  • 频繁回收小对象,导致内存碎片增多。

原理(GC的基础算法,主流语言核心)

分为标记阶段和清除阶段,基于可达性分析实现,解决循环引用问题:

  1. 标记阶段:从根对象(如JS的全局对象、Java的GC Roots)出发,递归扫描所有可达对象,标记

为「存活对象」;

  1. 清除阶段:扫描整个内存空间,将未被标记的「垃圾对象」的内存释放,归还给操作系统;
  2. 可选:整理阶段:将存活对象移动到内存连续区域,减少内存碎片(标记-整理法 Mark-

Compact)。

优点

  • 解决循环引用问题:循环引用的对象无根引用,会被标记为垃圾,正常回收;
  • 适用场景广,支持复杂数据结构(对象、数组、链表);
  • 性能优于引用计数法,回收频率可控。

缺点

  • 标记/清除阶段会暂停程序执行(STW:Stop The World),导致程序卡顿,大内存场景更明显;
  • 清除后产生内存碎片,连续内存不足时,需整理内存,增加开销。

应用语言

JavaScript(V8引擎)、Java(HotSpot引擎)、Go、Python(现代版本)。

  • 3. 分代回收法(Generational GC)

原理(现代GC的主流优化方案,基于标记-清除法升级)

根据对象的存活时间,将内存分为新生代和老生代,对不同代采用不同的回收策略,提升回收效率:

  1. 新生代(Young Generation):存储存活时间短的对象(如临时变量、局部对象),特点是创建

快、销毁快,占用内存小;

◦ 回收策略:复制算法(Copying),将新生代分为2个相等区域,存活对象复制到空闲区域,直

接清空原区域,无内存碎片,回收速度极快;

  1. 老生代(Old Generation):存储存活时间长的对象(如全局变量、常驻内存的对象),特点是创

建少、销毁慢,占用内存大;

  • 回收策略:标记-清除法/标记-整理法,减少复制开销,兼顾回收效率和内存碎片;
  1. 回收频率:新生代回收频率高(毫秒级),老生代回收频率低(秒/分钟级),降低STW卡顿。
全站分卷索引 · 10 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷