【问题标题】:Why Dart goes very slow after some time?为什么 Dart 在一段时间后变得很慢?
【发布时间】:2015-01-07 21:30:43
【问题描述】:

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

【问题讨论】:

标签: memory garbage-collection dart freeze


【解决方案1】:

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

http://en.wikipedia.org/wiki/Object_pool_pattern

小心画布,它是适当的破坏。

另一篇 GC 性能论文:

http://blog.tojicode.com/2012/03/javascript-memory-optimization-and.html

http://qt-project.org/doc/qt-5/qtquick-performance.html

【讨论】:

  • 重用对象并不总是有益的。 Dart VM(以及 V8)使用分代 GC。清理短暂的对象非常快。然而,跟踪从旧空间到新空间的指针是昂贵的。如果您继续重用对象,它们将迁移到老年代。如果您现在分配新对象并添加指向旧对象的指针,您将减慢程序速度,因为 VM 需要跟踪这些依赖关系。
  • 好点。我对画布元素有这个问题。应用程序中的画布元素未正确销毁。最后,我们改进了画布破坏而不是重复使用画布。
  • @FlorianLoitsch 很高兴知道!但是有没有办法帮助 VM 更好地管理持久对象呢?例如,如果它们具有顶级最终引用,那么理论上它们不能被删除,VM 应该优化它们(移动到持久内存)?
  • 大多数事情都是自动发生的。如果您的对象存活时间更长,它会进入旧空间区域。拥有从旧空间到新空间的指针并不意味着新对象会存活很长时间。您的池模式示例是一个很好的反例。一般来说,如果它们一起死,最好同时分配它们。
【解决方案2】:

有内存限制吗?

是的。 Dart 显然以可以在启动时配置的最大大小运行:

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

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

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

  • 找出导致内存耗尽的原因。通常不是您分配了太多对象。相反,典型的原因是所有不需要的对象仍然可以访问......通过您的应用程序构建的一些数据结构。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 2013-07-28
    • 2014-10-26
    • 2013-12-21
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多