diff --git a/doc/api/perf_hooks.md b/doc/api/perf_hooks.md index 61634056679062..fbd1d2e08a8c30 100644 --- a/doc/api/perf_hooks.md +++ b/doc/api/perf_hooks.md @@ -643,6 +643,7 @@ The value may be one of: * `perf_hooks.constants.NODE_PERFORMANCE_GC_MAJOR` * `perf_hooks.constants.NODE_PERFORMANCE_GC_MINOR` +* `perf_hooks.constants.NODE_PERFORMANCE_GC_MINOR_MARK_SWEEP` * `perf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTAL` * `perf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB` @@ -654,6 +655,7 @@ When `performanceEntry.type` is equal to `'gc'`, the * `kind` {number} One of: * `perf_hooks.constants.NODE_PERFORMANCE_GC_MAJOR` * `perf_hooks.constants.NODE_PERFORMANCE_GC_MINOR` + * `perf_hooks.constants.NODE_PERFORMANCE_GC_MINOR_MARK_SWEEP` * `perf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTAL` * `perf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB` * `flags` {number} One of: diff --git a/src/node_perf.cc b/src/node_perf.cc index e984fd4c3bf003..ca1b2eaf1c18b3 100644 --- a/src/node_perf.cc +++ b/src/node_perf.cc @@ -365,6 +365,7 @@ void CreatePerContextProperties(Local target, NODE_DEFINE_CONSTANT(constants, NODE_PERFORMANCE_GC_MAJOR); NODE_DEFINE_CONSTANT(constants, NODE_PERFORMANCE_GC_MINOR); + NODE_DEFINE_CONSTANT(constants, NODE_PERFORMANCE_GC_MINOR_MARK_SWEEP); NODE_DEFINE_CONSTANT(constants, NODE_PERFORMANCE_GC_INCREMENTAL); NODE_DEFINE_CONSTANT(constants, NODE_PERFORMANCE_GC_WEAKCB); diff --git a/src/node_perf.h b/src/node_perf.h index 79b3aaf8bb7f5f..e518ae1c33d589 100644 --- a/src/node_perf.h +++ b/src/node_perf.h @@ -63,6 +63,7 @@ inline PerformanceEntryType ToPerformanceEntryTypeEnum( enum PerformanceGCKind { NODE_PERFORMANCE_GC_MAJOR = v8::GCType::kGCTypeMarkSweepCompact, NODE_PERFORMANCE_GC_MINOR = v8::GCType::kGCTypeScavenge, + NODE_PERFORMANCE_GC_MINOR_MARK_SWEEP = v8::GCType::kGCTypeMinorMarkSweep, NODE_PERFORMANCE_GC_INCREMENTAL = v8::GCType::kGCTypeIncrementalMarking, NODE_PERFORMANCE_GC_WEAKCB = v8::GCType::kGCTypeProcessWeakCallbacks }; diff --git a/test/parallel/test-performance-gc-minor-ms.js b/test/parallel/test-performance-gc-minor-ms.js new file mode 100644 index 00000000000000..6333159f42ba2b --- /dev/null +++ b/test/parallel/test-performance-gc-minor-ms.js @@ -0,0 +1,34 @@ +// Flags: --expose-gc --no-warnings --minor-ms +'use strict'; + +// When V8's Minor Mark-Sweep collector is enabled (--minor-ms), minor garbage +// collections are reported with kind NODE_PERFORMANCE_GC_MINOR_MARK_SWEEP +// rather than NODE_PERFORMANCE_GC_MINOR. + +const common = require('../common'); +const assert = require('assert'); +const { gcUntil } = require('../common/gc'); +const { + PerformanceObserver, + constants +} = require('perf_hooks'); + +const { + NODE_PERFORMANCE_GC_MINOR_MARK_SWEEP, + NODE_PERFORMANCE_GC_FLAGS_FORCED +} = constants; + +let observed = false; +const obs = new PerformanceObserver(common.mustCallAtLeast((list) => { + const entry = list.getEntries()[0]; + assert(entry); + assert.strictEqual(entry.name, 'gc'); + assert.strictEqual(entry.entryType, 'gc'); + assert.strictEqual(entry.detail.kind, NODE_PERFORMANCE_GC_MINOR_MARK_SWEEP); + assert.strictEqual(entry.detail.flags, NODE_PERFORMANCE_GC_FLAGS_FORCED); + observed = true; + obs.disconnect(); +})); +obs.observe({ entryTypes: ['gc'] }); + +gcUntil('minor gc event', () => observed, 10, { type: 'minor' }); diff --git a/test/parallel/test-performance-gc.js b/test/parallel/test-performance-gc.js index 4fad8b5b9ff349..0c2ea201fc630a 100644 --- a/test/parallel/test-performance-gc.js +++ b/test/parallel/test-performance-gc.js @@ -11,6 +11,7 @@ const { const { NODE_PERFORMANCE_GC_MAJOR, NODE_PERFORMANCE_GC_MINOR, + NODE_PERFORMANCE_GC_MINOR_MARK_SWEEP, NODE_PERFORMANCE_GC_INCREMENTAL, NODE_PERFORMANCE_GC_WEAKCB, NODE_PERFORMANCE_GC_FLAGS_FORCED @@ -19,6 +20,7 @@ const { const kinds = [ NODE_PERFORMANCE_GC_MAJOR, NODE_PERFORMANCE_GC_MINOR, + NODE_PERFORMANCE_GC_MINOR_MARK_SWEEP, NODE_PERFORMANCE_GC_INCREMENTAL, NODE_PERFORMANCE_GC_WEAKCB, ];