Skip to content

nuxt build requires ~100× data size in heap memory with large type: 'data' JSON collection #3815

Description

@demhan-gh

Environment

Operating system macOS 25.3.0
CPU Apple M2 Max (12 cores)
Node.js version v22.22.0
nuxt/cli version 3.35.2
Package manager npm@10.9.4
Nuxt version 4.4.8
Nitro version 2.13.4
Builder vite@7.3.5
Config app, compatibilityDate, content, css, devServer, devtools, icon, modules, pinia, postcss, router, runtimeConfig, spaLoadingTemplate, ssr, vite
Modules @vueuse/nuxt@14.3.0, @nuxt/icon@1.15.0, @nuxt/content@3.14.0, @nuxt/fonts@0.14.0, @pinia/nuxt@0.11.3

Version

v3.1.4

Reproduction

https://github.com/demhan-gh/nuxt-content-memory-repro

Description

nuxt build requires 12GB of heap (--max-old-space-size=12288) to successfully build a project with a single type: 'data' collection of 14,373 JSON files. The total raw content on disk is 134MB and the final build output is 80MB. The required heap is therefore approximately 90× the raw data size and 150× the output size.
This memory requirement grows linearly with collection size and has increased over time as the collection has grown, requiring heap increases first to 8GB and then to 12GB. The build throws an OOM error while prerendering the sqldump.txt file

Collection configuration
// content.config.ts
defineCollection({
type: 'data',
source: 'dollar10/*.json',
schema: z.object({
gid: z.string(),
subject: z.string(),
email: z.string(),
sender: z.string(),
datetime: z.string(),
date: z.string(),
text: z.string(),
md: z.string(),
html: z.string(),
thumbnail: z.string()
})
})

// nuxt.config.ts
content: {
experimental: {
sqliteConnector: 'native',
},
}

Collection data profile
Files: 14,373 JSON files
Field sizes (averages across full collection):
text: avg=4.3KB total=60MB
md: avg=2.6KB total=37MB
thumbnail: avg=2.0KB total=28MB (base64 WebP, 128px wide)
other fields: avg=0.6KB total=9MB
──────────────────────────────────────
Total raw: 134MB
Build output (.output): 80MB
Required heap: 12,288MB (~12GB)

To reproduce
Create a collection of ~14,000 JSON files with type: 'data' totalling ~130MB raw
Configure sqliteConnector: 'native'
Run nuxt build without --max-old-space-size — process OOMs
Build only succeeds with NODE_OPTIONS=--max-old-space-size=12288

Expected behavior
Building a 134MB data collection should not require 12GB of heap. A reasonable expectation for a streaming/batched ingestion pipeline would be 2–4× the data size at most.

Additional context

Logs

(from minimal reproduction)
> build
> nuxt build

┌  Building Nuxt for production...
│
●  Nuxt 4.4.8 (with Nitro 2.13.4, Vite 7.3.6 and Vue 3.5.39)
[@nuxt/content] ✔ Processed 2 collections and 14000 files in 1241.50ms (14000 cached, 0 parsed)
│
●  Nitro preset: node-server
[nuxt] ℹ Compiled content/database.compressed.mjs in 1207.86ms
ℹ Building client...
ℹ vite v7.3.6 building client environment for production...

 WARN  [plugin nuxt:module-preload-polyfill] Sourcemap is likely to be incorrect: a plugin (nuxt:module-preload-polyfill) was used to transform files, but didn't generate a sourcemap for the transformation. Consult the plugin documentation for help

ℹ transforming...
ℹ ✓ 160 modules transformed.
ℹ rendering chunks...
ℹ computing gzip size...
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/manifest.json                  11.43 kB │ gzip:  0.99 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/ProsePre.D5orA6B_.css     0.03 kB │ gzip:  0.05 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/error-500.BW0Y54Of.css    1.91 kB │ gzip:  0.73 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/error-404.C3kT2QX-.css    2.43 kB │ gzip:  0.85 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/entry.Dlba8ao-.css        6.95 kB │ gzip:  1.66 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CUS2CXFy.js               0.18 kB │ gzip:  0.17 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/8ym2NSa7.js               0.21 kB │ gzip:  0.19 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BipG9JOz.js               0.21 kB │ gzip:  0.19 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CNBl2Xd0.js               0.21 kB │ gzip:  0.19 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BAO_TAt-.js               0.21 kB │ gzip:  0.19 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DCKcajHj.js               0.21 kB │ gzip:  0.19 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DsvUAKN5.js               0.21 kB │ gzip:  0.19 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/95EGDPbW.js               0.21 kB │ gzip:  0.19 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/D7SMJoQb.js               0.21 kB │ gzip:  0.19 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/Ca1la6Qg.js               0.22 kB │ gzip:  0.19 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/Cs_pEJFA.js               0.22 kB │ gzip:  0.19 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CbwNvtE4.js               0.22 kB │ gzip:  0.19 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/D1sqyrpT.js               0.22 kB │ gzip:  0.20 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/D9GhGx5g.js               0.22 kB │ gzip:  0.20 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/_Gtx3mfk.js               0.23 kB │ gzip:  0.20 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/Bxqeo7A2.js               0.38 kB │ gzip:  0.27 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DGjdzDkP.js               0.41 kB │ gzip:  0.25 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/M_UpGksk.js               0.49 kB │ gzip:  0.34 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BbE3LDZM.js               0.50 kB │ gzip:  0.34 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/YEIK8sRr.js               0.50 kB │ gzip:  0.34 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DhndnzfW.js               0.50 kB │ gzip:  0.34 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CySQTevS.js               0.50 kB │ gzip:  0.34 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/Cf4X_AmA.js               0.50 kB │ gzip:  0.34 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BbyEG8XH.js               0.52 kB │ gzip:  0.34 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DRa3-N1Z.js               0.60 kB │ gzip:  0.36 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CnY5WNp9.js               3.45 kB │ gzip:  1.55 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/JOINLq1B.js               3.76 kB │ gzip:  1.71 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BxXIkSHy.js               6.09 kB │ gzip:  2.44 kB
ℹ ../node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/f4ELvqiD.js             156.44 kB │ gzip: 57.18 kB
ℹ ✓ built in 782ms
✔ Client built in 788ms
ℹ Building server...
ℹ vite v7.3.6 building ssr environment for production...
ℹ transforming...
ℹ ✓ 106 modules transformed.
ℹ rendering chunks...
ℹ ✓ built in 293ms
✔ Server built in 298ms
[nitro] ℹ Initializing prerenderer

<--- Last few GCs --->

[46444:0x140008000]    43584 ms: Mark-Compact 4041.5 (4129.2) -> 4040.8 (4129.2) MB, pooled: 0 MB, 540.17 / 0.00 ms  (average mu = 0.386, current mu = 0.274) allocation failure; scavenge might not succeed
[46444:0x140008000]    45566 ms: Mark-Compact 4056.5 (4129.2) -> 4055.9 (4161.2) MB, pooled: 0 MB, 1898.12 / 0.00 ms  (average mu = 0.154, current mu = 0.042) allocation failure; scavenge might not succeed


<--- JS stacktrace --->

FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
----- Native stack trace -----

 1: 0x106f39d78 node::OOMErrorHandler(char const*, v8::OOMDetails const&) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
 2: 0x1073f80c4 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
 3: 0x1075dc834 v8::internal::Heap::stack() [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
 4: 0x1075dadfc v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
 5: 0x1075d02e0 v8::internal::HeapAllocator::AllocateRawWithLightRetrySlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
 6: 0x1075d0a5c v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
 7: 0x1075a5580 v8::internal::FactoryBase<v8::internal::Factory>::NewRawOneByteString(int, v8::internal::AllocationType) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
 8: 0x1075b52dc v8::internal::Factory::NewStringFromUtf8(v8::base::Vector<unsigned char const>, unibrow::Utf8Variant, v8::internal::AllocationType) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
 9: 0x1074152ac v8::String::NewFromUtf8(v8::Isolate*, char const*, v8::NewStringType, int) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
10: 0x1070595b8 node::StringBytes::Encode(v8::Isolate*, char const*, unsigned long, node::encoding, v8::Local<v8::Value>*) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
11: 0x106e8ee30 node::encoding_binding::BindingData::DecodeUTF8(v8::FunctionCallbackInfo<v8::Value> const&) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
12: 0x106c870f4 Builtins_CallApiCallbackOptimizedNoProfiling [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
13: 0x10dfbaab4 
14: 0x10dfbb380 
15: 0x10d72f824 
16: 0x10df33978 
17: 0x106c81dc8 construct_stub_create_deopt_addr [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
18: 0x10d1bb980 
19: 0x10d1b987c 
20: 0x10df0e2f0 
21: 0x106cc1290 Builtins_AsyncFunctionAwaitResolveClosure [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
22: 0x106d8c4d8 Builtins_PromiseFulfillReactionJob [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
23: 0x106cb1594 Builtins_RunMicrotasks [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
24: 0x106c82af4 Builtins_JSRunMicrotasksEntry [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
25: 0x10752f948 v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
26: 0x1075302b4 v8::internal::(anonymous namespace)::InvokeWithTryCatch(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
27: 0x107530444 v8::internal::Execution::TryRunMicrotasks(v8::internal::Isolate*, v8::internal::MicrotaskQueue*) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
28: 0x10755ad2c v8::internal::MicrotaskQueue::RunMicrotasks(v8::internal::Isolate*) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
29: 0x10755b490 v8::internal::MicrotaskQueue::PerformCheckpoint(v8::Isolate*) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
30: 0x106e503ac node::InternalCallbackScope::Close() [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
31: 0x106e4fdb0 node::InternalCallbackScope::~InternalCallbackScope() [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
32: 0x106f3e5c0 node::fs::FileHandle::CloseReq::Resolve() [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
33: 0x106f590ec node::fs::FileHandle::ClosePromise()::$_0::__invoke(uv_fs_s*) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
34: 0x106f31cc8 node::MakeLibuvRequestCallback<uv_fs_s, void (*)(uv_fs_s*)>::Wrapper(uv_fs_s*) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
35: 0x1025faea0 uv__work_done [/Users/nawaazahmed/anaconda3/envs/web/lib/libuv.1.dylib]
36: 0x1025fec10 uv__async_io [/Users/nawaazahmed/anaconda3/envs/web/lib/libuv.1.dylib]
37: 0x102612efc uv__io_poll [/Users/nawaazahmed/anaconda3/envs/web/lib/libuv.1.dylib]
38: 0x1025ff288 uv_run [/Users/nawaazahmed/anaconda3/envs/web/lib/libuv.1.dylib]
39: 0x106e51020 node::SpinEventLoopInternal(node::Environment*) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
40: 0x106f83ebc node::NodeMainInstance::Run() [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
41: 0x106ef7088 node::Start(int, char**) [/Users/nawaazahmed/anaconda3/envs/web/lib/libnode.127.dylib]
42: 0x185ffdd54 start [/usr/lib/dyld]

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions