Java 就地复制位图是否会泄漏内存?

Java 就地复制位图是否会泄漏内存?,java,android,memory-management,bitmap,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 Mat

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

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

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

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


非常有趣。。。需要明确的是,您的意思是,使用bitmapA作为源创建bitmapA的副本并将其吐回bitmapA不会泄漏最初在bitmapA中的字节?或者你是说在这种情况下不会,因为原始数据的内容恰好是来自摄影机的字节数据,当所有对该数据的引用都消失时,摄影机将本机释放这些字节数据?我的理解是位图数据不会以本机方式收集,除非您明确地将其设置为null。内存不会泄漏,句号。java不丢失“C++”之类的东西,如果你不再跟踪指针。它将知道有两个位图对象,并最终删除已放弃的一个。这两个位图之间没有连接,您使用另一个位图创建了一个位图,但一旦创建过程完成,它们之间将没有任何链接,因此每个位图都有自己的(昂贵的)内存块。我不同意。看看这个:过去我已经准备了很多文章,讨论如何手动发布位图以避免泄漏。。。虽然它不像C,但它很相似(而且可以说更糟,因为你无法强迫它释放内存!:)你误读了那篇文章。他们专门讨论了仍然存在位图引用的情况。在你的情况下,没有。在他们的例子中,这是由于一个
静态成员,这意味着它将永远存在。好吧,我想我的困惑是因为我看到了一个非常严重的内存不足异常,在我的应用程序的几次运行过程中,它会断断续续地发生,尽管我没有任何静态引用(据我所知),所以,显然内存没有被正确地分配,但我很难确定在哪里。。。因此,我的问题是关于这个特殊的策略,在这个问题中。图像存储在我保存在应用程序中的位图中,我担心这会把事情搞砸,但我不知道为什么会这样。