2014-02-24 45 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(...); 

然后第二个位图也可以被解除分配。所以这不会导致内存泄漏。如果你有内存泄漏,其他的事情正在导致它。