【问题标题】:Memory Leak - Initialize bitmap type instance variable of another class内存泄漏 - 初始化另一个类的位图类型实例变量
【发布时间】:2014-02-24 10:17:02
【问题描述】:

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

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

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

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

所以,虽然我阅读了一些关于它的 SO 帖子,但我并不清楚 Java 中内存泄漏的定义。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    那么即使您没有将 anything 设置为 null,也可以释放第一个 Bitmap。如果你再做一次:

    someField = new Bitmap(...);
    

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

    【讨论】:

      猜你喜欢
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 2015-11-05
      • 2011-06-21
      相关资源
      最近更新 更多