Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 垃圾收集器与池_Java_Android_Memory Management_Garbage Collection_Tree - Fatal编程技术网

Java 垃圾收集器与池

Java 垃圾收集器与池,java,android,memory-management,garbage-collection,tree,Java,Android,Memory Management,Garbage Collection,Tree,我正在进行模拟,包括创建一棵树。 我的树的分支因子是2/3到7/8 每次需要展开时,我都会为子级分配一个数组。 我经常将一个分支作为新树(通过将根的子级设置为根),因此树的其余部分成为垃圾 我想知道是让垃圾收集器完成他的工作(我“建议”他在我更改树根时开始使用System.gc()进行收集)还是实现我自己的树节点池更好,当我更改树根时,回收所有现在无用的节点 答案可以理解为:android垃圾收集器是非常优化的,还是更倾向于限制对象的创建/销毁,即使这非常消耗?(我需要遍历所有树,并将每个无用节

我正在进行模拟,包括创建一棵树。 我的树的分支因子是2/3到7/8

每次需要展开时,我都会为子级分配一个数组。 我经常将一个分支作为新树(通过将根的子级设置为根),因此树的其余部分成为垃圾

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

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


我了解到android GC没有“进化”(它基本上在内存不足时运行)此外,我不知道删除对树根的所有引用是否会让GC在一次传递中垃圾收集所有树,或者只对节点进行GC,然后在下一次传递中对该节点的子节点进行GC,依此类推。

首先,您需要了解GC是否是您的担忧。因此,请使用-verbosegc运行您的应用程序。如果您的GC报告性能问题或内存累积,您可以对此感到担忧。否则,就把它从你要做的事情中剔除

GC对代进行工作。基本上,您的分配分为几代。当应用程序加载时,所有分配都属于第0代。随着应用程序的发展,您的分配将进入第1代和第2代。GC在运行时在第0代上不像在第1代上那样经常工作。同样,它在第1代上的运行频率也不会像在第2代上那样高。这样做的前提是,加载时分配的对象不需要像以后创建的对象那样频繁地释放

有趣的引用自

  • 在任何应用程序中,对象都可以根据其属性进行分类 生命线
  • 有些对象是短期的,例如大多数局部对象 变量,有些是长寿命的,例如 应用程序
  • 关于代际垃圾收集的想法是 理解到在应用程序中™s 在生命周期内,大多数实例化的对象都是短期的,而且 长寿对象与短命对象之间的连接很少吗 对象

首先,您需要了解GC是否是您的担忧。因此,请使用-verbosegc运行您的应用程序。如果您的GC报告性能问题或内存累积,您可以对此感到担忧。否则,就把它从你要做的事情中剔除

GC对代进行工作。基本上,您的分配分为几代。当应用程序加载时,所有分配都属于第0代。随着应用程序的发展,您的分配将进入第1代和第2代。GC在运行时在第0代上不像在第1代上那样经常工作。同样,它在第1代上的运行频率也不会像在第2代上那样高。这样做的前提是,加载时分配的对象不需要像以后创建的对象那样频繁地释放

有趣的引用自

  • 在任何应用程序中,对象都可以根据其属性进行分类 生命线
  • 有些对象是短期的,例如大多数局部对象 变量,有些是长寿命的,例如 应用程序
  • 关于代际垃圾收集的想法是 理解到在应用程序中™s 在生命周期内,大多数实例化的对象都是短期的,而且 长寿对象与短命对象之间的连接很少吗 对象

我已经读过那篇文章(是的,它真的很有趣),但我是专门谈论android gc的。在我的应用程序中,它需要经常运行(logcat并发打印GC_,免费x%y/z,耗时5ms+6ms)。在我的应用程序上,这不是一个性能问题(它仍然运行60fps),我最想知道的是android(如此移动)平台的最佳实践(这篇文章是从2008年开始的,所以我认为它不能应用在android gc上,此外,我认为android gc在以后的版本中改变了很多)实现自己的treenodes实际上是一种有趣的解决方法。问题是你在测量什么。如果不测量性能,那么内存利用率是多少?除非你知道你在这里衡量的是什么,否则你不知道这两者都能给你带来什么好处。GC是否占用了太多的时间,您是否从应用程序中获得了预期的响应?是不是占用了太多的内存?您认为通过编写自己的池,您会改进gc吗?如果gc是您的问题,那么您应该测量gc使用了多少时间,然后写入池,然后再次测量。您正在测量吗?我已经有一个通用池,因此为我的TreeNode编写池需要在请求TreeNode时更新到正确的值,并在循环TreeNode时遍历树以循环所有子级。内存目前还不是问题(我还没有尝试过很长时间的模拟,因为我的代码中还有一些bug需要解决),cpu也不是问题,但由于我在手机上运行,我的代码效率越高,我会让用户浪费的电池就越少,而android在这个问题上很残酷(它清楚地显示了一个应用程序消耗的电池数量). 不,我不是在测量。。(好的观点)要衡量,重要的是你要与固定的东西进行比较。例如,您在所有硬件上的分配示例。我建议您在2CPU、2Gb桌面上进行测量,您的移动设备也是如此。这会给你一个你无法跨越的“最大值”。您还应该在1CPU、1Gb的桌面上运行相同的测试。在所有测试和硬件中保持jdk版本1.6。我知道你现在在想什么,测量桌面是否相关。它将是,它将给你“最大”的响应