Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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
针对小对象的池是否比Android';什么是Java垃圾收集器?_Java_Android_Garbage Collection - Fatal编程技术网

针对小对象的池是否比Android';什么是Java垃圾收集器?

针对小对象的池是否比Android';什么是Java垃圾收集器?,java,android,garbage-collection,Java,Android,Garbage Collection,所以,我在读这篇文章: 上面写着:“公共服务公告:对象池现在对除最重的对象之外的所有对象来说都是一个严重的性能损失,即使如此,在不引入并发瓶颈的情况下也很难做到正确”,并从表面上看了这一点。本文讨论了分代GC、释放、线程本地分配和转义分析 然而,我脑子里有一点声音问我,“但是Android中的垃圾收集器实现是真的吗?”我不知道答案。我甚至不知道如何去寻找答案 我记得在我的android应用程序中,当我为经常使用的小对象实现池时,GC运行的频率较低。不确定这是否意味着更快的应用程序。。此外,GC在

所以,我在读这篇文章: 上面写着:“公共服务公告:对象池现在对除最重的对象之外的所有对象来说都是一个严重的性能损失,即使如此,在不引入并发瓶颈的情况下也很难做到正确”,并从表面上看了这一点。本文讨论了分代GC、释放、线程本地分配和转义分析

然而,我脑子里有一点声音问我,“但是Android中的垃圾收集器实现是真的吗?”我不知道答案。我甚至不知道如何去寻找答案

我记得在我的android应用程序中,当我为经常使用的小对象实现池时,GC运行的频率较低。不确定这是否意味着更快的应用程序。。此外,GC在没有池的情况下运行的频率更高(根据logcat),所以我假设Android的GC实现会输给池。。但是这个假设没有什么支持,因为我没有注意到有或没有池的任何显著性能差异


所以。。这里有人知道对于经常使用的小对象,池是否比Android的GC更有效吗?

你的推理有一个谬误。GC运行得更频繁并不表示某种性能降低。那些更频繁的GC运行也可能比那些必须在对象池中混日子的不太频繁的GC运行快得多,寿命也短得多

也就是说,我做了一些研究,这里有一些想法。。。 几年前,我的手机只有一个核心。运行GC意味着从活动切换到GC线程。即使使用并发GC和多核(现代设备有2-5个afaik),也可能会有轻微的暂停

对于游戏来说,预先分配用户在下一个交互序列中可能需要的一切是一个好主意。基本上遵循实时应用程序的咒语,与在应用程序的用户体验部分具有一致的可测量性能相比,实时应用程序不太担心总体性能

这里有人知道对于经常使用的小对象,池是否比Android的GC更有效

这取决于你如何衡量“有效”、“小”和“经常”

对象池在Android本身的几个地方使用,例如:

  • AdapterView
    ListView
    和kin)的整个
    Adapter
    框架是围绕对象池设计的,这一次是针对相对较重的对象(例如,
    ListView
    行很容易达到几十KB)

  • SensorEvent
    对象被回收,这一次用于轻量级对象,可能每秒使用几十次

  • AttributeSet
    对象被回收,作为
    视图的一部分

等等

其中一些是基于Android早期版本中Dalvik的早期版本,当时我们的目标是使用纯解释语言和相当幼稚的GC引擎的100MHz以下的CPU

然而,即使在今天,对象池还有一个超越即时性能的巨大优势:堆碎片

Java的GC引擎是一个压缩垃圾收集器,这意味着可用堆空间的连续块被组合成更大的块。Dalvik的GC引擎是一个非压缩垃圾收集器,这意味着您分配的块永远不会成为更大块的一部分。这就是许多开发人员在位图管理中遇到麻烦的地方——他们得到的
OutOfMemoryError
不是因为堆没有空间,而是由于堆碎片,堆没有足够大的块来进行所需的分配

对象池可以避免堆碎片,只需防止池中的对象再次被垃圾收集,并且不经常为池分配新对象(仅当池由于同时使用过多而需要增长时)

游戏开发者长期以来一直在Android中使用对象池,这源于Android的垃圾收集是非并发的,在GC进行时“停止世界”。现在,大多数Android设备都使用了并发垃圾收集器,这在某些方面减轻了痛苦


因此,对象池肯定仍然是一种相关的技术。不过,在大多数情况下,我会将其视为对检测到的问题的反应(例如,Traceview在GC中显示的时间太多,Traceview在对象构造函数中显示的时间太多,MAT显示您有大量堆,但您从内存错误中得到了
)。游戏开发是一个例外——游戏开发者可能有自己的启发式方法来判断现代安卓设备何时还需要使用池。

值得注意的是,“现在”来自2005年的一篇文章,它并不是手持客户端软件之间的一个比较,你可以对资源需求进行明确的限制,vs应用服务器软件,需要支持任意数量的线程/节点竞争池资源。@SJuan76完全正确。你对GC有什么经验?我只为Android制作过小的、随意的游戏,从来没有达到过需要优化代码的程度,但我想知道我是否应该合用还是好的。@因为我不太明白你的意思。尽管如此,如果我需要支持多个线程,我会为每个线程提供自己的池。。我只是问安卓的GC,而不是比较客户端和服务器的资源需求。如果我有强烈的意见(作为安卓开发者,我做得很少);我主要是对日期提出了警告,因为当我第一次阅读你的文章时,感觉这是一个新的问题,而且(为了信息起见)细节很重要。我想说的是,应该避免使用池,池意味着增加内存使用以减少执行时间。因为我不希望移动应用程序会产生重物,所以我会选择