2014-09-05 74 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