2012-02-10 102 views
1

我正在运行涉及创建树的模拟。 我的树有2/3到7/8的分支因子。垃圾收集器vs池

每次我需要扩展它,我为孩子分配一个数组。 很多时候,我通过设置一个根的子树作为一棵树的新树(所以我的树的其余部分变成垃圾)。我想知道是否让垃圾收集器做他的工作更好(我建议“当我更改树根时,他开始收集System.gc()),或实现我自己的TreeNodes池,当我更改根目录时,请回收所有现在无用的节点。

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

我读到,Android GC不是“进化”(它基本上运行时,你有低内存。)此外,我不知道是否删除每一个引用树的根会让gc垃圾一次收集所有的树,或者它只会gc节点,然后该节点的子节点再次通过,依此类推。

回答

1

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

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

http://chaoticjava.com/posts/how-does-garbage-collection-work/

  • 在任何应用中有趣的报价,对象可以根据自己的 生命线进行分类。
  • 某些对象是短命的,例如大多数本地变量,而其中一些是长期存在的,如 应用程序的主干。
  • 有关代世代垃圾收集的想法是 的理解是,在应用程序的生命周期中,大多数实例化对象都是短命的,并且在那里存在长寿命对象与短寿命之间的很少连接 对象。
+0

我已经阅读过那篇文章(是的,它真的很有趣),但我正在专门讨论android gc。在我的应用程序中,它经常运行(logcat打印GC_Concurrent,空闲x%y/z,采用5ms + 6ms)。在我的应用程序不是一个性能问题(它仍然运行60fps),我最想知道的最佳做法**为Android(移动)**平台(文章是从2008年,所以我不认为它可以应用在android gc上,另外我认为android gc在以后的版本中有很大的改变) – 2012-02-10 11:43:09

+0

实现你自己的treenodes实际上是解决它的一个有趣的方法。问题是你在这里测量什么。如果你不衡量性能,那么内存利用率?除非你知道你在这里测量什么,否则你不知道可以给你带来什么好处。GC是否占用了太多时间,难道你没有得到你期望从你的应用程序的回应?它占用了太多的内存吗?你认为通过编写自己的游泳池,你会提高gc吗?如果gc是你的问题,那么你应该测量gc耗尽多少时间,然后写下你的池子,然后再测量一次。你测量了吗? – Siddharth 2012-02-10 11:56:11

+0

我已经有了一个通用池,因此为我的TreeNode编写一个池是在请求TreeNode并遍历树以在回收TreeNode时回收所有子节点时更新为正确值的问题。内存现在不会出现问题(我还没有尝试过很长时间的模拟,因为我的代码中仍然有一些bug需要解决),而且cpu也不算太多,但是因为我在移动设备上运行,我的代码效率越高,电池消耗越少,使用户浪费,而Android对这个问题也很残酷(它清楚地显示了一个应用消耗多少电量)。不,我不测量..(好点) – 2012-02-10 12:10:32