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

标签 java android memory-leaks bitmap android-memory

我的问题是关于我面临的内存泄漏(android 开发),但无法找到其根本原因。

我有两个类(class) - A 和 B。 类 A 有一个对象 B - objectB。 B类有一个Bitmap类型的实例变量mTempBitmap。 在 A 类中,我创建一个位图对象 aBitmapObject 并初始化 - objectB.mTempBitmap = aBitmapObject。 在B类中,我在API onDraw()中将mTempBitmap设置为null。

现在发生的是,每次按键时,objectB 的 mTempBitmap 都会更新,然后调用 objectB.onDraw。 但是,如果我们按键太快,有时 onDraw() 将不会被调用。

在这种情况下,我可以看到内存泄漏。如果我进行堆转储并使用内存分析器 MAT 工具进行分析,我会发现 50-60 个位图对象,这是意料之外的。

所以,我不清楚 Java 中内存泄漏的定义,尽管我读了几篇关于它的文章。

上述情况发生的内存泄漏是否是因为 onDraw() 没有被调用,并且 objectB.mTempBitmap 没有更新为 null ? (据我所知,即使objectB.mTempBitmap没有设为null,稍后mTempBitmap也会指向另一个位图,所以应该不存在内存泄漏的问题。) 是因为在某个地方创建了位图副本并且它们泄漏了?当我们初始化 objectB.mTempBitmap = aBitmap 时,是否创建了位图的任何副本,或者只是将另一个引用附加到同一位图? (据我所知,只是对同一位图的另一个引用,没有创建新的位图副本)

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

最佳答案

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

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

那么即使您没有将任何内容设置为空,也可以释放第一个位图。如果您再次这样做:

someField = new Bitmap(...);

那么第二个位图也可以被释放。所以这不会导致内存泄漏。如果出现内存泄漏,则可能是其他原因造成的。

关于java - 内存泄漏 - 初始化另一个类的位图类型实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21984763/

相关文章:

Java Apache HTTP 错误 : Receiving CRLF expected at end of chunk

android - getLastKnownLocation() 返回 null

linux - 如何在 clojure + jvm 1.8 中查找内存 "leaks"

java - http 响应中出现无法读取的字符

java - 在二叉树中按字母顺序排列字符串

java - 从侧面包中抛出异常是否正确?

android - 检测应用程序何时保持屏幕开启

android - 如何在recyclerview中的线性布局中设置重力?

c++ - HBITMP 的 WIndows 函数 DestroyObject 不能很好地工作(内存泄漏)

memory-management - 关闭内存泄漏