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