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]
Environment
macOS 25.3.0Apple M2 Max (12 cores)v22.22.03.35.2npm@10.9.44.4.82.13.4vite@7.3.5app,compatibilityDate,content,css,devServer,devtools,icon,modules,pinia,postcss,router,runtimeConfig,spaLoadingTemplate,ssr,vite@vueuse/nuxt@14.3.0,@nuxt/icon@1.15.0,@nuxt/content@3.14.0,@nuxt/fonts@0.14.0,@pinia/nuxt@0.11.3Version
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