ObjectOutputStream导致内存泄漏,reset()抛出错误

时间:2017-06-26 23:27:48

标签: java serialization objectoutputstream

这个问题真让我难过。我使用ObjectOutputStream将图像从客户端发送到服务器,但随着时间的推移,Java堆不断增长。这最终会导致OutOfMemoryError异常。经过一些在线研究后,重置方法似乎是唯一的解决方案。哪个好,但使用它会导致错误:不支持标记/重置。我能找到的唯一一页是: https://stackoverflow.com/questions/38814424/how-can-i-get-an-objectinputstream-that-supports-mark-reset

我不确定如何处理该页面的答案。

无论如何,这是服务器代码:

ServerSocket vchatserver = new ServerSocket(6677);
Socket c1 = vchatserver.accept();
ObjectInputStream ois = new ObjectInputStream(c1.getInputStream()); 
while(c1.isConnected()) {
    ImageIcon icon = (ImageIcon) ois.readUnshared();
    ois.reset();
}

现在是客户的代码:

Socket vchatclient = new Socket(pub_serverName, 6677);
ObjectOutputStream oos = new ObjectOutputStream(vchatclient.getOutputStream());
while(vchatclient.isConnected()) {
    ImageIcon img = new ImageIcon(webcam.getImage());
    oos.writeUnshared(img);
    oos.reset();        
    Thread.sleep(25);
}

1 个答案:

答案 0 :(得分:1)

对象输入流不支持标记/重置。但你不需要它。您不需要在输入流上调用reset()ObjectOutputStream.reset()就足够了。

您链接的问题无关紧要。

NB while (c1.isConnected())不是流结束的有效测试。你需要抓住EOFException。同样地,while (vchatclient.isConnected())在写作时不会保护您免受IOExceptions的攻击。此方法仅告诉您是否已连接此套接字。它没有告诉你关于连接的当前状态的任何信息。