java重用拖缆对象
下面是我的项目的代码片段
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 楼答案
正如您在第一个版本中发布的那样,循环本身无法填充堆,因为在每个循环迭代结束时,两个流和生成的字节数组都有资格进行垃圾收集
如果要退出内存,则可能是generateEventDataMap方法正在泄漏,或者没有刷新要写入的数据库
如果不检查堆,则很难检测泄漏的内容。尝试使用探查器,如jvisualvm或类似工具,查看堆中充满了什么