以下のコードを書きましたが、ほぼ 150 回呼び出した後、"Exception in thread "Thread-245" java.lang.OutOfMemoryError: Java heap space" がスローされ、問題が発生しました (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ヒープスペース例外を引き起こすと私が考える2番目の問題、つまり、サーバーが画像を受信すると、画像を削除できなくなりますサーバーを閉じる前にディスクを削除すると、「ファイルが Java(TM) プラットフォーム SE Binary で開かれているため、アクションを完了できません」と表示されます。私はすでにクライアントスレッドで入出力を閉じています。今、私は問題の根本を発見することはできません.1. なぜヒープ例外が発生するのか. お返事ありがとうございます!