2014-09-05 78 views
0

下面是我的项目的代码片段,重用流光对象

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 

例外。

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

感谢

+0

你对循环中的字节数组做什么?你只粘贴到你获得它的地步,然后粘贴到哪里? – 2014-09-05 22:36:40

+0

它被插入到数据库中。 – dipamchang 2014-09-05 22:42:55

回答

0

循环本身,正如你在第一个版本在这里贴吧,可以不填堆,导致两个两个流,并将所得的字节数组是符合垃圾回收在每个循环结束迭代。

如果您正在使用OutOfMemory,那么generateEventDataMap方法会泄漏,或者您没有冲洗到要写入的数据库。

检测泄漏是很难的,不检查堆。尝试使用探查器,如jvisualvm或类似的,来查看堆满了。

+0

实际上,字节数组变得非常大,循环运行了很长时间。这个模块是解析器的一部分,它解析JSON文件和数据库中的数据。 我使用内存泄漏分析器,它告诉我有关线objectStreamer.writeObject(eventDataMap)的泄漏; – dipamchang 2014-09-05 23:03:07

+0

当然,一个非常大的字节数组可能会成为问题。你可以尝试写objectStreamer = null; objOutputStreamer = NULL; eventDataMap = NULL;在获得字节数组之后不久,保存一些内存。但是,如果您可以直接流式传输到数据库,而不是通过字节数组会更好。 – 2014-09-05 23:05:51

+0

你能提出一个更好的方法来将地图存储到数据库中。检索后也应该是Map。 – dipamchang 2014-09-05 23:17:56