在位复制位图是否会泄漏内存



我很好奇下面的代码是否会泄漏。。。

    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是否足够聪明,可以释放那里的数据?

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

也就是说,当位图被回收时,位图的本地备份存储也会被删除,但我建议在使用完第一个位图后手动删除它-将其保存在一个单独的引用中,并在其上调用recycle()。位图可能非常昂贵。

顺便说一句,如果createBitmap的点只是缩放,我会考虑在通过传递选项解码原始位图时缩小它。你将无法完全缩放到你想要的大小,但至少你不会得到一个笨拙的巨大位图,你会将其缩小到它的十分之一。这会更快,避免内存激增。

最新更新