2017-06-26 8 views
0

この問題は本当に私を困惑させました。 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); 
} 
+0

トピックからやや離れていますが、Java 7で追加された 'try-with-resources'構文は、メモリリークとの戦いに非常に役立ちます。私は非常にそれをお勧めします:http://tutorials.jenkov.com/java-exception-handling/try-with-resources.html – anon58192932

答えて

0

オブジェクト入力ストリームがマーク/リセットをサポートしていません。しかし、あなたはそれを必要としません。入力ストリームでreset()に電話する必要はありません。 ObjectOutputStream.reset()で十分です。実際にはwriteUnsharedで十分です。この場合、子供がいないオブジェクトを1つしか書いていないためです。

あなたがリンクしている質問は無関係です。

NB while (c1.isConnected())はストリーム終了の有効なテストではありません。あなたはEOFExceptionをキャッチする必要があります。同様にwhile (vchatclient.isConnected())は書き込み時にIOExceptionsからあなたを保護しません。このメソッドは、このソケットをに接続したことがあるかどうかだけを示します。 接続の現在の状態については何も教えてくれません。

+0

高速返答いただきありがとうございます。しかし、ObjectOutputStream.reset()は私にエラーを与えています。非静的メソッドreset()は静的コンテキストから参照できません。 –

+0

'ObjectOutputStream.reset()'はメソッドの名前です。このように書かれているので、読者は私が何を話しているのか知ることができます。これは、サポートされていない 'ObjectInputStream.reset()'とは対照的です。あなたはすでに、参照を介して正しく呼び出していました。確かにこれはすべて明白ですか? – EJP

+0

これで、ObjectInputStreamのreset()を削除するだけです。また、私はあなたの反応の最初の部分を編集したことに気付きました。 writeUnsharedを使用しても、メモリリークが発生します。 –

関連する問題