2015-06-02 1027 views
1

我有一个类MyClass,它包含一个大的缓冲区,大约12Mb。Android - 有效的性能和内存管理

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

什么是最大的内存和性能明智的方式: 为每个更新创建一个新的对象,并让以前的对象被垃圾回收或总是使用同一个对象?并且,不使用相同的对象创建内存泄漏?

或者,在代码:

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

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

我试图使这个问题的普遍,可能更好,但我已经准备好了如果需要添加任何细节。

+1

对象实例获取内存和时间...我认为第一个是最高效的。 –

回答

1

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

但我不知道Android中的虚拟机如何表现。当然,当你的MyClass总大小很大时,它仍然会在堆中创建。

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

因此,每次创建新的大对象时,都会导致快速内存使用,并且经常运行垃圾回收器。这会显着减慢应用程序的执行和响应速度。另一方面,当你在外面创建单个对象时,它不会导致垃圾收集开销,但它的整个内存仍然被占用整个时间,并且不能被垃圾收集,即使对象没有被使用在很快时刻。

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

WeakReference只允许您在没有垃圾收集的情况下获取对象的引用。

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