【问题标题】:Why does Node.js have an 1.76 Gb memory limit?为什么 Node.js 有 1.76 Gb 的内存限制?
【发布时间】:2018-05-03 00:55:10
【问题描述】:

...这背后是否只有一个非常技术性的原因,可能仅仅是因为 V8 开发时没有考虑到服务器端 Javascript? 还是有更多与 Node.js 的架构和性质相关的原因?除了“因为那样你必须增加内存限制”之外,我是否有理由考虑使用 Node.js 进行流式传输和管道传输,而不是加载和处理大量数据?

【问题讨论】:

  • 如果内存限制太低,gc 会经常触发,如果内存太大,gc 会阻止世界到 long。但是对于舒尔来说,您可以轻松增加内存限制。这只是一个默认值

标签: javascript node.js memory v8


【解决方案1】:

存在限制的主要原因是为了保护系统的其余部分免受失控的内存消耗(即,当您有多个进程正在运行,其中一个消耗了它可以获得的所有内存时,你希望那个达到自己的极限,而不是影响系统中的其他一切)。对于浏览器场景尤其如此(您不希望一个选项卡消耗所有内存而牺牲所有其他选项卡),但也适用于许多服务器端场景。

限制的默认值或多或少是任意的;对于大多数目的来说,这似乎是一个合理的妥协。如果您需要更多,请随时提出。如果您的应用需要,64 位版本的现代 V8 版本(“现代”= 最近几年)支持超大堆。

关于您的最后一个问题,“流和管道”通常是处理大量数据的有用技术,无论您使用的是 Node.js 还是任何其他技术。一次性读取所有输入数据的代码往往更容易编写,但总是容易遇到限制: 例如,运行它的机器的物理内存大小。您可以通过购买更多内存来“修复”该问题,但如果您的代码使用流式传输和合理大小的缓冲区,它将能够以低得多的硬件要求处理更大的输入数据,甚至可能运行得更快。

【讨论】:

  • 感谢您的解释!你如何看待“如果内存限制太低,gc 会经常触发,如果内存太大,gc 会阻止世界变长”(见上面的评论),Node.js 的 GC 真的阻塞了事件循环吗? ?这也是一个很好的理由......
  • V8 自 2011 年底以来一直没有“停止世界”的 GC。GC 部分在主线程上工作(以小的增量步骤,因此不会长时间阻塞),部分在背景中。 GC 工作的总成本与你分配了多少成正比;换句话说:当然,使用很少内存的应用程序也花费更少的时间进行 GC。但这实际上与最大堆大小无关。
  • 你能提供一个来源吗?我很想更新我的知识;)
  • 来源是什么?原创“新GC”公告:blog.chromium.org/2011/11/game-changer-for-interactive.html。对持续改进的最新见解:v8project.blogspot.com/2015/08/…。当然,真相的最终来源是来源:chromium.googlesource.com/v8/v8.git/+/master/src/heap
  • 您的第二个消息来源声称“为了避免主线程长时间暂停,V8 长期以来一直能够以许多小步骤增量标记活动对象,目的是保持每个标记步骤持续时间低于 5 毫秒。”,这意味着它并没有那么糟糕,但他们仍然在收集垃圾的同时阻止整个世界,不是吗?这个概念是否适用于要求更多内存的应用程序?
猜你喜欢
  • 2011-02-13
  • 2021-07-16
  • 2012-02-03
  • 1970-01-01
  • 2021-02-12
  • 2019-04-11
  • 2021-09-24
  • 2021-03-01
相关资源
最近更新 更多