【问题标题】:Android OutofMemory with ObjecOutputStream使用 ObjectOutputStream 的 Android 内存不足
【发布时间】:2013-03-06 22:25:56
【问题描述】:

我创建了一个带有两个线程的客户端/服务器对来发送和接收对象,虽然它一开始运行良好,但运行一段时间后我遇到了 OutofMemory 错误,我正在研究垃圾收集器的工作原理在 Android 2.3.4 中,似乎有些对象由 ObjectInputStream 和 ObjectOutputStream 保留,不会被 GC 收集。我使用Eclipse中的内存分析工具找出内存泄漏的位置,发现有一个IdentityHashMap对象,它保存着对正在发送和接收的数据的引用。我想找到解决此问题的方法,如何释放此数据或如何删除此对象保留在我的数据上以防止其被收集的引用。我正在使用的内存堆对于 64M 的手机来说非常大,如果我尝试对大块数据进行相同操作,只要我不运行很长时间,它就可以正常工作。

【问题讨论】:

  • 序列化/反序列化代码可能使用 IdentityHashMap 来保持对已处理对象的引用,以防止由于循环引用而导致的无限循环。除非您发布一些代码,否则我认为您的问题无法回答。
  • IdentityHashMap 是 ObjectOutputStream 的一部分,不能给你代码,也不能改变它的工作方式。

标签: android garbage-collection out-of-memory


【解决方案1】:

问:你在任何时候都在做“reset()”吗?

除非您重置它们,否则对象流会记住写入它们的每个对象。

【讨论】:

  • 谢谢,这似乎有效。但是现在我在我拥有的 ObjectInputStream 对象中运行 reset 方法时遇到了问题,每次我决定运行它时它都会抛出一个 IOException,因此我有数据丢失。
  • 建议:只需在您的 ObjectInputStreams 上执行“ios.close()”(当您完成整个流时); “reset()”你的 ObjectOutputStreams。
  • 搞定了,解决方案很简单...重置两端的OutputStreams。非常感谢。
  • @Drakoniss - 我的荣幸 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多