清除 Java 中 ObjectInputStream 上的条目——内存问题

问题描述 投票:0回答:0

我有一个 Java 程序,它应该从文件中读取独立的序列化对象(对象之间没有相互依赖性),处理它们,然后将它们作为独立的序列化对象写入另一个文件。它看起来像这样(请原谅任何错别字,这是手写的,因为程序会做其他事情,比如弄清楚应该如何处理它):

try {
    ObjectOutputStream fileOut = new ObjectOutputStream(new FileOutputStream("outputFile"));
    ObjectInputStream fileIn = new ObjectInputStream(new FileInputStream("inputFile"));
    for(int i = 0; i < numThingsInFile; i++){
        MyObject thingToProcess = (MyObject) fileIn.readObject();
        thingToProcess.process();
        fileOut.writeObject();
    }
} catch (IOException | ClassNotFoundException  e1) {
    e1.printStackTrace();
}

代码正确地完成了这个过程。而且,从我的角度来看,我应该在循环的每次迭代中丢弃“thingsToProcess”,这应该在计算机空闲时收集垃圾。

但是,程序使用的内存随着它读取更多的东西而不断增加,直到它变慢到爬行。我使用堆转储和分析器来查看它,它说 ObjectInputStream fileIn 占用了荒谬的内存量。具体来说,它说“条目”数组很大。它比它的来源文件大得多。该文件为 400 kB,但仅通过读取该文件,该条目数组就超过 600 MB。我还有其他线程以相同的方式读取其他文件,所以内存不足。我知道我可以给 Java 更多内存,但老实说,这是一个创可贴解决方案,不能解决根本问题,因为我希望这个过程能够处理包含更多对象的更大文件。

我宁愿不要把文件分解得比现在更多。

有没有办法让 ObjectInputStream 不存储以前的条目或清除以前的条目?

我尝试添加 BufferedInputStream 并使用标记/重置(在我意识到问题出在 ObjectInputStream 中的条目数组之前):

ObjectInputStream fileIn = new ObjectInputStream(new FileInputStream("inputFile"));

我试过使用 readUnshared():

MyObject thingToProcess = (MyObject) fileIn.readUnshared();
这改进了一些事情,让我可以运行我的程序,但它的 Entries 数组中仍有数十万个对象随着时间的推移而扩展,这将导致更多对象出现问题。

java memory-management objectinputstream
© www.soinside.com 2019 - 2024. All rights reserved.