如何防止javascript堆栈溢出?

如何防止javascript堆栈溢出?,javascript,jquery,memory,artificial-life,Javascript,Jquery,Memory,Artificial Life,为了在浏览器中运行它,我一直在使用javascript/jquery进行构建。Chrome、Firefox、Opera或Safari都能很快做到这一点,所以最好不要使用IE。IE9还可以。 在创造新一代生命的同时,我也在储存前几代,以便能够追溯历史。这可以正常工作,直到某一时刻内存被填满,这会导致浏览器(选项卡)崩溃 所以我的问题是:我如何检测内存何时被填满?我在一个数组中为每一代存储一个数组,该数组形成了各代的历史。这需要大量内存,这会在几千代之后使浏览器崩溃,具体取决于可用内存。 我知道ja

为了在浏览器中运行它,我一直在使用javascript/jquery进行构建。Chrome、Firefox、Opera或Safari都能很快做到这一点,所以最好不要使用IE。IE9还可以。 在创造新一代生命的同时,我也在储存前几代,以便能够追溯历史。这可以正常工作,直到某一时刻内存被填满,这会导致浏览器(选项卡)崩溃

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

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

与其存储每一代的所有数据,不如存储每隔一段时间拍摄的快照。由于康威的生活游戏是确定性的,因此您可以很容易地从给定的快照重新生成未来的帧。您可能希望保留几个帧的缓冲区,以便可以使倒带平滑


实际上,这并不能真正解决问题,因为你最终会耗尽空间。但是,如果存储每个
n
帧,则应用程序的持续时间将延长
n
倍,这可能已经足够长了。我建议你对你可以倒带到过去的时间设定一些严格的限制,这样你就有了一个存储时间的上限。确定将有多少帧(每秒30帧时10分钟=18000帧)。然后,将
frames
除以您可以存储的帧数(分析各种web浏览器以了解这一点),这就是您应该使用的快照之间的间隔。

Dogbert非常清楚这一点。您无法确切知道有多少可用内存,但可以知道数据集的潜在大小

所以,取数组中存储的每个对象的大小,乘以数组的维数,这就是一次迭代的大小。将其乘以所需的迭代次数,以查看总共需要多少空间,并进行相应调整


或者,受特拉维斯的启发,简单地从上一个已知阵列反向运行模式。毕竟它是确定的。

我建议只将存储在内存中的状态数限制在适当的默认值(IE也可以将其设置为较低的值)。谢谢你的回答。好主意,特别是关于快照。康威的人生游戏可能是确定性的,但它是不可逆的。那么我根本不需要存储历史:)我想你是对的!我的错,对不起,下次我要再复习一下这件事!