我已经编写了下面的代码,但是在调用了将近 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.为什么会发生 Heap Exception anr 2.为什么在服务器运行期间文件无法从磁盘中删除。非常感谢您的回复!