【发布时间】:2021-05-20 06:31:03
【问题描述】:
最近我正在尝试优化 Web 应用程序 (React) 的性能。假设它有点重,因为它由代码编辑器、Firebase、SQL、AWS SDK 等组成。所以我集成了react-loadable,它将延迟加载组件,之后,我遇到了这个 Javascript 堆内存不足的问题。
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory in React
经过一些研究(来自朋友),我知道如果我们保留太多延迟加载,webpack 会尝试并行捆绑它们这可能是导致 Javascript 堆内存问题的原因,确认我删除了所有在我的应用程序中延迟加载路线并构建。现在构建成功。后来根据社区的建议,我增加了节点堆空间大小并获得了以下见解
首先我将它增加到 8 GB(8192) 然后构建成功我得到了大约 72 分钟 的构建时间,从下一次开始我会绕过 20 分钟。然后我将堆内存大小减小到 4 GB(4096) 并在 15 - 20 分钟 左右获得构建成功。系统配置为2vCPU、16GB RAM(AWS EC2 Instance r5a.large)。
接下来,我继续在另一个系统中构建(Mac book pro, i5, 8 GB RAM, 4 Cores)现在花了 30 分钟,第二次花了 20 分钟
所以根据这些数据点,我有几个问题
- 每当我们添加一些代码时,我们是否需要不断增加堆空间?如果是,社区中的平均堆内存大小是多少
- 对于这类繁重的应用程序,构建系统的通常配置是什么,为什么,因为现在我不确定是增加内核数或 RAM 或堆空间,还是与我们的应用程序代码一起做一些事情。李>
- webpack 是否提供任何类型的解决方案来避免堆内存问题,例如限制并行进程或任何插件?
- 如果它与我们的应用程序代码有关,是否有任何标准流程来调试它占用内存的位置并基于此进行优化
PS : 有人建议保留GENERATE_SOUCREMAP=false 它已成功,但我们需要源映射,因为它们有助于调试生产问题
【问题讨论】:
-
好悲痛。这似乎很离谱。在这里,我们担心如果网页加载时间超过半秒,最终用户的可用性会受到影响。但是我们可以容忍不只是几分钟而是几十分钟的构建时间?开发人员的可用性发生了什么变化?当编译时间是即时的时,这怎么能被认为是对框架之前的 Web 开发的改进?
标签: reactjs webpack lazy-loading heap-memory build-time