垃圾收集器与池

时间:2012-02-10 11:07:44

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

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

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

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

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

我读到android GC不是“evolved”(它基本上是在内存不足时运行的。)另外我不知道是否只删除对树的根的每个引用都会让gc垃圾收集全部单个传递中的树,或者只有gc的节点,然后是下一个传递的那个节点的子节点,等等。

1 个答案:

答案 0 :(得分:1)

首先,您需要了解GC是否为您担心。所以用-verbosegc运行你的应用程序。如果您的GC报告性能问题或内存累积,您可以担心它。否则就要从你要做的事情中消除它。

GC适用于几代人。基本上,您的分配分为几代。当您的应用程序加载时,所有分配都属于第0代。随着应用程序的进展,您的分配将被放入第1代和第2代。运行时GC不会像第1代那样经常在第0代上运行。同样,它也不会运行更常见的是在第1代,就像第2代一样。这是假设您在加载时分配的对象不需要像以后创建的对象那样经常被释放。

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

  • 在任何应用程序中,对象都可以根据它们进行分类 生命线。
  • 有些物品是短暂的,例如大多数物体 变量,有些是长寿的,如骨干的 应用。
  • 关于世代垃圾收集的想法是 通过在应用程序中的理解而成为可能 一生中,大多数实例化的对象都是短命的,那就是那里 长寿命对象与短命对象之间的联系很少 对象。