From eca8baf8ed280295d46f8d81d2f8672424fbf5ce Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Tue, 21 Jul 2026 08:58:42 +0800 Subject: [PATCH 1/3] v8, perf: Reduce v8 GC hint frequency. We currently send a memoryPressureNotification every second during a run. This can put too much pressure on v8, manifesting as high CPU usage particularly on complex pages. This commit changes it to every 5 seconds. Also, remove unused lowMemoryNotification.v8, perf: Reduce v8 GC hint frequency. --- src/browser/Runner.zig | 2 +- src/browser/js/Env.zig | 14 -------------- src/browser/js/Isolate.zig | 4 ---- 3 files changed, 1 insertion(+), 19 deletions(-) diff --git a/src/browser/Runner.zig b/src/browser/Runner.zig index bf11efb82..03ebe3069 100644 --- a/src/browser/Runner.zig +++ b/src/browser/Runner.zig @@ -121,7 +121,7 @@ fn _wait(self: *Runner, comptime is_cdp: bool, timeout_ms: u32, conditions: []Wa // alive for seconds while running heavy JS accumulates wrappers and // external-ref'd Zig allocations V8 has no reason to drop. `.moderate` // speeds up incremental GC without stalling the tick. - const gc_hint_period_ns: u64 = std.time.ns_per_s; + const gc_hint_period_ns: u64 = std.time.ns_per_s * 5; var gc_hint_timer = std.time.Timer.start() catch unreachable; while (true) { diff --git a/src/browser/js/Env.zig b/src/browser/js/Env.zig index e0dbc5cde..238fba541 100644 --- a/src/browser/js/Env.zig +++ b/src/browser/js/Env.zig @@ -501,19 +501,6 @@ pub fn runIdleTasks(self: *const Env) void { v8.v8__Platform__RunIdleTasks(self.platform.handle, self.isolate.handle, 1); } -// V8 doesn't immediately free memory associated with -// a Context, it's managed by the garbage collector. We use the -// `lowMemoryNotification` call on the isolate to encourage v8 to free -// any contexts which have been freed. -// This GC is very aggressive. Use memoryPressureNotification for less -// aggressive GC passes. -pub fn lowMemoryNotification(self: *Env) void { - var handle_scope: js.HandleScope = undefined; - handle_scope.init(self.isolate); - defer handle_scope.deinit(); - self.isolate.lowMemoryNotification(); -} - // V8 doesn't immediately free memory associated with // a Context, it's managed by the garbage collector. We use the // `memoryPressureNotification` call on the isolate to encourage v8 to free @@ -521,7 +508,6 @@ pub fn lowMemoryNotification(self: *Env) void { // The level indicates the aggressivity of the GC required: // moderate speeds up incremental GC // critical runs one full GC -// For a more aggressive GC, use lowMemoryNotification. pub fn memoryPressureNotification(self: *Env, level: Isolate.MemoryPressureLevel) void { var handle_scope: js.HandleScope = undefined; handle_scope.init(self.isolate); diff --git a/src/browser/js/Isolate.zig b/src/browser/js/Isolate.zig index fcb8eeadb..61cf3cb43 100644 --- a/src/browser/js/Isolate.zig +++ b/src/browser/js/Isolate.zig @@ -41,10 +41,6 @@ pub fn exit(self: Isolate) void { v8.v8__Isolate__Exit(self.handle); } -pub fn lowMemoryNotification(self: Isolate) void { - v8.v8__Isolate__LowMemoryNotification(self.handle); -} - pub const MemoryPressureLevel = enum(u32) { none = v8.kNone, moderate = v8.kModerate, From aa4323f72b0e8fb600c08874cb8c7af8f88a2abd Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Tue, 21 Jul 2026 10:06:42 +0800 Subject: [PATCH 2/3] experiment: On session teardown, use less aggressive v8 GC hint critical -> moderate --- src/browser/Session.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/Session.zig b/src/browser/Session.zig index f0027fab0..5a7bbf663 100644 --- a/src/browser/Session.zig +++ b/src/browser/Session.zig @@ -190,7 +190,7 @@ pub fn deinit(self: *Session) void { self.cookie_jar.deinit(); - self.browser.env.memoryPressureNotification(.critical); + self.browser.env.memoryPressureNotification(.moderate); self.storage_shed.deinit(self.browser.app.allocator); self.idb.deinit(); From 69b3424b9c720f3fb4709b5069cba13936cd17d6 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Tue, 21 Jul 2026 10:34:01 +0800 Subject: [PATCH 3/3] Revert "experiment: On session teardown, use less aggressive v8 GC hint" This reverts commit aa4323f72b0e8fb600c08874cb8c7af8f88a2abd. --- src/browser/Session.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/Session.zig b/src/browser/Session.zig index 5a7bbf663..f0027fab0 100644 --- a/src/browser/Session.zig +++ b/src/browser/Session.zig @@ -190,7 +190,7 @@ pub fn deinit(self: *Session) void { self.cookie_jar.deinit(); - self.browser.env.memoryPressureNotification(.moderate); + self.browser.env.memoryPressureNotification(.critical); self.storage_shed.deinit(self.browser.app.allocator); self.idb.deinit();