【问题标题】:node v6.11.0 JavaScript heap out of memory when no memory is used in the programnode v6.11.0 JavaScript heap out of memory 当程序中没有使用内存时
【发布时间】:2017-10-22 17:34:58
【问题描述】:

当除了两个变量(i & j)之外没有使用内存存储时出现内存不足错误。有人可以澄清一下吗?

我不会在内存中存储任何位置或将其写入任何存储,无论生成什么都会吐到控制台并需要移动到下一条指令。

console.log('num,num2,op,result');
for(i=9.0;i>=0;) {
  for(j=9.0;j>=0;) {
     console.log(i.toFixed(3) + ',' + j.toFixed(3) + ',+,'  + (i+j).toFixed(3));
     j =parseFloat((j - 0.001).toFixed(3));
  }
     i =parseFloat((i - 0.001).toFixed(3));
 }

执行此获取堆栈错误,

致命错误:CALL_AND_RETRY_LAST 分配失败 - JavaScript 堆内存不足

 1: node::Abort() [/usr/local/bin/node]
 2: node::FatalException(v8::Isolate*, v8::Local<v8::Value>, v8::Local<v8::Message>) [/usr/local/bin/node]
 3: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/local/bin/node]
 4: v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/usr/local/bin/node]
 5: v8::internal::Runtime_AllocateInTargetSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/local/bin/node]
 6: 0x3006473079a7
Abort trap: 6

请让我知道我缺少什么以避免内存崩溃。

更多研究:

对于我们的代码,console.log 是否是 异步与否,它不提供任何类型的回调左右;和 您传递的值始终在您使用时被引用和计算 调用函数。

参考: console.log() async or sync?

它仅在引用与其关联的数据时引用数据。

还将检查与 parseFloat 或 toFixed 相关的任何内存泄漏。

【问题讨论】:

  • memory 这里指的是RAM,每个变量等都驻留在RAM中。但是不,您的代码不会使用太多内存,因此内存泄漏必须在其他地方
  • 唯一使用的变量是 i & j。我没有看到任何占用 RAM 的东西。
  • @Kannaiyan console.log 将使用大量 ram,toFixedparseFloat 函数将使用 ram - 就像所有其他不适合寄存器的操作一样。
  • 但是一旦console.log完成,它会进入控制台并且ram将被正确清除。无论如何我可以将其从进程中清除吗?我在 toFixed 和 parseFloat 下是函数,一旦函数完成,它们也应该清除内存对吗?还假设它们是同步的。我没有看到它们会异步运行。
  • 是的,唯一继续获取内存的是控制台输出缓冲区,其余的应该保留在常量内存中。你真的在控制台上看到了什么吗?能跑多远?

标签: javascript node.js memory


【解决方案1】:

console.log 正在缓冲并超出内存限制。

使用缓冲区刷新将其刷新到系统控制台,它将能够无限期地进行。

这是我的解决方法,

var logbuffer = require('log-buffer');
console.log('num,num2,op,result');
for (i = 9.0; i >= 0;) {
    for (j = 9.0; j >= 0;) {
        console.log(i.toFixed(3) + ',' + j.toFixed(3) + ',+,' + (i + j).toFixed(3));
        j = parseFloat((j - 0.001).toFixed(3));
    }
    logbuffer.flush();
    i = parseFloat((i - 0.001).toFixed(3));
}

在我接受它作为答案之前,我将等待 cmets 和任何人可能发现的任何问题。

感谢所有帮助调试和进一步解决问题的 cmets。

【讨论】:

    猜你喜欢
    • 2018-08-01
    • 2019-06-23
    • 2021-12-17
    • 2019-06-18
    • 2022-12-12
    • 2017-04-24
    • 2021-09-02
    • 1970-01-01
    • 2017-05-21
    相关资源
    最近更新 更多