Java ObjectOutputStream导致内存泄漏,reset()抛出错误
这个问题真的把我难住了。我使用Java ObjectOutputStream导致内存泄漏,reset()抛出错误,java,serialization,objectoutputstream,Java,Serialization,Objectoutputstream,这个问题真的把我难住了。我使用ObjectOutputStream将图像从客户端发送到服务器,但随着时间的推移,java堆不断增长。这最终会导致OutOfMemoryError异常。经过一些在线研究,重置方法似乎是唯一的解决方案。这很好,但使用它会导致错误:不支持标记/重置。我在这里能找到的唯一一页是: 我真的不知道该如何处理那页的答案 无论如何,以下是服务器代码: ServerSocket vchatserver = new ServerSocket(6677); Socket c1 = v
ObjectOutputStream
将图像从客户端发送到服务器,但随着时间的推移,java堆不断增长。这最终会导致OutOfMemoryError
异常。经过一些在线研究,重置方法似乎是唯一的解决方案。这很好,但使用它会导致错误:不支持标记/重置。我在这里能找到的唯一一页是:
我真的不知道该如何处理那页的答案
无论如何,以下是服务器代码:
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);
}
对象输入流不支持标记/重置。但你不需要它。您不需要在输入流上调用
reset()
<代码>ObjectOutputStream.reset()就足够了
你链接的问题无关紧要
注意
while(c1.isConnected())
不是流结束的有效测试。您需要捕获EOFEException
。类似地,while(vchatclient.isConnected())
在编写时也不会保护您免受IOExceptions
的影响。此方法仅告诉您是否连接过此套接字。它不会告诉您有关连接当前状态的任何信息。稍微偏离主题,但java 7中添加的try with resources
语法有助于防止内存泄漏。我强烈推荐:谢谢你的快速回复。但是,ObjectOutputStream.reset()给了我一个错误:无法从静态上下文引用非静态方法reset()ObjectOutputStream.reset()
是方法的名称。它是这样写的,以便读者知道我在说什么:与不受支持的ObjectInputStream.reset()
相反。你已经通过一个推荐人正确地调用了它。当然这是显而易见的?好吧,那么我需要做的就是删除ObjectInputStream的reset()?另外,我刚刚注意到你编辑了回复的第一部分。即使写共享,我也会有内存泄漏。正确writeUnshared()
不起作用,因为ImageIcon
有几个我没有想到的字段,比如它自己的URL,并且字段不是用writeUnshared()
编写的,所以它们会泄漏。