【问题标题】:How to reset ObjectInputStream objects graph cache to avoid memory bloat如何重置 ObjectInputStream 对象图形缓存以避免内存膨胀
【发布时间】:2013-03-18 12:04:04
【问题描述】:

当使用 ObjectInputStream 加载大文件时,所有读取的对象都由流缓冲以进行对象图解析。
这会导致巨大的内存开销,这在我的情况下不需要(所有读取的对象都是相互依赖的)。
是否有与重置此缓冲区的 ObjectOutputStream 的 reset() 方法等效的方法?

代码示例:

try (FileInputStream fileInputStream = new FileInputStream(filename);
         BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
         ObjectInputStream objectInputStream = new ObjectInputStream(bufferedInputStream)) {
  while (object = objectInputStream.readObject()) {
    System.Out.println(object.toString());
  }
}

【问题讨论】:

  • 你能告诉我们你的代码吗?

标签: java serialization


【解决方案1】:

由发送者决定何时破坏已发送对象图的完整性,方法是调用ObjectOutputStream.reset()。不是接收者。

请注意,您的代码无法编译,如果编译则无效:

while (object = objectInputStream.readObject()) {
}

这应该是

try {
    while (true) {
        object = objectInputStream.readObject();
        // ...
    }
}
catch (EOFException exc) {
    // end of stream
}

国外有一种误解,认为readObject() 在流结束时返回null。它没有。它抛出EOFException。它可以在您写null 的任何时候返回null

【讨论】:

  • 所以这意味着你永远不应该使用 ObjectInputStream.reset() ?
  • @MarkY。 ObjectInputStream.reset() 继承自 InputStream.reset(),除了抛出一个 IOException 之外什么都不做,所以你当然不应该使用它。
【解决方案2】:

嗯,您似乎需要使用某种延迟加载技术,只加载对象图的必要组件,而不是所有内容。

【讨论】:

  • 换句话说你从未听说过ObjectOutputStream.reset()
猜你喜欢
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
相关资源
最近更新 更多