如何重置ObjectInputStream对象图形缓存,以避免内存膨胀



当使用ObjectInputStream加载大文件时,所有读取的对象都被stream缓冲用于对象图解析。
这会导致巨大的内存开销,这在我的情况下是不需要的(所有读取的对象都是相互依赖的)。
是否有一个相当于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());
  }
}

  • 类中实际上有一个reset方法,但它做的是完全不同的事情。
  • 查看导致内存膨胀的Java api

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

注意:你的代码不能编译,如果编译成功了也不会有效:

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

应该是

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

国外有一种误解,认为readObject()在流的末端返回null。它不是。它抛出EOFException。它可以在您编写null时返回null

看来你需要使用某种延迟加载技术,只加载对象图的必要组件,而不是所有组件。

最新更新