gpt4 book ai didi

java - Finalize 方法中的位图回收无法正常工作

转载 作者:行者123 更新时间:2023-12-01 14:47:10 25 4
gpt4 key购买 nike

当我尝试加载大小接近应用程序堆最大大小的图像时,我的应用程序发生崩溃。第一次加载图像很好,然后我删除了对 Bitmap 对象的引用,并在调用 mBitmap.recycle()//nativeRecycle 的地方完成了它的完成。显然内存使用量减少了,但是当我尝试再次加载图像时,我遇到了内存不足的崩溃。有趣的是,如果我在删除引用的同一个类中调用回收,似乎内存被释放,我可以再次加载图像。所以基本上,如果我直接调用 mBitmap.recycle() 与将 mBitmap.recycle() 放在引用位图的对象的终结中,我会得到不同的结果。知道为什么会发生这种情况吗?

最佳答案

如果您非常接近使用堆的最大大小,那么您可能只是幸运(或不幸)。直接调用 recycle() 与从终结器调用它可能会改变 GC 的时间和行为,从而使您看到差异。

在尝试重新分配位图之前,您确定正在调用终结器(和 recycle())吗?终结器不可靠,并且可以无限期推迟。即使您当前在测试期间看到在重新分配之前调用终结器,也不能保证这种情况总会发生(特别是对于不同的堆状态或 future /不同版本的 Dalvik)。

如果可以的话,请尽可能尝试从终结器外部调用recycle()。如果您知道何时完成,只需调用该方法即可;否则请考虑使用 ReferenceQueue ( https://stackoverflow.com/a/10879076/150001 )。

自从我查看 Dalvik 以来已经有一段时间了,但我似乎记得位图缓冲区可能需要几个 GC 周期才能清理,因为虚拟机需要确保没有 native 代码有任何剩余的指针。因此,缓冲区可能不会按照您预期的时间准确释放。

堆 fragment 也有可能导致问题,尽管大缓冲区很可能是使用 mmap() 分配的,并且不会导致 fragment (再次取决于 Dalvik 的当前版本)。

关于java - Finalize 方法中的位图回收无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15312716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com