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

为什么Android为了一张小小的照片要求巨大的内存分配?

扶珂
2023-03-14
Button _btn = (Button) findViewById(R.id.btn1);
_btn.setOnClickListener(new View.OnClickListener() {

     @Override
      public void onClick(View view) {
           Drawable _draw  = getResources().getDrawable(R.drawable.sea, null);
    }
});

E/AndroidRuntime:致命异常:主进程:com.a3sumatch.multipart,PID:29240 java.lang.OutOfMemoryError:在Dalvik.System.VMRuntime.NewNonmovableArray(本机方法)在Android.Graphics.BitmapFactor.NativeDecodeAsset(本机方法)在Android.Graphics.BitmapFactor.DecodeStream(BitmapFactor.java:609)在Android.Graphics.Drawable.CreateFromResourceStream(739)在android.os.handler.dispatchMessage(handler.java:95)在android.os.looper.loop(looper.java:171)在android.app.activitythread.main(activitythread.java:5611)在java.lang.reflect.Method.invoke(本机方法)在com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:732)在com.android.internal.os.zygoteinit.main(

共有1个答案

古文康
2023-03-14

我正在尝试在我的android手机上加载一张大小为965KB的jpeg照片

那是一张绝对巨大的照片。JPEG和PNG和WebP一样,是一种压缩文件格式。让我们来看看,一张3229x2480我秃头的照片在JPEG中是829.3KB。我希望你的每一个维度都要大一点。这个分辨率比我所知的任何Android设备屏幕的分辨率都高。

您的OutOfMemoryError用于362797068字节的分配。位图是图像的未压缩版本。362797068字节相当于大约一个9524x9524正方形图像(和4字节/像素)。

所以,你需要做两件事:

>

  • 如果在res/drawable/中有此图像,请将其移动到res/drawable-nodpi/

    沿每个维度将该图像的分辨率降低至少四倍

  •  类似资料:
    • 问题内容: 限制Java JVM上Permgen空间大小的目的是什么?为什么不总是将其设置为等于最大堆大小?Java为什么默认为这么少的64MB?他们是否正在试图通过这种方式迫使人们注意代码中的Permgen问题? 如果我的应用使用85MB的permgen,那么将其设置为96MB可能是安全的,但是如果它只是主堆的一部分,为什么还要设置得如此之小呢?允许JVM使用堆允许的PermGen效率不高吗?

    • 我们将和设置为1536m。现在,如果我理解正确的话,j-xmx表示堆的最大大小。 本系统采用4核15GB ram进程。 但是,当我检查正在运行的Java进程的RSS(使用top)时,我看到它使用的值比大,大约。 对于来说,有4个内核和15GB RAM的理想设置是什么(假设除了Java应用程序之外,系统中没有其他进程在运行)

    • 我正在Windows 8.1 64位上开发java swing应用程序,带有4GB内存和JDK版本8u20 64位。 问题是当我使用带有监视器选项的Netbeans profiler启动应用程序时。 加载第一个Jframe时,应用程序Memory Heap约为18mb,JVM进程大小约为50mb(Image1)。 然后,当我启动另一个Jframe时,它包含一个带有webView的JFxPanel,

    • 在堆上分配内存时,唯一的限制是可用RAM(或虚拟内存)。它产生Gb的内存。 那么,为什么堆栈大小如此有限(大约1 Mb)?什么技术原因阻止您在堆栈上创建真正大的对象? 更新:我的意图可能不清楚,我不想在堆栈上分配巨大的对象,也不需要更大的堆栈。这个问题只是纯粹的好奇心!

    • 问题内容: 我们正试图在我们的Web应用程序中找到导致大量内存泄漏的元凶。我们在发现内存泄漏方面经验有限,但是我们发现了如何使用Eclipse MAT进行Java堆转储并对其进行分析。 但是,对于我们使用56 / 60GB内存的应用程序,堆转储的大小仅为16GB,而在Eclipse MAT中则更少。 语境 我们的服务器将Ubuntu 14.04上的Wildfly 8.2.0用于我们的Java应用程

    • 我们正试图找到web应用程序中大内存泄漏的罪魁祸首。我们在查找内存泄漏方面的经验相当有限,但我们了解了如何使用创建java堆转储,并在Eclipse mat中对其进行分析。 但是,由于我们的应用程序使用56/60GB内存,堆转储的大小只有16GB,在Eclipse mat中就更少了。 对于我们的java应用程序,我们的服务器使用Ubuntu14.04上的Wildfly8.2.0,其进程使用了95%