10 javascript v8 node.js
V8能够使用它来争夺大量内存--max-old-space-size.我经常使用节点来完成需要10GB +的任务,这很棒 - 内存很便宜,而且比从磁盘读/写要快得多.
然而,我遇到麻烦的地方是尝试创建非常大的单个数组/地图/对象.我最终得到这样的错误消息:
FATAL ERROR: invalid table size Allocation failed - JavaScript heap out of memory
Run Code Online (Sandbox Code Playgroud)
还有这个:
RangeError: Invalid array length
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,并不是因为我的计算机无法处理它,或者我的内存耗尽 - 这是因为在V8中隐藏着一些隐藏的人为限制.
要获得范围错误,请在终端中输入: node -e "new Array(5*1000*1000*1000)"
并获得无效的表大小错误: node -e "(new Array(200*1000*1000)).fill(1)"
这些人为的限制是众所周知的(1,2),并且显然是由于一些旧的垃圾收集器的代码,该V8团队是害怕感人知道将需要大量的工作来解决(见铬错误报告).
对于那些了解V8和nodejs路线图的人:这些限制是否会被取消?我们可以期待多长时间等待?
请注意,我理解较低内存使用的模式,如流媒体,我知道nodejs和V8不是为"大数据"做的 - 这个问题不是关于如何优化我的内存使用等.只是对这些人为限制的V8和nodejs路线图感到好奇.
V8开发人员在这里.简而言之,对不起,它不在路线图上.
我们知道对数组和字符串有大小限制是不幸的.但是,提高现有限制需要付出很多努力.我们想在某个时候这样做,但它现在没有优先权.(这几乎是你引用的错误是什么的款项达-我们没有那么多害怕它,它只是不平凡的,因为它不只是一个"阴险的人为限制",而我们没有时间它给了其他优先权.)
这也不仅仅是一个努力问题,还有技术方面的考虑.尽可能支持任意长度会使某些操作变慢.我们认识到一些用例确实会从这种增加的灵活性中受益,但是其他用例可以从更简单,更快速的底层实现的速度中受益.找到合适的平衡并不明显.此外,我们仍然必须支持32位平台,其中指针大小对例如对象大小设置相当低的限制,并且我们尽可能地希望具有相同的行为,而不管底层硬件/ OS.这是首先拥有JavaScript VM的一部分......
说到JavaScript代码:ECMAScript的规范定义了new Array(n)抛出一个RangeError每当n != ToUint32(n).5*1000*1000*1000不是uint32.所以这个特殊情况实际上是必需的行为; 如果V8支持这样的阵列,那将违反规范.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           243 次  |  
        
|   最近记录:  |