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。它不会告诉您有关 连接 .
当前状态的任何信息
这个问题真是难倒我了。我使用 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。它不会告诉您有关 连接 .