如果我将节点定制到512mb容器,为什么--max_old_space_size 460?

时间:2017-09-02 21:28:45

标签: javascript node.js express heroku garbage-collection

我在heroku上运行了一个快速应用程序。

我希望优化垃圾收集。

heroku docs说:

默认情况下,节点为长期存在的对象设置1.5 GB的限制。如果这超出了dyno可用的内存,Node可能允许您的应用程序开始将内存分页到磁盘。

要获得对应用程序垃圾收集器的更多控制,可以在Procfile中为基础V8 JavaScript引擎提供标志:

web: node --optimize_for_size --max_old_space_size=920 server.js

如果您想将节点定制到512 MB容器,请尝试:

web: node --optimize_for_size --max_old_space_size=460 server.js

如果容器是512mb,为什么--max_old_space_size是460而不是512?

这是如何工作的,适合生产?

1 个答案:

答案 0 :(得分:0)

垃圾收集真的很复杂,有复杂的内存管理算法用于收集和清理堆内存。为了满足不断增长的需求,JavaScript 堆会逐渐增长。如果达到允许的堆内存大小,node.js 将错误退出。

以下命令参数是:

  • optimize_for_size - 使算法能够更频繁地优化堆内存大小,该进程利用更多 CPU 资源通过清理旧的堆空间(包括指针、数据等)来保留较小的垃圾。
  • max_old_space_size - 默认情况下,Node.js(最高 11.x)在 32 位和 64 位平台上使用的最大堆大小分别为 700MB 和 1400MB。由于 v12.7 node.js 在容器环境中支持更好的堆大小分配。

根据可用内存配置堆大小可确保 Node.js 不会尝试使用比可用内存更多的内存并在其内存耗尽时终止。

我会推荐生产 node.js 环境:

  • 设置 node.js 重启策略,以防应用程序意外崩溃
  • 在生产环境中部署之前,打开和关闭参数 --optimize_for_size 来评估加载时的应用性能
  • 准备好对 Node.js 应用程序进行事后分析
  • 持续监控 node.js 应用程序性能和资源使用情况
  • 使 node.js 和模块保持最新状态,定期评估 github 上应用程序中所有使用模块的漏洞和当前问题

使用最佳实践和案例来评估生产中的最佳解决方案,例如:https://developer.ibm.com/languages/node-js/articles/nodejs-weather-company-success-story/