Android - 有效的性能和内存管理

Android - effective performance and memory management

我有一个 class MyClass,其中包含一个大缓冲区,大约 12Mb。

当我的应用程序运行时,此 class 的实例会不断更新(每秒 50 次)。

内存和性能最明智的方法是什么: 为每次更新创建一个新对象并让前一个对象被垃圾收集或始终使用同一个对象?而且,使用同一个对象不会造成内存泄漏吗?

或者,在代码中:

MyClass object = new MyClass();
while(appIsRunning)
{
    if (getUpdatedObject(object))
       doSomething(object);
}

优于

while(appIsRunning)
{
    MyClass object = new MyClass();
    if (getUpdatedObject(object ))
       doSomething(object);
}

我试图让这个问题尽可能常见,但如果需要,我准备添加任何细节。

一些 java 虚拟机在创建已知大小的小对象时,不会在其范围之外查看,而是在堆栈中而不是在堆中创建对象。例如 oracle JVM 在第 7 版之后这样做。因此,在内部创建小的常量大小的临时数组可能更有效。

但我不知道 Android 中的 VM 表现如何。当然,当您的 MyClass 总大小很大时,无论如何都会在堆中创建它。

当对象在堆中创建,并且不再引用它时,它将被垃圾收集,这意味着将检查所有其他对象 and/or 移动到空闲未使用的 space。这需要 CPU 资源并降低应用程序速度。

所以,当你每次创建新的大对象时,它会导致快速内存使用,并且经常 运行 垃圾收集器。这会大大降低应用程序的执行和响应速度。

另一方面,当你在外部创建单个对象时,它不会导致垃圾收集开销,但它的整个内存一直被占用,并且无法被垃圾收集,即使对象没有被使用瞬间.

好的折衷方案是使用 WeakReference or SoftReference。它是对象引用的容器,但它们不会阻止对象被垃圾收集。因此,您可以重用您的对象(如果它保存在内存中),或者仅在引用丢失时创建新对象

WeakReference 只允许您获取对尚未被垃圾回收的对象的引用。

SoftReference 强制垃圾收集器保持对象完好无损,直到堆中没有足够的可用空间 space。