相关疑难解决方法(0)

将v8的内存管理配置为node.js进程的智能

我们在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: …

garbage-collection memory-management v8 node.js

27
推荐指数
1
解决办法
4万
查看次数

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

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 memory-management v8 node.js

8
推荐指数
1
解决办法
4879
查看次数

Javascript 中的最大数组大小是多少以及要使用哪些数组

我想在 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) 的限制比 [] 更高。谢谢

javascript node.js

5
推荐指数
1
解决办法
1747
查看次数

致命错误:无效的数组长度分配失败 - JavaScript 堆内存不足

错误:

<--- 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)

javascript node.js

5
推荐指数
1
解决办法
9399
查看次数

Javascript增加最大数组大小

我正在尝试创建一个大小的数组2^32 = 4294967296,因为我试图通过运行筛选算法获得所有素数直到2 ^ 32.但是,该数组中的任何操作我都会收到以下错误:

致命错误:CALL_AND_RETRY_LAST分配失败 - 处理内存不足

中止陷阱:6

在上述情况下我该怎么办?

javascript node.js

4
推荐指数
2
解决办法
4744
查看次数