系统相关
首页 > 系统相关> > java-复制位图到位会泄漏内存吗?

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

作者:互联网

我很好奇以下代码是否会泄漏…

    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对象(第一个是由cryptoByteArray创建的,第二个是由createBitmap创建的),而第一个没有任何引用它的对象,因此在将来的垃圾回收周期中,它很可能会被删除.

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

顺便说一句,如果createBitmap的要点只是按比例缩放,那么我会考虑通过传递选项对原始位图进行解码时将其按比例缩小.您将无法缩放到所需的大小,但是至少您最终不会得到一个庞大的位图,并且只能缩小到其大小的十分之一.这样会更快,并避免内存高峰.

标签:bitmap,memory-management,java,android
来源: https://codeday.me/bug/20191201/2083597.html