2015-06-02 1026 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強制垃圾收集器保持對象完好無損,直到堆中沒有足夠的可用空間。