gpt4 book ai didi

Java堆空间异常,无法删除从服务器收到的文件

转载 作者:行者123 更新时间:2023-12-01 04:56:24 26 4
gpt4 key购买 nike

我编写了下面的代码,但是在调用了近150次之后,它抛出“线程“Thread-245”java.lang.OutOfMemoryError中的异常:Java堆空间”问题就出现在(b = new byte[1024 * 1024];)Java代码:

class Client implements Runnable {
private Socket socket;
private BufferedInputStream bufin = null;
private BufferedOutputStream bufout = null;
String path;
private byte[] b;

Client(Socket socket, String path) {
this.socket = socket;
this.path = path;
}

@Override
public void run() {
try {
bufin = new BufferedInputStream(socket.getInputStream());
bufout = new BufferedOutputStream(new FileOutputStream(path));

b = new byte[1024 * 1024];
int num = 0;
while ((num = bufin.read(b)) != -1)
bufout .write(b, 0, num);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufin.close();
bufout .close();
b = null;
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}

我尝试更清楚地描述问题。是这样的:我编写了 ServerSocket,当客户端发送请求时,服务器然后将请求放入新线程中,如下所示:

public void start() {
boolean started = false;
try {
ServerSocket ss = new ServerSocket(8888);
started = true;
while (started) {
String path = "C:/Pic/"+ new SimpleDateFormat("yy-MM-dd-HH_mm_ss_ms").format(new Date()) + ".jpg";
Socket s = ss.accept();
new Thread(new Client(s, path)).start();
}
} catch (IOException e) {
e.printStackTrace();
}

}

在这种情况下,服务器将接收来自任何客户端的请求...还有第二个问题,我认为该问题会导致Java堆空间异常,即当服务器收到图片时,然后在关闭服务器之前无法从磁盘中删除该图片,当我删除它时,它显示“该操作无法完成,因为该文件是在 Java(TM) 平台 SE 二进制文件中打开的”。而我已经关闭了客户端线程中的输入输出。现在我无法发现问题的根源,1.为什么会发生堆异常2.为什么在服务器运行期间文件无法从磁盘删除。非常感谢您的回复!

最佳答案

内存不足,因为每个线程都创建 1MB 数组缓冲区。您想查看最大堆大小是多少(这取决于几个变量)并在命令行增加最大大小,例如:java -Xmx1024M myclass.class

此外,您说您启动了 150 个客户端。为什么他们不收集垃圾?也许所有 150 个线程都会立即启动,并且所有线程都会同时获取该内存?我建议使用线程池来执行这些操作,以便您可以限制正在运行的客户端数量。

对于保存文件的服务器(您无法删除它)的问题,是因为您遇到了堆内存错误。当你得到这个时,所有的赌注都消失了。服务器仍然保留对该文件的引用,并且 bufout.close() 可能不起作用。

关于Java堆空间异常,无法删除从服务器收到的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14058028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com