Redux商店可以导致内存泄漏吗?

时间:2016-10-09 12:42:20

标签: reactjs memory-leaks redux react-redux

我有一个仪表板应用程序,其中有几个图表在设定的时间间隔内更新。我的第一个想法是更新商店中的数据,然后让所有图表从那里开始。

但这会导致内存泄漏吗?由于Redux每次数据更改时都会创建一个新存储,并保留旧存储。每秒~2mb的数据是否会堆积并使应用程序崩溃?

我看到的另一种方法是将数据保持在本地状态(使用setState)。 我希望一些更有经验的React / Redux开发人员可以就此提出建议。谢谢!

4 个答案:

答案 0 :(得分:8)

Redux的创建者Dan Abramov解决了这个问题here,如此:

  

请注意,有时人们会对Redux感到困惑,并假设在每个操作中都必须深入克隆状态树。绝对不是这样。只有更改的部分需要更改其引用。例如,如果某个操作导致更改数组中的一个项,实际上,该项和数组将需要复制,但是,数组中的所有其他元素都将保留其标识。因为大多数时候操作都是非常有针对性的并且会影响一些状态键,并且因为Redux鼓励规范化数据以使数据结构没有深度嵌套,所以对于典型的Web应用程序而言,这远不像人们想象的那么严重。

我认为这是答案的主要内容。

答案 1 :(得分:4)

"由于Redux每次收费时都会创建一个新商店并保留旧商店。"

Vanilla Redux不这样做,或每个 Redux商店都会泄漏。实际上,保留对状态的引用的其余部分将阻止它被清除。

例如

window.states = []
store.subscribe(() => {
  window.states.push(store.getState())
})

将导致无限的内存增长。

此外,一些Redux开发工具确实泄漏以提供时间旅行功能,因此请确保它们已针对您的生产构建进行关闭。

答案 2 :(得分:3)

首先, 听起来像是一大堆数据。您的客户端应用程序实际上是否需要那么多的数据?

其次,Redux不会“创建新的商店”。假设您遵循推荐的更新数据的方法,旧数据引用将被丢弃并将被垃圾收集。默认情况下,Redux本身并不会保留对旧状态树的引用,尽管Redux DevTools会执行时间旅行调试。

您可能需要阅读Redux文档中的几个部分。请特别注意http://redux.js.org/docs/faq/Performance.htmlhttp://redux.js.org/docs/recipes/StructuringReducers.html

您可能还想浏览我的Redux addons catalog,其中包含可以执行批量更新等操作的插件。

答案 3 :(得分:1)

建议不要在用户的浏览器上堆积2MB的数据/秒。 Redux商店是浏览器的客户端。关于内存泄漏问题的另一部分并不是我所知道的。一些有用的链接是:

Diagnose memory leaks using Chrome devtools

Four types of memory leaks to watch out for