如何防止javascript堆栈溢出?

时间:2011-03-17 23:28:37

标签: javascript jquery memory artificial-life

我一直在使用javascript / jquery构建Conway's Life,以便在浏览器Here中运行它。 Chrome,Firefox和Opera或Safari可以非常快速地执行此操作,因此最好不要使用IE。虽然IE9还可以。 在产生新一代生命的同时,我正在存储前几代,以便能够追溯历史。这种工作正常,直到内存填满,这会使浏览器(标签)崩溃。

所以我的问题是:如何检测内存何时填满?我在一个数组中为每一代存储一个数组,形成了几代人的历史。这会占用大量内存,几千代后会崩溃浏览器,具体取决于可用内存。 我知道javascript无法检查可用内存量,但必须有办法......

2 个答案:

答案 0 :(得分:7)

我怀疑有办法做到这一点。即使有,也可能是浏览器特定的。不过,我可以建议一种不同的方式。

不是存储每一代的所有数据,而是每隔一段时间存储一次快照。由于Conway的生命游戏是确定性的,您可以轻松地从给定快照重新生成未来的帧。你可能想要保留一些几帧的缓冲区,这样你就可以顺利地进行倒带。

实际上,这实际上并不是解决问题,因为你最终会耗尽空间。但是,如果您存储每个n帧,您的应用程序将持续n次,这可能只够长。我建议你对你可以倒回到过去的距离施加一些硬性限制,这样你就可以限制你需要存储的数量。确定将会有多少帧(30 FPS时为10分钟= 18000 frames)。然后,将frames除以您可以存储的帧数(配置各种Web浏览器来计算出来),这是您应该使用的快照之间的间隔。

答案 1 :(得分:0)

Dogbert几乎把它钉死了。您无法准确知道有多少可用内存,但您可以知道数据集的可能性有多大。

因此,获取存储在数组中的每个对象的大小,乘以数组维度,这是一次迭代的大小。将其乘以所需的迭代次数,以查看它将占用多少空间,并相应地进行调整。

或者,受Travis的启发,只需从最后一个已知阵列反向运行模式。毕竟这是确定性的。