2014-02-24 82 views
0

我的問題是關於我面臨的內存泄漏(android開發),但無法找到相同的根本原因。內存泄漏 - 初始化另一個類的位圖類型實例變量

我有兩個類 - A和B. A類的對象是B - objectB。 B類有一個Bitmap類型的實例變量mTempBitmap。 在A類中,我創建了一個位圖對象aBitmapObject & initialize - objectB.mTempBitmap = aBitmapObject。 在B類中,我在API onDraw()中將mTempBitmap設置爲null。

現在會發生什麼,在每次按鍵時,objectB的mTempBitmap被更新,然後調用objectB.onDraw。 但是,如果我們按鍵速度太快,有時onDraw()不會被調用。

在這種情況下,我可以看到內存泄漏。如果我使用堆轉儲並使用內存分析器MAT工具進行分析,則會發現50-60個位圖對象,這不是預期的。

所以,我不清楚Java的內存泄漏的定義,但我讀了幾個SO帖子。

在上述情況下內存泄漏發生的原因可能是onDraw()沒有被調用,而objectB.mTempBitmap沒有被更新爲空? (afaik,即使objectB.mTempBitmap不是空的,後面的mTempBitmap會指向另一個位圖,所以應該沒有內存泄漏的問題。) 是否因爲某處的位圖副本被創建並泄漏出來?當我們初始化objectB.mTempBitmap = aBitmap時,有沒有創建位圖的任何副本,或者只是將另一個引用附加到相同的位圖? (afaik,只是另一個參考相同的位圖,沒有新的位圖副本創建)

如果有人有想法,幫助!

回答

1

將變量設置爲null不會釋放內存。當(非正式)存儲器被自動解除分配時,您無法訪問它。如果你這樣做:

someField = new Bitmap(...); 
someField = new Bitmap(...); 

那麼第一個位圖可以被釋放,即使您沒有設置任何空。如果你再做一遍:

someField = new Bitmap(...); 

然後第二個位圖也可以被解除分配。所以這不會導致內存泄漏。如果你有內存泄漏,其他的事情正在導致它。