【发布时间】:2012-04-06 18:51:24
【问题描述】:
我正在摆脱内存错误。我正在开发实时聊天应用程序。它工作正常,但是当我在设备上运行应用程序 1 到 2 小时时,堆大小正在增加,当它达到 16 MB 时,应用程序开始挂起并在一段时间后崩溃并显示out of memory due to heap size,因为生成的堆大小是大于分配。
我正在 HTC Explorer 上测试我的应用程序。在我的应用程序中,大多数活动都使用后台线程,为此我使用的是 Asnyc Task。
我收到如下错误。
04-30 16:53:14.658: E/AndroidRuntime(5707): FATAL EXCEPTION: MagentoBackground
04-30 16:53:14.658: E/AndroidRuntime(5707): java.lang.OutOfMemoryError: (Heap Size=20167KB, Allocated=16063KB, Bitmap Size=355KB)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.util.ByteArrayBuffer.<init>(ByteArrayBuffer.java:53)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.io.AbstractSessionInputBuffer.init(AbstractSessionInputBuffer.java:82)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:98)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:173)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
04-30 16:53:14.658: E/AndroidRuntime(5707): at com.live2support.CustomHttpClient.executeHttpPost1(CustomHttpClient.java:163)
堆大小有限制吗?我该如何解决我的问题?
【问题讨论】:
-
发布一些代码。我的猜测是您在自定义列表中使用大型位图。
-
我没有在我的应用程序中使用位图。我在可绘制文件夹中有一些图像,我只使用它们,而不是我拥有的 15 到 20 张图像。
-
您是否真的需要运行时的所有聊天历史记录,或者您将这些聊天记录保存在数组或集合对象中,或者您的列表视图太大。您可以使用动态增长的列表视图。
-
在 com.live2support.CustomHttpClient.executeHttpPost1(CustomHttpClient.java:163) - 你正在做的事情每次都会占用大量内存..尝试释放内存,一旦你使用它..甚至在任何地方,只要你使用它,对象、数组列表、位图就会从内存中清除。一旦使用分配 null 并调用 System.gc();向垃圾收集器指示标志。
-
是的,我正在调用 System.gc();无处不在。
标签: android out-of-memory