From 8753e73709a889c8188387255bb7b33934327178 Mon Sep 17 00:00:00 2001 From: Ricardo Date: Mon, 9 Mar 2026 16:44:33 +0100 Subject: [PATCH] feat: add V8 heap space diagnostics to post-build GC hook After GC, logs heap space breakdown (old_space, large_object_space, etc.) to help identify memory consumers. Supports HEAP_SNAPSHOT=1 env var to write a heap snapshot to /tmp for detailed analysis. Confab-Link: http://localhost:8080/sessions/edb1b7b0-da66-4486-bd9c-d1cfa7553b88 --- eleventy.config.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/eleventy.config.js b/eleventy.config.js index f1c5924..6e3fa9a 100644 --- a/eleventy.config.js +++ b/eleventy.config.js @@ -1344,6 +1344,31 @@ export default function (eleventyConfig) { const after = process.memoryUsage(); const freed = ((before.heapUsed - after.heapUsed) / 1024 / 1024).toFixed(0); console.log(`[gc] Post-build GC freed ${freed} MB (heap: ${(after.heapUsed / 1024 / 1024).toFixed(0)} MB)`); + + // Log V8 heap space breakdown for memory investigation + try { + const v8 = await import("node:v8"); + const spaces = v8.getHeapSpaceStatistics(); + console.log(`[gc] Heap spaces after GC:`); + for (const s of spaces) { + const usedMB = (s.space_used_size / 1024 / 1024).toFixed(1); + if (s.space_used_size > 1024 * 1024) { + console.log(`[gc] ${s.space_name}: ${usedMB} MB`); + } + } + + // Write heap snapshot to /tmp if HEAP_SNAPSHOT=1 is set + if (process.env.HEAP_SNAPSHOT === "1") { + const filename = `/tmp/eleventy-heap-${Date.now()}.heapsnapshot`; + console.log(`[gc] Writing heap snapshot to ${filename}...`); + v8.writeHeapSnapshot(filename); + console.log(`[gc] Snapshot written`); + // Only take one snapshot, then unset + delete process.env.HEAP_SNAPSHOT; + } + } catch (e) { + console.log(`[gc] Heap stats unavailable: ${e.message}`); + } } // WebSub hub notification — skip on incremental rebuilds