我在Android市场上有一个应用程序,因为异常和错误被捕获并通过acra发送给我。
但我收到了很多内存错误.. 在不同类的类...一些我的应用程序,一些普通的java ..
这是否始终意味着我的应用程序出现问题,或者是否由于其他进程而导致手机内存不足?
用户是否也会获得fc对话框?
其他信息
我的应用程序中没有任何记忆强度......
没有图片......没有大块的数据.. 只有一个简单的视图......以及最密集的一个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)
“
所以主要的问题是..我在某处泄漏.. 或者这可以被认为是正常的,因为在很少的情况下,由于其上有其他应用程序,手机可能内存不足。
答案 0 :(得分:3)
常见的JVM问题是垃圾收集器只能删除未引用的对象。如果您有大型持久对象,那么将这些对象中未使用的变量设置为null以便取消引用它们非常重要。一个典型的问题就是当你不需要HashMap对象时,它会像HashMap对象一样保留很多值,因为HashMap中的每个条目都会占用内存。
答案 1 :(得分:1)
您是否在DDMS中使用过分配跟踪器?可以帮助您找到意外的内存泄漏。 http://developer.android.com/resources/articles/track-mem.html (到目前为止我自己没有用过它)
答案 2 :(得分:1)
正如Thomas建议的那样,你真的想用DDMS来查看你的内存使用情况。
此外,泄漏的一个非常常见的问题是使用静态变量 - 只有在知道自己在做什么时才使用它们。
在Android上处理位图也会变得非常昂贵。你的应用程序做什么?另外,你有很多对任何UI元素的引用吗?任何定义为静态的?
答案 3 :(得分:0)
有些事情可能无法控制(手机上的内存就是一个例子),但你仍然要对你的应用程序的行为负责。
如何处理内存问题将影响用户查看应用程序的方式。如果它与其他应用程序一起使用,用户将更有可能使用它。如果没有,他们就不会。
答案 4 :(得分:0)
“普通java”例外是什么意思,如果这些例外与您的软件无关,那么为什么要收到它们呢?
您可能知道,Dalvik虚拟机只有少量内存分配给自身(以及您的应用程序)。这是以这种方式实现的,以避免过程失控并耗尽所有可用资源的可能性,使手机无法使用。因此,如果您的应用程序正在执行许多内存密集型操作(如加载图片),并且您不小心分配(并在不需要时立即清除它们),则可能会出现奇怪的结果。
关于强制关闭,因为你捕获这些异常,它们不应该导致你的应用程序崩溃,除非你在捕获异常后错过了重新实例化的东西。
也许检查代码并消除不需要的内存分配将会很有帮助。另外,你可以像我的老板一样测试 - 他只是随意地按下按钮直到崩溃:D
修改强>
由于您说代码中没有任何内存昂贵(可能没有广告),因此您可以进行简单的检查,以查看错误发生时整个系统内存是否不足,或者是您的应用程序这导致了它。看看onLowMemory回调。当整个手机内存不足时调用它。
答案 5 :(得分:0)
当你得到OutOfMemoryError时,你可以确定它是你的应用程序,而不是另一个导致它的应用程序。每个Android应用程序都在其自己的Dalvik VM中运行,最大内存分配为16Mb。
如果您不使用位图(这是内存泄漏的常见来源),您还必须检查是否正确处理了方向更改,即无需在内存中保留对UI相对于对象的任何引用。