diff --git a/lib/internal/perf/observe.js b/lib/internal/perf/observe.js index 4d71666882a3ba..c96925c723f64e 100644 --- a/lib/internal/perf/observe.js +++ b/lib/internal/perf/observe.js @@ -72,6 +72,8 @@ const kDeprecationMessage = const kTypeSingle = 0; const kTypeMultiple = 1; +let gcTrackingInstalled = false; + const kSupportedEntryTypes = ObjectFreeze([ 'function', 'gc', @@ -124,8 +126,11 @@ function maybeIncrementObserverCount(type) { if (observerType !== undefined) { observerCounts[observerType]++; - if (observerType === NODE_PERFORMANCE_ENTRY_TYPE_GC) + if (!gcTrackingInstalled && + observerType === NODE_PERFORMANCE_ENTRY_TYPE_GC) { installGarbageCollectionTracking(); + gcTrackingInstalled = true; + } } } diff --git a/test/parallel/test-performanceobserver-gc.js b/test/parallel/test-performanceobserver-gc.js new file mode 100644 index 00000000000000..fe9397631c2d42 --- /dev/null +++ b/test/parallel/test-performanceobserver-gc.js @@ -0,0 +1,17 @@ +'use strict'; + +require('../common'); + +// Verifies that setting up two observers to listen +// to gc performance does not crash. + +const { + PerformanceObserver, +} = require('perf_hooks'); + +// We don't actually care if the callback is ever invoked in this test +const obs = new PerformanceObserver(() => {}); +const obs2 = new PerformanceObserver(() => {}); + +obs.observe({ type: 'gc' }); +obs2.observe({ type: 'gc' });