当前位置: 首页 > 知识库问答 >
问题:

BitmapFactory.DecodereSource和无法解释的内存不足

刘元青
2023-03-14

我得到一个奇怪的内存不足错误解码一个可绘制的图像资源960x926px jpg,分配3555856字节。图像仅放置在drawable-xxhdpi(3x)中,而我使用的是hdpi(1.5x)设备。两个问题:

>

  • 为什么堆中有足够的空闲内存却出现错误?

    03-18 17:30:15.050 327 50-32750/?D/DALVIKVM:GC_FOR_ALLOC释放10809K,49%释放23735K/46087K,暂停89ms,总计89ms

    03-18 17:30:15.050 327 50-32750/?I/dalvikvm-heap:强制收集3555856字节分配的SoftReferences

    03-18 17:30:15.160 327 50-32750/?D/DALVIKVM:GC_BEFORE_OOM释放29K,49%释放23705K/46087K,暂停103ms,总计103ms

    03-18 17:30:15.160 327 50-32750/?E/dalvikvm-heap:3555856字节分配内存不足。

    03-18 17:30:15.160 327 50-32750/?I/Dalvikvm:“main”prio=5 tid=1可运行

    03-18 17:30:15.160 327 50-32750/?I/dalvikvm:group=“main”scount=0 dscount=0 obj=0x418fc6a0 self=0x4010c008

    03-18 17:30:15.160 327 50-32750/?I/DalvikVM:在Android.Graphics.BitmapFactory.NativeDecodeAsset(本机方法)

    03-18 17:30:15.160 327 50-32750/?I/DalvikVM:在Android.Graphics.BitmapFactory.DecodeStream(BitmapFactory.java:636)

    03-18 17:30:15.160 327 50-32750/?I/DalvikVM:在android.graphics.bitmapfactory.decodereSourceStream(bitmapfactory.java:484)03-18 17:30:15.160 327 50-32750/?I/DalvikVM:在android.graphics.bitmapfactory.decodereSource(bitmapfactory.java:512)

    03-18 17:30:15.160 327 50-32750/?I/DalvikVM:在android.graphics.bitmapfactory.decodereSource(bitmapfactory.java:542)

  • 共有1个答案

    壤驷瑾瑜
    2023-03-14

    1)如果hdpi文件夹中没有较小的版本,它将使用最接近的匹配版本。因此,如果没有hdpi或Drawable/版本存在,它将使用xxhdpi。

    2)它不会自动缩放。它会读全尺寸。

    3)如果这导致OOM,那么您可能使用了太多的内存。

     类似资料:
    • 我正在调试一个Azure Web应用程序上无法解释的内存消耗。我花了很多时间使用dotmemory、perfview和诊断工具挖掘日志、内存转储,但仍然无法理解为什么我们的应用程序内存一整天都在稳步增长。 我在堆中验证了多次,以确保请求前后的应用程序对象/模块都被释放,上面的屏幕截图显示了这一点。 如果你能分享一些关于如何找到消耗内存的东西的建议,我会的

    • 问题内容: 首先,我对JNA和Java如何直接本机内存分配的理解充其量只是内在的,因此,我试图描述我对正在发生的事情的理解。除了回应以外的任何更正都会很棒。 我正在运行一个使用JNA混合Java和C本机代码的应用程序,并且遇到了一个可重现的问题,Java垃圾收集器无法释放对直接本机内存分配的引用,导致C堆内存不足。 我很肯定我的C应用程序不是分配问题的根源,因为我将A传递到我的C代码中,修改了缓冲

    • 问题内容: 我应该在将分配的字符串传递给之后释放它吗? 我有一些类似的代码: 在将字符串传递给之后释放字符串时,出现错误。如果我删除呼叫,该错误消失。我究竟做错了什么? 我看到矛盾的意见。有人说我应该自己释放它,有人说VM释放它,有人说VM不释放它,而您应该用奇怪的巫术魔术来释放它。我很困惑。 问题答案: 参数to 的存储完全由您负责:如果您分配了,则需要它。因此,您发布的代码段是正确的。您正在其

    • 在docker容器中运行的Java应用程序 没有调用本机代码,没有已处理的启动,没有DLL/。所以文件被引用了 JVM参数: Docker硬盘内存限制设置为 JVM似乎正常(正常的GC周期,没有内存泄漏,没有OOM) Docker内存一直在增长,直到达到硬限制(),导致终止并重新启动容器 为什么docker统计内存持续增长(导致每天都遇到硬内存限制),尽管JVM似乎在其限制范围内运行。 对于其他微

    • 问题内容: 什么是JSONP,为什么需要它,以及在使用中的一些实际示例? 问题答案: JSONP表示带填充的JSON,它为客户端提供了一种方法,该方法可以指定一些应添加到JSON响应的开始的代码。这允许JSONP响应直接在浏览器中执行。JSONP响应的示例可能是: 我认为JSONP有用的主要地方是使用标签跨域发出请求。我认为主要缺点是,由于直接执行JSONP,因此您必须相信远程站点不会发回任何恶意

    • 问题内容: 我正在研究真正了解JVM中内存分配的工作方式。我正在编写一个内存不足的应用程序:堆空间异常。 我知道我可以传入VM参数(例如Xms和Xmx)来增加JVM为正在运行的进程分配的堆空间。这是解决此问题的一种可能的解决方案,或者我可以检查代码是否存在内存泄漏并在那里解决问题。 我的问题是: 1)JVM如何实际为其分配内存?这与OS如何将可用内存传递给JVM有什么关系?或更一般而言,任何进程的