Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ObjectOutputStream导致内存泄漏,reset()抛出错误_Java_Serialization_Objectoutputstream - Fatal编程技术网

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()
编写的,所以它们会泄漏。