当前位置: 首页 > 面试题库 >

单个对象的Node.js堆内存限制

郭永怡
2023-03-14
问题内容

v8对单个对象的堆分配有限制吗?

a = new Array(1024*1024*102)

在节点命令行上失败

FATAL ERROR: JS Allocation failed - process out of memory

另外,以脚本运行时失败并显示相同的错误

node --expose-gc --nouse-idle-notification --max-old-space-size=8192

FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory

var util = require('util');
o = {};

while(1) {
    o["hahahahahaha" + String(ctr)] = ctr;
    ctr++;

    if (ctr % 100000 === 0) {
        console.log(util.inspect(process.memoryUsage()));
        if (ctr % 10000000 === 0) gc();
    }
}

最后输出:

{ rss: 1009557504, heapTotal: 993408824, heapUsed: 964980592 }

然而,

var a = [];
while(1) {
    var o = {};
    o["hahahahahaha" + String(ctr)] = ctr;
    a.push(o);
    ctr++;

    if (ctr % 100000 === 0) {
        console.log(ctr);
        console.log(util.inspect(process.memoryUsage()));
        console.log();
        if (ctr % 10000000 === 0) gc();
    }
}

很好

{ rss: 5466140672, heapTotal: 1091224368, heapUsed: 1070460592 }

编辑:

node -v

v0.10.25

uname -a

Linux 3.13.0-24-generic #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

编辑2:即使这有效!v8的限制似乎适用于对象可以具有的属性数量?

while(1) {

    if (!o["hahahahahaha" + String(Math.floor(ctr/1000000))]) {
        o["hahahahahaha" + String(Math.floor(ctr/1000000))] = {};
        console.log(Object.keys(o))
    }
    o["hahahahahaha" + String(Math.floor(ctr/1000000))][String(ctr)] = ctr;
    ctr++;

    if (ctr % 100000 === 0) {
        console.log(ctr);
        console.log(util.inspect(process.memoryUsage()));
        console.log();
        if (ctr % 10000000 === 0) gc();
    }
}

{ rss: 2474512384, heapTotal: 2466405768, heapUsed: 2431583008 }

另外,我发现了这个:https :
//github.com/v8/v8/blob/master/src/objects.h#L2928

我想知道这是否相关。


问题答案:

事实证明,对字符串,对象和数组的最大大小有硬性限制。草是旧垃圾收集器的残留物。这是相关的票证:

https://code.google.com/p/v8/issues/detail?id=3505



 类似资料:
  • 问题内容: 今天,我运行了用于文件系统索引编制的脚本,以刷新RAID文件索引,并在4小时后崩溃并出现以下错误: 服务器配备16GB RAM和24GB SSD交换。我非常怀疑我的脚本是否超过了36gb的内存。至少不应该 脚本使用文件元数据(修改日期,权限等,无大数据)创建存储为对象数组的文件索引 过去,我曾经用此脚本经历过奇怪的节点问题,这使我不得不这样做。在处理诸如String之类的大文件时,由于

  • 我已经经历了奇怪的节点问题在过去与这个脚本迫使我。在处理像String这样的大文件时,node会出现故障,将索引拆分为多个文件。有什么方法可以改进nodejs的内存管理与庞大的数据集?

  • 我有内存泄漏,我知道它在哪里(我想是这样的),但我不知道为什么会发生。负载测试以下endpoint(使用服务器)时发生内存泄漏: 我非常肯定对象没有被(垃圾回收器)释放。在每一个请求中,应用程序使用的内存都在增长。我做了一些附加测试: 因此,在每个请求中,我都将big object分配给对象作为其属性。我观察到,有了这个附加属性,内存增长得快得多。在60秒内每完成1000个请求,内存会增加100M

  • 在Java 7或更低版本中,如果使用以下语法创建字符串 根据此链接,每当我们创建一个字符串对象时,都会创建两个对象,即堆区域中的一个和字符串常量池中的一个,并且字符串对象引用始终指向堆区域对象,如下所示。 如果我们创建另一个与 具有相同值的String对象,内存表示将是什么 这会在堆中创建另一个具有相同值的对象吗? 还是只会创建引用字符串常量池到堆中的对象?

  • jvm的对象头是如何存储的? 对象头中有哪些信息? 对象头里面的东西:运行时元数据,类型指针:Hashcode,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳。如果是数组的化还需要记录长度 就比如下面的代码来看,内存分布情况: 由于是static的main方法所有局部变量表没有this,如果是非静态方法的话第一个放this。 其次: 栈帧:局部变量表,操作数栈,动态链接,方法返回

  • 问题内容: 我在HP Proliant服务器上运行了高度并发的应用程序。该应用程序是我用erlang编码的文件系统索引器。它在文件系统上找到的每个文件夹中产生一个进程,并将所有文件路径记录在碎片化的Mnesia数据库中。(数据库由表的类型组成,其文件系统的屏幕快照可在 此处 查看。) 下面显示了完成文件系统的高强度工作的代码片段: 该函数是通用的,它需要两个。一个乐趣:与最热门目录一起使用,找到的