【问题标题】:nodejs FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memorynodejs 致命错误:CALL_AND_RETRY_LAST 分配失败 - JavaScript 堆内存不足
【发布时间】:2018-09-25 22:02:44
【问题描述】:

有时会出现这个错误。

<--- Last few GCs --->                                                                                                                                                                                                          
 [2856:00000253F09D3B90] 11688472 ms: Mark-sweep 1529.8 (1619.4) -> 1529.7 (1583.4) MB, 1835.6 / 0.0 ms  last resort GC in old space requested  

 [2856:00000253F09D3B90] 11690272 ms: Mark-sweep 1529.7 (1583.4) -> 1529.7 (1579.4) MB, 1799.7 / 0.0 ms  last resort GC in old space requested                                                                                                                                                                                                                                                                                                                   

<--- JS stacktrace --->                                                                                                                                                                                                         
==== JS stack trace =========================================                                                                                                                                                                   
Security context: 000001F6C9E25739 <JSObject>                                                                       
1: completeMany [C:\Users\mobasher.fasihy\Documents\GitHub\jobsaf-server\node_modules\mongoose\lib\query.js:~1459] [pc=0000006F3C3482B8](this=0000029E4B604F01 <JSGlobal Object>,model=00000090CCBE6729 <JSFunction model (sfi = 000001A244DDB931)>,docs=0000025B74FA8591 
<JSArray[53714]>,fields=0000025B74FA8FF1 <Object map = 00000207F58823B9>,userProvidedFields=0000025B74FA9029 <Object map = 000...                                                                                                                                                                 
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory                               
1: node::DecodeWrite                                                                                            
2: node_module_register                                                                                         
3: v8::internal::FatalProcessOutOfMemory                                                                        
4: v8::internal::FatalProcessOutOfMemory                                                                        
5: v8::internal::Factory::NewUninitializedFixedArray                                                            
6: v8::internal::WasmDebugInfo::SetupForTesting                                                                 
7: v8::internal::interpreter::BytecodeArrayRandomIterator::UpdateOffsetFromIndex                                
8: 0000006F3C2043C1                                                                                            
[nodemon] app crashed - waiting for file changes before starting... 

服务器上随机出现上述错误,应用程序崩溃。

【问题讨论】:

  • 请将错误信息以文本形式发布在代码块中,以便于搜索、阅读和使用以帮助您。这个错误意味着你使用了太多的内存,可能是一个你填充太多的数组,一个你不让呼吸的递归调用,或者一个你让循环持续太久,但是没有代码,我们不能走得更远。
  • @DrakaSAN 无法跟踪我的应用程序的哪个请求导致了此错误,它是随机发生的。我有一些超过 6 万条记录的集合,当我列出或搜索它们时,有时会出现上述错误。
  • 看起来像一个很好的嫌疑人,这取决于你如何列出你的收藏,这可能就是你让一切崩溃的方式。你使用数据库吗?哪一个?你如何使用它?如果可以的话,能不能贴一下列表和搜索功能?
  • @DrakaSAN 是的,我用的是 MongoDB,我的列表,搜索功能很简单,我就用 from find, aggregate, skip, limit, and somewhere $match。它的响应时间很好,我所有的请求都响应很快。
  • 您将获得的数据保留多长时间?我会记录确切的请求,等待崩溃,并调查导致崩溃的调用,可能是一次请求大量数据,或者数据库中的 huge 对象。

标签: node.js angular mean-stack


【解决方案1】:

虽然您可以使用 David 的解决方法,但我建议您搜索根本原因。

内存不足错误的可能原因并不多:

  • 递归调用的时间过长,以至于破坏了堆栈跟踪
  • 您创建了一个非常重的对象
  • 您一次获得大量数据

如果根本原因是递归调用,这是 node.js 充满回调时的常见错误,有一行代码将控制权交还给事件循环,以便它可以自行清理(@987654321 @ 或类似的东西)

对于另外两个原因,现在最有可能是罪魁祸首,尤其是在使用数据库时,您将需要使用流,这样您就永远不会在内存中一次获得完整的数据,或者找到另一种划分方式工作。

【讨论】:

    【解决方案2】:

    哪个进程抛出错误?

    尝试设置 max_old_space_size 设置(以 MB 为单位)

    node --max_old_space_size=4096 <yourScriptHere>
    

    【讨论】:

    • yourFile?这里应该有什么。
    • 你从 node 开始的脚本
    • @David 你是说像 npm run dev 这样的东西吗?还是我弄错了
    猜你喜欢
    • 2016-12-19
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 2020-06-08
    • 2018-12-05
    相关资源
    最近更新 更多