@@ -259,13 +259,9 @@ void Environment::UntrackContext(Local<Context> context) {
259259 }
260260}
261261
262- void Environment::TrackShadowRealm (shadow_realm::ShadowRealm* realm) {
263- shadow_realms_.insert (realm);
264- }
265-
266- void Environment::UntrackShadowRealm (shadow_realm::ShadowRealm* realm) {
267- shadow_realms_.erase (realm);
268- }
262+ // TrackShadowRealm/UntrackShadowRealm removed - they created strong references
263+ // that prevented Shadow Realms from being garbage collected.
264+ // Fixes: https://github.com/nodejs/node/issues/47353
269265
270266AsyncHooks::DefaultTriggerAsyncIdScope::DefaultTriggerAsyncIdScope (
271267 Environment* env, double default_trigger_async_id)
@@ -1044,8 +1040,8 @@ Environment::~Environment() {
10441040 inspector_agent_.reset ();
10451041#endif
10461042
1047- // Sub- realms should have been cleared with Environment's cleanup.
1048- DCHECK_EQ (shadow_realms_. size (), 0 );
1043+ // Shadow realms are now managed via weak references and cleanup hooks,
1044+ // not tracked in a set. Fixes: https://github.com/nodejs/node/issues/47353
10491045 principal_realm_.reset ();
10501046
10511047 if (trace_state_observer_) {
@@ -2232,7 +2228,7 @@ void Environment::MemoryInfo(MemoryTracker* tracker) const {
22322228 tracker->TrackField (" timeout_info" , timeout_info_);
22332229 tracker->TrackField (" tick_info" , tick_info_);
22342230 tracker->TrackField (" principal_realm" , principal_realm_);
2235- tracker-> TrackField ( " shadow_realms " , shadow_realms_);
2231+ // shadow_realms_ removed - no longer tracking to avoid strong references
22362232
22372233 // FIXME(joyeecheung): track other fields in Environment.
22382234 // Currently MemoryTracker is unable to track these
0 commit comments