java - 就地复制位图会泄漏内存吗?

标签 java android memory-management bitmap

我很好奇下面的代码会不会泄露...

    data = getBitmapdataFromCameraCallback();//this is immutable, so...
    //make a mutable copy...
    originalUserPhoto = BitmapFactory.decodeByteArray(data, 0, data.length).copy(Config.ARGB_8888, true);

    Matrix matrix = new Matrix();
    // -1 doesn't reverse it for some oddball reason, so, we get REALLY close to -1
    matrix.preScale(-0.999f, 1.0f);//don't ask don't tell

     originalUserPhoto = Bitmap.createBitmap(originalUserPhoto, 0, 0,
          originalUserPhoto.getWidth(), originalUserPhoto.getHeight(),    
          matrix, true);

如果我在原地修改 originalUserPhoto(注意我将它作为 createBitmap 的源传递),是否会泄露原始数据?或者 JVM 是否足够智能以释放那里的数据?

最佳答案

是也不是。您有两个 Bitmap 对象(第一个由 decodeByteArray 创建,第二个由 createBitmap 创建),而第一个没有引用它,因此在未来的垃圾收集周期中,它可能会被删除。

虽然位图的 native 后备存储也会在回收位图时被删除,但我建议您在使用完第一个位图后手动删除它 - 将其保存在单独的引用中并调用 recycle() 就可以了。位图可能非常昂贵。

顺便说一句,如果您的 createBitmap 只是为了缩放,我会考虑在您通过传入选项对其进行解码时缩小原始位图。您将无法精确地缩放到您想要的大小,但至少您最终不会得到一个您将缩小到其大小的十分之一的笨重的巨大位图。这样会更快并且避免内存峰值。

关于java - 就地复制位图会泄漏内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9039798/

相关文章:

c++ - `std::string` 分配是我当前的瓶颈 - 如何使用自定义分配器进行优化?

java - 最大化 Java 堆空间

java - Vector 中的竞争条件

java - 创建了我自己的二分搜索版本,不明白为什么它比常规方法更快?

onClick 上的 Java/Android NullPointerException

android - MapFragment UI 控制按钮功能正常但不可见

c++ - 是否可以在其范围之外访问局部变量的内存?

java - Firebase Android 中的 ListView 制作

java - 如何在 com.sun.jdi.ObjectReference 上中止长时间运行的 invokeMethod?

android - 使用 ndk 和 ffmpeg 和 opencv 在 Android 上进行视频处理非常慢