有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

    如果要退出内存,则可能是generateEventDataMap方法正在泄漏,或者没有刷新要写入的数据库

    如果不检查堆,则很难检测泄漏的内容。尝试使用探查器,如jvisualvm或类似工具,查看堆中充满了什么