Memory 为什么飞镖在一段时间后会走得很慢?

Memory 为什么飞镖在一段时间后会走得很慢?,memory,garbage-collection,dart,freeze,Memory,Garbage Collection,Dart,Freeze,我们的Dart有些问题。一段时间后,垃圾收集器似乎无法清除VM中的内存,因此应用程序挂起。有人有这个问题吗?有内存限制吗?您应该重用对象,而不是创建新对象。您应该使用池模式: 小心帆布,这是正确的破坏 另一篇GC性能论文: 有内存限制吗 对。Dart显然是以启动时可配置的最大尺寸运行的: (以下适用于所有垃圾收集语言…) 如果您的应用程序开始耗尽空间(即堆正在慢慢填充GC无法删除的对象),那么您可能会陷入一种糟糕的情况,GC运行越来越频繁,每次都设法回收越来越少的内存。最终您会耗尽内

我们的Dart有些问题。一段时间后,垃圾收集器似乎无法清除VM中的内存,因此应用程序挂起。有人有这个问题吗?有内存限制吗?

您应该重用对象,而不是创建新对象。您应该使用池模式:

小心帆布,这是正确的破坏

另一篇GC性能论文:

有内存限制吗

对。Dart显然是以启动时可配置的最大尺寸运行的:

(以下适用于所有垃圾收集语言…)

如果您的应用程序开始耗尽空间(即堆正在慢慢填充GC无法删除的对象),那么您可能会陷入一种糟糕的情况,GC运行越来越频繁,每次都设法回收越来越少的内存。最终您会耗尽内存,但在此之前,应用程序会变得非常缓慢

解决方案通常是执行以下一项或两项操作:

  • 查找导致内存耗尽的原因。通常情况下,分配的对象不是太多。相反,典型的原因是不需要的对象仍然可以到达。。。通过应用程序构建的某些数据结构

  • 为GC设置“快速死亡”调优选项。。。。如果有的话。例如,可以将Java垃圾收集器配置为测量垃圾收集所花费的时间。(GC开销。)当GC开销超过预设比率时,Java虚拟机抛出一个
    OutOfMemoryError
    “拔掉插头”


我还没有看到任何类似的报告。您是否尝试过使用Observator进行调查?在中重用对象并不总是有益的。Dart虚拟机(以及V8)使用分代地面军事系统。清理短期对象的速度非常快。然而,从旧空间到新空间跟踪指针是昂贵的。如果继续重用对象,它们将迁移到旧一代。如果您现在分配新对象并向旧对象添加指针,您将减慢程序的速度,因为VM需要跟踪这些依赖项。这一点很好。我对画布元素有这个问题。应用程序中的画布元素未正确销毁。最后,我们改进了画布销毁,而不是重复使用画布。@FlorianLoitsch很高兴知道!但是有没有办法帮助VM更好地管理持久对象呢?例如,如果它们有顶级最终引用,那么理论上它们不能被删除,VM应该优化它们(移动到持久内存)?大多数事情都是自动发生的。如果你的物体存活时间更长,它会进入旧的空间区域。从旧空间指向新空间的指针并不意味着新对象将存活很长时间。您的池模式示例是一个很好的反例。总的来说,如果东西一起死了,在同一时间分配它们是个好主意。