我们在node.js上运行一个XMPP服务器,在一台大约3.8 GB RAM的机器上运行.以下是我们在调用节点时传递的命令行参数:/ opt/node/bin/node --max-old-space-size = 3000 --trace-gc --trace-gc-verbose main.js
但是,我们经常需要在此过程中看到超过10秒的gc暂停(有时多达1分钟gc暂停,我们的服务器除了运行GC之外什么都不做).当发生这种情况时,我们的进程是正常的内存消耗:大约1 GB的堆使用量.该过程有大约2 GB或可用空间,但该过程不使用它并花费一分钟尝试释放内存.
查看--trace-gc-verbose选项给出的gc跟踪,看起来大约2 GB的可用空间被标记为"大对象空间",并且没有使用,因为没有那么多大对象.虽然该过程迫切需要更多内存用于"旧指针"和"旧数据空间",但不使用来自"大对象空间"的这个空闲内存.
这是gc在其中一个时间内留下的痕迹,其中有一个长gc暂停:
91635809 ms: Mark-sweep 968.8 (1039.0) -> 958.5 (1038.0) MB, 1 / 410 ms (+ 2287 ms in 79 steps since start of marking, biggest step 140.227051 ms) [idle notification: finalize incremental] [GC in old space requested]. Memory allocator, used: 1088446464, available: 2124390400 New space, used: 192, available: 8388416 Old pointers, used: 633992112, available: 10460240, waste: 0 Old data space, used: 315819248, available: 149776, waste: …
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();
}
}
Run Code Online (Sandbox Code Playgroud)
最后输出:
{ rss: 1009557504, heapTotal: 993408824, heapUsed: 964980592 }
然而,
var a = [];
while(1) {
var …Run Code Online (Sandbox Code Playgroud) 我想在 Javascript 中创建一个大数组并编写了以下代码,但由于 OOM 而不起作用
let N = 125000000;
let numbers = [];
for (let i = 0; i < N; i++) {
numbers[i] = Math.round(Math.random()*10000);
}
Run Code Online (Sandbox Code Playgroud)
然后我写了“让数字=新数组(N);” 相反,它适用于 N (125000000),但不适用于更大的 N (200000000)。然后我使用了 Uint32Array,它适用于更大的 N。它最多可达 N = 2^31-1。Javascript 中 []、new Array(size)、Uint32Array 的大小有限制吗?我猜 Uint32Array 的最大大小是 2^31-1。我还想知道为什么 new Array(N) 的限制比 [] 更高。谢谢
错误:
<--- Last few GCs --->
[873:0x1020aa000] 47109 ms: Scavenge 2107.9 (2131.9) -> 2092.1 (2131.9) MB, 0.3 / 0.0 ms (average mu = 0.995, current mu = 0.999) allocation failure
[873:0x1020aa000] 47231 ms: Scavenge 2107.9 (2131.9) -> 2092.1 (2131.9) MB, 0.2 / 0.0 ms (average mu = 0.995, current mu = 0.999) allocation failure
[873:0x1020aa000] 47353 ms: Scavenge 2107.9 (2131.9) -> 2092.1 (2131.9) MB, 0.2 / 0.0 ms (average mu = 0.995, current mu = 0.999) allocation failure
<--- JS …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个大小的数组2^32 = 4294967296,因为我试图通过运行筛选算法获得所有素数直到2 ^ 32.但是,该数组中的任何操作我都会收到以下错误:
致命错误:CALL_AND_RETRY_LAST分配失败 - 处理内存不足
中止陷阱:6
在上述情况下我该怎么办?