【问题标题】:Sizes of object for garbage collector垃圾收集器的对象大小
【发布时间】:2013-01-29 10:48:48
【问题描述】:

Ruby 中的垃圾收集器是否考虑了对象的大小和数量?为了优化,我正在考虑用Structs 或普通的Hashes 替换Class 实例。我想了解哪些给定的类将对垃圾回收产生最大的影响。

【问题讨论】:

  • 我想“是”或“否”不是您要寻找的答案...那么您真正想知道的是什么,为什么?请扩展您的问题,以便正确回答。
  • @Veger 谢谢,我更新了问题
  • 我认为这并不重要。如果一个对象是垃圾,它应该被收集。变大(或变小)并不会使它变得更多(或更少)垃圾。
  • 就垃圾收集而言,我认为这并不重要……但就实例化而言,它确实如此。答案是:对它进行基准测试。 AFAIK,实例化大量 Structs 比实例化相同数量的成熟类要快。

标签: ruby garbage-collection


【解决方案1】:

那个说你应该对它进行基准测试的人是对的——GC 是一个复杂的问题,很难给出 100% 正确的答案。

此外,这取决于所使用的实现。在 JRuby 中,是 JVM 做的工作。在 MRI 中,它是一种标记和扫描 GC。

在 MRI 的情况下,它的工作方式或多或少是这样的:每次 Ruby 解释器需要更多内存时,它都会运行 GC 来尝试释放它。如果没有足够的内存,它会分配更多。当没有对它的引用时,GC 会决定可以释放(“标记”它)一个对象。

我能给你的唯一建议是避免使用大量不能被垃圾回收的对象。例如,如果您正在构建一个字符串数组(它们的大小并不重要),与创建一个连接每个较小字符串的大字符串相比,您应该会看到性能下降的速度要快得多。

这是因为在后者中,GC可以在使用后销毁小字符串,而在前者中,数组始终保持对它们中的每一个的引用。

编辑:当然,这假设在内存中维护它们的成本大于处理“大字符串”的速度。在某些情况下,最好使用小字符串,然后将它们全部连接起来——这会导致单个操作缓慢。同样,这些只是没有基准的示例,不要太认真。

【讨论】:

    猜你喜欢
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多