2010-06-16 67 views
5

我在android市场上有一个应用程序,除了例外和错误被抓住并发送给我的阿拉。内存不足错误,我的应用程序的错误?

但我收到了很多内存不足的错误.. 在不同类型的课程......我的一些应用,一些常规Java ..

这是否一定意味着有我的应用程序有问题,或者它也可能是由于其他进程而导致电话内存不足?

用户是否也会得到一个fc对话框?

其他信息

有一个在我的应用程序没有什么记忆intensite ..

没有图片...数据没有大块.. 只有一个简单的view..and最密集的一个Mobclix的广告..

我是新来的java ...所以我可能有泄漏的地方..但我觉得很难调试。 但在这一点上,我甚至不知道有什么错...

我得到约25-50 OOM的错误每天..但相比,它显示了一天的60.000广告。 (我每次开始时只显示1或2个广告),并不是太多。

1收到这样的错误:

"java.lang.OutOfMemoryError 
at org.apache.http.impl.io.AbstractSessionInputBuffer.init(AbstractSessionInputBuffer.java:79) 
at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:93) 
at android.net.http.AndroidHttpClientConnection.bind(AndroidHttpClientConnection.java:114) 
at android.net.http.HttpConnection.openConnection(HttpConnection.java:61) 
at android.net.http.Connection.openHttpConnection(Connection.java:378) 
at android.net.http.Connection.processRequests(Connection.java:237) 
at android.net.http.ConnectionThread.run(ConnectionThread.java:125) 

"java.lang.OutOfMemoryError 
at java.io.BufferedReader.<init>(BufferedReader.java:102) 
at com.mobclix.android.sdk.Mobclix$FetchResponseThread.run(Mobclix.java:1422) 
at com.mobclix.android.sdk.MobclixAdView$FetchAdResponseThread.run(MobclixAdView.java:390) 
at java.util.Timer$TimerImpl.run(Timer.java:290) 

"java.lang.OutOfMemoryError 
at org.apache.http.util.ByteArrayBuffer.<init>(ByteArrayBuffer.java:53) 
at org.apache.http.impl.io.AbstractSessionOutputBuffer.init(AbstractSessionOutputBuffer.java:77) 
at org.apache.http.impl.io.SocketOutputBuffer.<init>(SocketOutputBuffer.java:76) 
at android.net.http.AndroidHttpClientConnection.bind(AndroidHttpClientConnection.java:115) 
at android.net.http.HttpConnection.openConnection(HttpConnection.java:61) 
at android.net.http.Connection.openHttpConnection(Connection.java:378) 
at android.net.http.Connection.processRequests(Connection.java:237) 
at android.net.http.ConnectionThread.run(ConnectionThread.java:125) 

所以主要问题is..am我一些地方泄漏.. 或可以这被认为是正常的,因为在很小的情况下,由于其他应用程序运行,手机可能会因内存不足而被占用。

+0

您的应用程序对内存要求很高吗?或者像http://developer.android.com/resources/articles/avoiding-memory-leaks.html表示上下文有些泄露? – xandy 2010-06-16 17:25:38

+0

这可能是与讨论(并修复!)相同的问题http://stackoverflow.com/questions/5358014/android-httpclient-oom-on-4g-lte-htc-thunderbolt – 2012-11-05 10:13:02

+0

@ xandy的链接已死亡。这是[一个活的](http://android-developers.blogspot.ru/2009/01/avoiding-memory-leaks.html) – 2014-09-02 11:19:28

回答

0

有些东西可能超出了你的控制范围(手机内存是一个例子),但是你对应用程序的行为负责。

如何处理内存问题将影响用户如何查看您的应用程序。如果它与其他应用程序配合良好,用户将更有可能使用它。如果没有,他们不会。

0

你是什么意思的“一般java”的例外,如果这些与你的软件不相关,那么你为什么收到它们?

正如你可能知道的,Dalvik虚拟机只有少量内存分配给自己(和你的应用程序)。这是通过这种方式来实现的,以避免过程失控和耗尽所有可用资源的可能性,从而使手机无法使用。因此,如果您的应用程序正在执行许多内存密集型操作(如加载图片),并且您不太注意分配(并在不需要时立即清除它们),则可能会观察到奇怪的结果。

关于强制关闭,因为你正在捕获这些异常,所以它们不应该导致应用程序崩溃,除非你错过了在发生异常后重新实例化某些内容。

也许检查你的代码和消除不需要的内存分配将证明是有帮助的。此外,您还可以测试作为老板做 - 他只是怪胎推动随机按钮,直到东西崩溃:d

编辑

既然你说,没有在你的代码没有什么记忆昂贵(没有广告大概),那么你可以进行一次简单的检查,看看错误发生时整个系统是否内存不足,或者是你的应用程序导致它。看看onLowMemory回调。当整个手机内存不足时调用它。

1

正如托马斯所说,你真的想用DDMS来查看你的内存使用情况。

此外,泄漏的一个非常常见的问题是使用静态变量 - 只有在您知道自己在做什么时才使用它们。

处理位图在Android上也可能会非常昂贵。你的应用做什么?另外,你是否有很多引用任何UI元素?任何定义为静态?

0

当您收到OutOfMemoryError时,您可以确定它是您的应用程序,而不是导致它出现的另一个应用程序。每个Android应用都运行在它自己的Dalvik虚拟机上,最大内存分配量为16Mb。

如果您不使用位图(这是内存泄漏的常见来源),您还必须检查是否正确处理方向更改,而不是将相对于UI的对象的任何引用保留在内存中。

3

一个常见的JVM问题是只有未引用的对象可以被垃圾收集器删除。如果你有很大的持久化对象,那么将这些对象中未使用的变量设置为null是非常重要的,以便它们被解除引用。一个经典的问题是,当你不需要它的时候,像HashMap对象一样保留着许多值,因为HashMap中的每个条目都在咀嚼内存。