不应该';一个具有不可变数据的Redux应用程序是否会在一段时间后耗尽内存?

不应该';一个具有不可变数据的Redux应用程序是否会在一段时间后耗尽内存?,redux,immutable.js,Redux,Immutable.js,我有嵌入式系统的背景,你对内存管理非常谨慎。与Redux特别是其不变性的概念。 假设我正在修改数组的一个成员。我必须创建一个新的数组,链接到所有原始成员和修改的项目 我理解为什么使用不变性可以提高速度,但我的问题是,由于我们基本上从不删除对象的旧副本并创建新副本,因此Redux仍然保留对旧对象的引用,因为时间旅行特性 现在大多数机器都有相当多的内存,但至少在理论上Redux应用程序不应该因为选项卡/进程内存不足而崩溃吗?长时间使用后,也许?Immutable.js在创建集合的新副本时利用了结构共

我有嵌入式系统的背景,你对内存管理非常谨慎。与Redux特别是其不变性的概念。 假设我正在修改数组的一个成员。我必须创建一个新的数组,链接到所有原始成员和修改的项目

我理解为什么使用不变性可以提高速度,但我的问题是,由于我们基本上从不删除对象的旧副本并创建新副本,因此Redux仍然保留对旧对象的引用,因为时间旅行特性


现在大多数机器都有相当多的内存,但至少在理论上Redux应用程序不应该因为选项卡/进程内存不足而崩溃吗?长时间使用后,也许?

Immutable.js在创建集合的新副本时利用了结构共享的思想。它实现持久数据结构,并在内部使用类似于实现结构共享的概念。因此,如果您创建了一个包含10个项目的列表,向其中添加新项目将不会创建新列表

持久数据结构提供了不可变的好处,同时 保持高性能读写并呈现熟悉的 应用程序编程接口。 Immutable.js数据结构在现代JavaScript虚拟机上非常高效 通过哈希映射尝试和向量尝试使用结构共享 由Clojure和Scala推广,最大限度地减少了复制或缓存的需要 数据


我建议您看看Immutable.js创建者Lee Bryon的这篇文章。首先,Redux本身并不保留旧数据,这是Redux DevTools插件所做的事情。其次,我相信DevTools插件在跟踪多少操作方面有限制。第三,Javascript是一种垃圾收集语言,因此不再引用的项将被清除。(这里有点挥手,但这通常包括了一些内容。)

如果使用诸如Chrome这样的浏览器提供逐页的内存使用,您可以自己测量。请记住,只有使用才会创建相关的新状态——如果某个选项卡在某个状态下处于空闲状态,那么它。。。是的,内存会随着时间的推移而增长,但是如果你期望的是t*n(其中t是通过的状态数,n是单个状态的平均存储大小),那么最坏的情况是不太可能发生的。你似乎避免了触及主题的一半:不变的数据结构。Redux没有不可变的数据结构,默认情况下,它会假定您在操作数据,就好像它们是按约定不可变的一样。OP并没有假设这一点:他明确地说要结合Redux使用不可变的数据结构,如immutable.js和Ramda。在这种情况下,一个可能会在某个时候耗尽数据,因为你在内存中保存所有版本,但这完全取决于你如何“修改”结构,正如其他答案所指出的。嗯。。。不是。OP提到了“不变性”,但没有提到Immutable.js或Ramda。此外,即使使用Immutable.js,标准js垃圾收集规则仍然适用。如果您不再有对特定Immutable.js对象的引用,并且没有其他不可变对象引用较旧的结构共享节点,则它们将被GC。请参阅以进行讨论。也可以在我的帖子中找到关于Redux+不变性的信息。这是真的,但是如果你的使用模式是特殊的,你很可能会耗尽内存。如果您有一个包含10个数字的列表,并且通过增加每个数字来修改列表,那么内存中就有20个数字,加上它周围的相关结构。再做一次,你就有30个数字,等等。