この問題は本当に私を困惑させました。 ObjectOutputStream
を使用してクライアントからサーバーに画像を送信していますが、時間が経つとJavaヒープが成長し続けます。これにより、最終的にOutOfMemoryError
例外が発生します。いくつかのオンライン調査の後、リセット方法が唯一の解決策であるようです。これは素晴らしいですが、それを使用するとエラーが発生します:mark/resetはサポートされていません。私が見つけた唯一のページはここにありました: https://stackoverflow.com/questions/38814424/how-can-i-get-an-objectinputstream-that-supports-mark-resetObjectOutputStreamはメモリリークを引き起こし、reset()はエラーをスローします
私はそのページの答えとどうすればよいのか分かりません。
とにかく、ここでは、サーバコードは次のとおりです。
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);
}
トピックからやや離れていますが、Java 7で追加された 'try-with-resources'構文は、メモリリークとの戦いに非常に役立ちます。私は非常にそれをお勧めします:http://tutorials.jenkov.com/java-exception-handling/try-with-resources.html – anon58192932