【问题标题】:Garbage Collector vs Pool垃圾收集器与池
【发布时间】:2012-02-10 11:07:43
【问题描述】:

我正在运行涉及创建树的模拟。 我的树有一个从 2/3 到 7/8 的分支因子。

每次我需要扩展它时,我都会为孩子分配一个数组。 我经常在新树上创建一个分支(通过将根的孩子设置为根),所以我的树的其余部分变成了垃圾。

我想知道让垃圾收集器完成他的工作(我“建议”他在我更改树根时使用 System.gc() 开始收集)或为 TreeNodes 实现我自己的池是否更好,并且当我更改根时,回收所有现在无用的节点。

答案可以理解为:android 垃圾收集器是否经过优化,或者是否比限制对象的创建/销毁更可取,即使这非常消耗?(我需要遍历所有树,并附加每个无用的节点到我的池的堆栈)

我读到 android GC 没有“进化”(它基本上在内存不足时运行。)此外,我不知道是否只是删除对树根的每个引用会让 gc 垃圾收集所有单遍中的树,否则它将仅 gc 节点,然后该节点的子节点在下一遍,依此类推..

【问题讨论】:

    标签: java android memory-management garbage-collection tree


    【解决方案1】:

    首先,您需要了解 GC 是否让您担心。因此,使用 -verbosegc 运行您的应用程序。如果您的 GC 报告性能问题或内存增加,您可以担心。否则将其从您的待办事项中消除。

    GC 对世代有效。基本上你的分配被分成几代。当您的应用程序加载时,所有分配都属于第 0 代。随着应用程序的进展,您的分配被放入第 1 代和第 2 代。运行时的 GC 在第 0 代上并不像在第 1 代上那样经常工作。同样,它不会运行在第 1 代和第 2 代上更频繁。这是假设您在加载时分配的对象不需要像稍后创建的对象那样经常被释放。

    来自http://chaoticjava.com/posts/how-does-garbage-collection-work/的有趣引用

    • 在任何应用程序中,对象都可以根据其分类 生命线。
    • 某些对象是短暂的,例如大多数本地对象 变量,有些是长期存在的,例如 应用。
    • 关于分代垃圾收集的想法是 在应用程序的理解下使之成为可能 生命周期中,大多数实例化的对象都是短暂的,并且存在 长寿命对象与短寿命对象之间几乎没有联系 对象。

    【讨论】:

    • 我已经阅读了那篇文章(是的,它真的很有趣),但我专门讨论的是 android gc。在我的应用程序中,它经常运行(logcat 打印 GC_Concurrent,free x% y/z,耗时 5ms + 6ms)。在我的应用程序上不是性能问题(它仍然运行 60fps),我最想知道 android(so mobile) 平台的最佳实践(这篇文章来自 2008 年,所以我不认为它可以应用于android gc,另外我认为android gc在以后的版本中改变了很多)
    • 实现自己的树节点实际上是一种有趣的解决方法。问题是你在这里测量什么。如果您不测量性能,那么内存利用率?除非你知道你在这里测量的是什么,否则你不知道它们能给你带来什么好处。 GC 是否占用了太多时间,您没有从您的应用程序中得到您期望的响应吗?是不是太占内存了?你认为通过编写自己的池,你会提高 gc 吗?如果 gc 是你的问题,那么你应该测量 gc 用了多少时间,然后写你的池,然后再次测量。你在测量吗?
    • 我已经有一个通用池,因此为我的 TreeNode 编写一个池是在请求 TreeNode 时更新为正确的值,并在回收 TreeNode 时遍历树以回收所有子节点。内存现在似乎不是问题(我还没有尝试过长时间的模拟,因为我的代码中还有一些错误要解决),cpu 也不是,但因为我在移动设备上运行,我的代码效率越高,我会让用户浪费的电池就越少,而 android 在这个问题上很残酷(它清楚地显示了一个应用程序消耗了多少电池)。不,我不是在测量..(好点)
    • 要衡量,与固定的东西进行比较很重要。例如,您在所有硬件上的分配样本。我建议您在 2 个 CPU、2Gb 台式机和您的移动设备上进行测量。这会给你一个你无法跨越的“最大值”。您还应该在 1 个 CPU、1Gb 的桌面上运行相同的测试。在所有测试和硬件中保持 jdk 版本 1.6。我知道你现在在想什么,测量桌面是否相关。它将是,它将为您提供“最大”的响应时间,即遍历树所花费的时间。
    猜你喜欢
    • 1970-01-01
    • 2017-11-03
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2011-11-07
    • 2013-04-01
    相关资源
    最近更新 更多