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

ObjectOutputStream is causing memory leak and reset() throws error

这个问题真是难倒我了。我使用 ObjectOutputStream 从客户端向服务器发送图像,但随着时间的推移 java 堆不断增长。这最终会导致 OutOfMemoryError 异常。在网上查了一番,reset的方法似乎是唯一的解决办法。这很好,但使用它会导致错误: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);
}

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

您链接的问题无关紧要。

注意 while (c1.isConnected()) 不是流结束的有效测试。你需要抓住 EOFException。同样,while (vchatclient.isConnected()) 不会在写作时保护您免受 IOExceptions 的影响。这个方法只告诉你是否曾经连接过这个socket。它不会告诉您有关 连接 .

当前状态的任何信息