内存泄漏 - 初始化另一个类的位图类型实例变量

时间:2014-02-24 10:17:02

标签: java android memory-leaks bitmap android-memory

我的问题是关于我面临的内存泄漏(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没有被更新为null? (afaik,即使objectB.mTempBitmap没有为null,以后mTempBitmap也会指向另一个位图,所以应该没有内存泄漏问题。) 是因为某处的位图副本被创建并且它们泄漏了?当我们初始化objectB.mTempBitmap = aBitmap时,是否有任何创建的位图副本,或者只是另一个引用被附加到相同的位图? (afaik,只是另一个引用相同的位图,没有创建新的位图副本)

如果有人有想法,请帮助!

1 个答案:

答案 0 :(得分:1)

将变量设置为null不会释放内存。当(非正式地)无法访问它时,内存会自动释放。如果你这样做:

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

然后即使您没有将任何设置为null,也可以释放第一个Bitmap。如果你再这样做:

someField = new Bitmap(...);

然后第二个位图也可以解除分配。所以这不会导致内存泄漏。如果你有内存泄漏,还有其他原因导致它。