vue项目vite打包出现堆栈溢出

问题描述

vue项目打包,出现无法打包的情况,报错如下

> vue-tsc --noEmit && vite build


<--- Last few GCs --->

[21096:0000021FB3EE01D0]    71374 ms: Scavenge 2044.8 (2083.7) -> 2043.9 (2085.7) MB, 3.5 / 0.0 ms  (average mu = 0.353, current mu = 0.477) allocation failure; 
[21096:0000021FB3EE01D0]    72160 ms: Mark-sweep (reduce) 2045.8 (2085.7) -> 2044.5 (2083.4) MB, 454.4 / 0.0 ms  (+ 133.6 ms in 29 steps since start of marking, biggest step 5.2 ms, walltime since start of marking 610 ms) (average mu = 0.356, current mu =

<--- JS stacktrace --->

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 00007FF67D25D51F node_api_throw_syntax_error+175743
 2: 00007FF67D1E2E66 v8::internal::wasm::WasmCode::safepoint_table_offset+59654
 3: 00007FF67D1E4B72 v8::internal::wasm::WasmCode::safepoint_table_offset+67090
 4: 00007FF67DC8AAB4 v8::Isolate::ReportExternalAllocationLimitReached+116     
 5: 00007FF67DC75E12 v8::Isolate::Exit+674
 6: 00007FF67DAF7C6C v8::internal::EmbedderStackStateScope::ExplicitScopeForTesting+124 
 7: 00007FF67DB04F4D v8::internal::Heap::PublishPendingAllocations+1117
 8: 00007FF67DB01FD7 v8::internal::Heap::PageFlagsAreConsistent+3367
 9: 00007FF67DAF4707 v8::internal::Heap::CollectGarbage+2039
10: 00007FF67DB0B0C3 v8::internal::HeapAllocator::AllocateRawWithLightRetrySlowPath+2099
11: 00007FF67DB0B96D v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath+93
12: 00007FF67DB1B1A3 v8::internal::Factory::NewFillerObject+851
13: 00007FF67D80C285 v8::internal::DateCache::Weekday+1349
14: 00007FF67DD28051 v8::internal::SetupIsolateDelegate::SetupHeap+558193
15: 00007FF67DCADB62 v8::internal::SetupIsolateDelegate::SetupHeap+57218
16: 00007FF5FEAA42AB

查询相关错误

Scavenge 1992.5 (2065.6) -> 1970.8 (2058.0) MB, 19.2 / 0.0 ms (average mu = 0.349, current mu = 0.338) allocation failure


这是 Node.js 的垃圾回收日志,它显示了垃圾回收的一些详细信息。

Scavenge 是 Node.js V8 引擎中的一种垃圾回收机制,主要负责新生代(新创建的对象)的垃圾回收。

日志中的数字表示了垃圾回收前后的内存使用情况。例如,1992.5 (2065.6) -> 1970.8 (2058.0) MB 表示垃圾回收前,新生代使用了1992.5MB,总内存使用了2065.6MB;垃圾回收后,新生代使用了1970.8MB,总内存使用了2058.0MB。

19.2 / 0.0 ms 表示这次垃圾回收花费了19.2毫秒。

average mu = 0.349, current mu = 0.338 是关于内存使用的统计信息,mu 是 memory utilization(内存使用率)的缩写,值越接近1表示内存使用率越高。

allocation failure 表示这次垃圾回收是由于内存分配失败触发的。

如果你的应用经常出现内存分配失败,可能需要检查是否存在内存泄漏问题。
Mark-sweep 1997.1 (2071.9) -> 1964.5 (2055.3) MB, 747.7 / 0.0 ms (average mu = 0.329, current mu = 0.310) allocation failure; scavenge might not succeed

这是 Node.js 的垃圾回收日志,它显示了垃圾回收的一些详细信息。

Mark-sweep 是 Node.js V8 引擎中的一种垃圾回收机制,主要负责老生代(存活时间较长的对象)的垃圾回收。

日志中的数字表示了垃圾回收前后的内存使用情况。例如,1997.1 (2071.9) -> 1964.5 (2055.3) MB 表示垃圾回收前,老生代使用了1997.1MB,总内存使用了2071.9MB;垃圾回收后,老生代使用了1964.5MB,总内存使用了2055.3MB。

747.7 / 0.0 ms 表示这次垃圾回收花费了747.7毫秒。

average mu = 0.329, current mu = 0.310 是关于内存使用的统计信息,mu 是 memory utilization(内存使用率)的缩写,值越接近1表示内存使用率越高。

allocation failure; scavenge might not succeed 表示这次垃圾回收是由于内存分配失败触发的,而且接下来的 Scavenge 垃圾回收可能无法成功。

如果你的应用经常出现内存分配失败,可能需要检查是否存在内存泄漏问题。

解决方案

1 安装cross-env

npm install --save-dev cross-env

2 修改环境变量

在 package.json 文件中的 scripts 部分修改 build 命令,使用 cross-env 来设置环境变量:

"scripts": {
  "build": "cross-env NODE_OPTIONS='--max-old-space-size=4096' vue-tsc --noEmit && vite build"
}