Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何找到OutOfMemoryError的原因?_Java_Android_Out Of Memory - Fatal编程技术网

Java 如何找到OutOfMemoryError的原因?

Java 如何找到OutOfMemoryError的原因?,java,android,out-of-memory,Java,Android,Out Of Memory,在某些设备中,我的应用程序有一个带有以下堆栈跟踪的OutOfMemoryError: java.lang.OutOfMemoryError: Failed to allocate a 16828428 byte allocation with 643016 free bytes and 627KB until OOM at dalvik.system.VMRuntime.newNonMovableArray(Native Method) at android.graphics.BitmapFac

在某些设备中,我的应用程序有一个带有以下堆栈跟踪的
OutOfMemoryError

java.lang.OutOfMemoryError: Failed to allocate a 16828428 byte allocation with 643016 free bytes and 627KB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:856)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:675)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:2228)
at android.content.res.Resources.loadDrawableForCookie(Resources.java:4211)
at android.content.res.Resources.loadDrawable(Resources.java:4085)
at android.content.res.Resources.getDrawable(Resources.java:2005)
at android.content.res.Resources.getDrawable(Resources.java:1987)
at android.content.Context.getDrawable(Context.java:464)
at android.support.v4.content.ContextCompatApi21.getDrawable(ContextCompatApi21.java:26)
at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:321)
at android.support.v7.widget.TintManager.getDrawable(TintManager.java:175)
at android.support.v7.widget.TintManager.getDrawable(TintManager.java:168)
at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:51)
at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:72)
at com.coulddog.loopsbycdub.application.fragment.implementation.MediaPlayerFragment.updatePlayButtons(MediaPlayerFragment.java:299)
at com.coulddog.loopsbycdub.application.fragment.implementation.MediaPlayerFragment.setState(MediaPlayerFragment.java:288)
at com.coulddog.loopsbycdub.application.fragment.implementation.MediaPlayerFragment$8.onClick(MediaPlayerFragment.java:278)
at android.view.View.performClick(View.java:5697)
at android.view.View$PerformClick.run(View.java:22526)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7225)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

我不明白这个错误的原因。我的设备上没有发生此错误。所以,我有两个问题。首先,是否可以使我的真实设备或
genymotion
仿真器对
OutOfMemoryError
更敏感?第二个问题,这个错误的可能原因是什么

我认为您应该使用查找内存泄漏,这是一个由Square工程师开发的很棒的库。此外,还有其他工具可以帮助您检测内存泄漏并优化内存泄漏,以便从Android文档中检出


此外,在您的情况下,您正在加载具有高分辨率的位图,并正确管理它们。所以,你最好仔细阅读我的答案,它是基于安卓文档中的一个主题,我想说你应该用它来找出内存泄漏,这是一个由Square工程师开发的很棒的库。此外,还有其他工具可以帮助您检测内存泄漏并优化内存泄漏,以便从Android文档中检出


此外,在您的情况下,您正在加载具有高分辨率的位图,并正确管理它们。所以,你最好仔细阅读我的答案,它是基于Android文档中的一个主题的。

错误显示加载了16 MB的图像,而内存非常低

内存不足可能是寻找泄漏的提示,例如图像读取未关闭或诸如此类

那么16MB还是太大了。压缩后的图像较小,但此处的大小(宽度和高度)必须非常大

at com.coulddog.loopsbycdub.application.fragment.implementation.MediaPlayerFragment$8
            .onClick(MediaPlayerFragment.java:278) 

因此,请检查那里发生了什么。

错误显示加载了16 MB的图像,而内存非常低

内存不足可能是寻找泄漏的提示,例如图像读取未关闭或诸如此类

那么16MB还是太大了。压缩后的图像较小,但此处的大小(宽度和高度)必须非常大

at com.coulddog.loopsbycdub.application.fragment.implementation.MediaPlayerFragment$8
            .onClick(MediaPlayerFragment.java:278) 

所以,检查一下那里发生了什么。

沿着黄烟囱路走

OutOfMemory错误是在“NativeDecodeSet”函数到“decodeStream”函数的
BitmapFactory
类中发生的

这在
Drawable
中称为“createFromResourceStream”函数。再往下几行,您就会看到它是从
上下文#getDrawable
方法调用的

如此类推,直到您点击
com.coulddog.loopsbycdub.application.fragment.implementation.MediaPlayerFragment.updatePlayButtons(MediaPlayerFragment.java:299)
,这显然不是Android系统调用。这可能是你加载的图像太大的地方


把它们放在一起,你会发现有一个图像太大了,无法分配。它似乎是您的
/res/drawable/
文件夹中的一个图像(由
上下文#getDrawable()
表示)。一个16 MB大小的图像。要确定这是哪个图像应该不会太难。

沿着黄色堆栈道路走

OutOfMemory错误是在“NativeDecodeSet”函数到“decodeStream”函数的
BitmapFactory
类中发生的

这在
Drawable
中被称为“createFromResourceStream”函数。下面几行您可以看到它是从
上下文#getDrawable
方法中被调用的

如此类推,直到你点击
com.coulddog.loopsbycdub.application.fragment.implementation.MediaPlayerFragment.updatePlayButtons(MediaPlayerFragment.java:299)
,这显然不是一个Android系统调用。这可能是你加载的图像太大的地方


所以把它们放在一起,你会发现有一个图像太大了,无法分配。它似乎是你的
/res/drawable/
文件夹中的一个图像(由
Context#getDrawable()表示)
。一个16 MB大小的图像。要确定这是哪个图像应该不会太难。

你可以使用好的第三方库#Lalit Poptani


在开发过程中,您可以检查Android studio中Android监视器部分下监视器的内存状态。

您可以使用良好的第三方库#Lalit Poptani


在开发过程中,您可以检查Android studio中Android Monitor部分下的监视器的内存状态。

您提供的图像文件的分辨率太高,以至于创建位图需要太多内存。您提供的图像文件的可能副本的分辨率太高,以至于创建位图需要太多内存内存。可能是重复的错误,16mb不是gb。@barq谢谢,更正。幸运的是,这仍然是一个2000x2000图像或诸如此类的怪物。比你回答。我的项目从内存泄漏中清除。我知道该图像试图分配内存的片段,但我如何知道该图像是什么。在我的Android Studio内存监视器中,我看到了至少只分配3MB。我的每个图像都小于400 × 400像素,我还有九张分辨率为1154的补丁图片 × 30像素。我认为堆栈跟踪中的
setState
,尤其是
updatePlayButtons
,是直接原因-你也是。很抱歉,我帮不了你。除了建议尝试捕获updatePlayButtons,并输出图像信息之外。可能是一个绕过图像的开关,为特定设备启用。错误,16mb不是gb。@barq谢谢,correc泰德。幸运的是,这仍然是一个2000x2000的图像或诸如此类的怪物。我的项目没有内存泄漏。我知道该图像试图分配内存的片段,但我怎么知道该图像是什么。在我的Android Studio内存监视器中,我看到该片段仅分配3 mb。我的每个图像都小于400 × 400像素,我还有九张分辨率为1154的补丁图片 × 30像素。我在堆栈跟踪中看到
setState
,尤其是
updateplay按钮