如何使用 Next.js 为 Javascript 堆分配更多内存

Posted

技术标签:

【中文标题】如何使用 Next.js 为 Javascript 堆分配更多内存【英文标题】:How to Allocate More Memory to Javascript Heap Using Next.js 【发布时间】:2020-12-30 09:47:29 【问题描述】:

我们的 Next.js 应用程序的开发环境有问题。

问题

我们的 javascript经常耗尽内存。以下是具体的错误日志:

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
 1: 0x10003ae75 node::Abort() [/usr/local/bin/node]
 2: 0x10003b07f node::OnFatalError(char const*, char const*) [/usr/local/bin/node]
 3: 0x1001a7ae5 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/usr/local/bin/node]
 4: 0x100572ef2 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/usr/local/bin/node]
 5: 0x10057c3f4 v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/usr/local/bin/node]
 6: 0x10054e1e4 v8::internal::Factory::NewRawTwoByteString(int, v8::internal::PretenureFlag) [/usr/local/bin/node]
 7: 0x10067fd99 v8::internal::String::SlowFlatten(v8::internal::Handle<v8::internal::ConsString>, v8::internal::PretenureFlag) [/usr/local/bin/node]
 8: 0x1001c587d v8::String::Utf8Length() const [/usr/local/bin/node]
 9: 0x10004e7b6 node::Buffer::(anonymous namespace)::ByteLengthUtf8(v8::FunctionCallbackInfo<v8::Value> const&) [/usr/local/bin/node]
10: 0x2b9f4f0078a1 
Abort trap: 6

特别是:我注意到aresomewhatsimilar 的问题,但是当我们尝试运行像这样的 Node 命令时:node --max_old_space_size=4096 node_modules/.bin/react-scripts start(其他地方提出的解决方案),它应该为 Node 分配更多内存,我们遇到了问题。似乎这会为某些函数分配额外的内存(在为特定文件分配更多内存时我也看到过这种方法)但是当你运行像npm run dev 这样的命令时我不确定如何做到这一点启动您的开发服务器。

有什么想法吗?

我们技术栈的核心部分

"@material-ui/core": "^4.0.0-alpha.8", "@stripe/react-stripe-js": "^1.1.2", “cors”:“^2.8.5”, “火力基地”:“^7.14.4”, “下一个”:“^9.5.2”, “反应”:“^16.8.6”, “反应查询”:“^2.12.1”,

【问题讨论】:

我不知道你的应用背景和服务器统计信息,但我的想法是你最好定位你的内存泄漏。可能是循环引用(同一组件内的组件)。无限内存不存在,你不能永远增加内存,所以它会再次崩溃。 【参考方案1】:

运行 npm run dev 只需调用 package.json 文件中的 dev 脚本。

这应该是这样的:

"dev": "next",

您可以添加任何您希望发送到节点的标志,例如:

"dev": "NODE_OPTIONS=\"--max_old_space_size=4096\" next",

【讨论】:

这行不通,大卫。仅供参考我收到错误Unknown or unexpected option: --max_old_space_size 您可能应该使用“NODE_OPTIONS=--max-old-space-size=4096 next”,因为--max_old_space_size 是一个节点选项,而不是下一个选项。见nodejs.org/api/cli.html#cli_node_options_options 是的...这是运行良好的语法,@stefbach "dev": "NODE_OPTIONS=\"--max_old_space_size=4096\" next",【参考方案2】:

我最近遇到了类似的问题,这是由于 VS 代码自动从现有的 npm 模块导入日志方法。它既使下一个服务器(开发模式)崩溃,也使故事书 CLI 崩溃。 堆栈跟踪没有帮助,而且很难捕捉到。

即使没有 VS 代码,这也不是我第一次遇到这个问题。 根据我的经验,我建议检查您的进口。你也可以有一个循环依赖。

如果下一个构建命令通过,那么您应该检查任何开发依赖项导入。

祝你好运!

【讨论】:

【参考方案3】:

我有很多次类似的情况。当我尝试使用 index.ts 来简化导入时,其中大多数通过检查循环依赖来解决。

使用madge救了我。

npm -g install madge
npx madge -s -c --extensions ts,tsx ./src/

【讨论】:

以上是关于如何使用 Next.js 为 Javascript 堆分配更多内存的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Next.js 中加载外部图像?

Next.js / JSX 中的 JavaScript 函数语法?

JSX 在纯 JavaScript 文件中工作,如何?

如何使用 Next.js 将 Wordpress 配置为无头 CMS

Next.js 不加载 jsx

Next.js 中的 SEO