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

时间:2015-06-02 09:53:06

标签: java android memory-management memory-leaks

我有一个MyClass类,它包含一个大缓冲区,大约12Mb。

当我的应用程序正在运行时,此类的实例经常(每秒50次)更新。

最具记忆性和性能的方法是什么: 为每个更新创建一个新对象,让前一个对象被垃圾收集或总是使用同一个对象?并且,不使用相同的对象创建内存泄漏?

或者,在代码中:

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

优于

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

我正在努力使这个问题尽可能普及,但我准备在需要时添加任何细节。

1 个答案:

答案 0 :(得分:1)

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

但我不知道Android中的VM是如何运作的。当然,当你的MyClass总大小很大时,无论如何它都将在堆中创建。

当在堆中创建对象,并且不再引用它时,它将被垃圾收集,这意味着将检查和/或移动所有其他对象以释放未使用的空间。这需要CPU资源并减慢应用程序。

因此,每次创建新的大对象时,都会导致内存使用速度快,并且经常运行垃圾收集器。这可能会大大减慢应用程序的执行和响应速度。

另一方面,当你在外面创建单个对象时,它不会导致垃圾收集开销,但它的整个内存仍然占用整个时间,并且不能被垃圾收集,即使不使用对象在很短的时间内。

良好的妥协是使用WeakReferenceSoftReference。它是对象的引用容器,但它们不会阻止对象被垃圾回收。因此,您可以重用您的对象(如果它保留在内存中),或者只有在引用丢失的情况下才创建新对象

WeakReference只允许你获取对象的引用,如果它还没有被垃圾收集。

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