重用流光对象

时间:2014-09-05 22:25:27

标签: java exception serialization

以下是我项目的代码段

while (...) {
`   Map <Long,String> eventDataMap = generateEventDataMap(interactionDataJsonObj);`

    ByteArrayOutputStream objOutputStreamer = new ByteArrayOutputStream();
    ObjectOutputStream objectStreamer = new ObjectOutputStream(objOutputStreamer);

    objectStreamer.writeObject(eventDataMap);
    objectStreamer.flush();
    objectStreamer.close();
    objOutputStreamer.close();

    byte[] interactionDataBlob = objOutputStreamer.toByteArray();
    //more steps .. byte array inserted into Database

}

我想要做的是,不要为每次循环迭代创建新的ByteArrayOutputStream和ObjectOutputStrem对象,这会导致堆溢出异常。

我有什么方法可以将这些对象创建步骤放在外面并保持代码的功能。

我尝试的是 -

 Map <Long,String> eventDataMap = generateEventDataMap(interactionDataJsonObj);`

    ByteArrayOutputStream objOutputStreamer = new ByteArrayOutputStream();
    ObjectOutputStream objectStreamer = new     ObjectOutputStream(objOutputStreamer);

while (...) {

    objectStreamer.writeObject(eventDataMap);
    objectStreamer.flush();

    byte[] interactionDataBlob = objOutputStreamer.toByteArray();

    objectStreamer.reset();
    objOutputStreamer.reset();

}
    objectStreamer.close();
    objOutputStreamer.close();

但是当我正在阅读这样写的数据时,我正在

java.io.StreamCorruptedException: invalid stream header: 73720011

异常。

请帮助/建议找到一种方法,我可以避免在循环中创建新对象。

由于

1 个答案:

答案 0 :(得分:0)

循环本身,正如您在第一个版本中发布的那样,无法填充堆,导致两个流和生成的字节数组在每次循环迭代结束时都有资格进行垃圾回收。

如果你正在使用OutOfMemory,那么generateEventDataMap方法正在泄漏,或者你没有刷新到你正在写入的数据库。

在不检查堆的情况下检测泄漏的内容很难。尝试使用jvisualvm或类似的分析器来查看堆满了什么。