NodeJS GC操作类型详解:detail.kind含义及duration疑问
Node.js
perf_hooks GC 相关数据详解 1. detail.kind 的含义
detail.kind 是 PerformanceEntry 对象中标识本次垃圾回收具体类型的数值字段,它的取值对应 perf_hooks.constants 里的GC类型常量,通过对比这个数值就能判断当前GC属于哪一类操作。
2. perf_hooks.constants 中四种GC类型的具体定义
perf_hooks.constants 提供了四个用于区分GC类型的常量,具体说明如下:
PERFORMANCE_GC_MAJOR: 全量标记-清除GC,针对老生代内存回收。这类GC会扫描整个堆内存,回收不再使用的对象,耗时通常较长,会造成明显的事件循环阻塞。PERFORMANCE_GC_MINOR: 新生代Scavenge GC,仅处理新生代内存区域。新生代对象生命周期短,这类GC速度快、触发频率高,阻塞时间极短。PERFORMANCE_GC_INCREMENTAL: 增量式GC,把原本一次性完成的全量GC拆分成多个小步骤执行。每次只执行一小部分回收逻辑,穿插在事件循环间隙中,大幅降低单次GC的阻塞时间。PERFORMANCE_GC_WEAKCB: 弱引用回调处理GC,专门清理WeakMap、WeakSet等弱引用结构中已失效的引用触发的GC操作,通常耗时很短。
3. duration 是否代表GC操作的执行时长
是的,duration 字段准确记录了本次GC从启动到完成的总耗时,单位为毫秒(ms)。这个数值直接反映单次GC对应用程序性能的影响——数值越大,说明GC阻塞事件循环的时间越长。
示例代码:监听GC事件并解析数据
const { performance, PerformanceObserver, constants } = require('perf_hooks'); // 创建GC观察者 const gcObserver = new PerformanceObserver((entryList) => { entryList.getEntries().forEach(entry => { let gcType; switch (entry.detail.kind) { case constants.PERFORMANCE_GC_MAJOR: gcType = '全量老生代GC'; break; case constants.PERFORMANCE_GC_MINOR: gcType = '新生代Scavenge GC'; break; case constants.PERFORMANCE_GC_INCREMENTAL: gcType = '增量式GC'; break; case constants.PERFORMANCE_GC_WEAKCB: gcType = '弱引用清理GC'; break; default: gcType = '未知类型GC'; } console.log(`[GC事件] 类型: ${gcType}, 耗时: ${entry.duration.toFixed(2)}ms`); }); }); // 启动监听 gcObserver.observe({ entryTypes: ['gc'] });
内容的提问来源于stack exchange,提问作者great programmer
相关产品推荐
相关产品推荐

