質問: ### 前提・実現したいこと ルーム機能のないチャットアプリにおいてクライアントアプリからソケット通信を用いて送られてきたメッセージを処理するサーバアプリ ### 発生している問題・エラーメッセージ クライアントアプリごとにメッセージを貯めるスレッドのオブジェクトを生成するが、スレッドのrunメソッドのwhileループでメッセージを取得しようとするところでOutOfMemoryError:Java heap spaceがでてしまう、また、オブジェクトのコレクションにためたメッセージを他のスレッドから処理できなくなってしまう 原因と対策を教えてください よろしくお願いします 追記:スタックトレース Exception in thread "Thread-4" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3210) at java.util.Arrays.copyOf(Arrays.java:3181) at java.util.ArrayList.grow(ArrayList.java:261) at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235) at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227) at java.util.ArrayList.add(ArrayList.java:458) at GetMsgThread.run(NChat.java:176) 追記:原因は不明のままですが、対処法については判明しました。SrcThreadのwhileループの1つ下のブロック、つまりforループの前にSystem.out.println()などのなんらかのメソッドを呼び出すと正常に作動することが分かりました。 しかし原因については一切の見当が付きません ### 該当のソースコード Java ``` import 色々 class NChatC{ staticな変数色々定義 mainメソッドでコンストラクタ呼び出し コンストラクタでフレーム作成、AcceptThread及びSrvThreadをstart() } class AcceptThread extends Thread{ run(){ ServerSocketをwhileループ内で作成しaccept()され されたらaddMember()に引数でわたす } addMember(Socket sock){ クライアント毎にsocket,inputstream,outputstrea m,ユーザー名、GetMsgThread(inpustreamで取得した文字列をためるスレッド)のオブジェクトのコレ クションを新たなメンバー用に追加し、新たなメン バーに現在の参加メンバーを通知し、現在のメンバ ーに新たな参加者を通知する } } //問題が発生するスレッド //クライアントごとにメッセージをためる class GetMsgThread extends Thread{ ArrayList newMsg=new ArrayList(); Inp in; boolean flag=true; public GetMsgThread(Inp inp){ in=inp; } public void run(){ while(flag){ newMsg.add(in.inp()); } } public String getMsg(){ String msg=newMsg.get(0); newMsg.remove(0); return msg; } } //GetMsgThreadで入手した文字列を処理するスレッド //socketVはソケットのコレクション //gmtVはGetMsgThreadのオブジェクト SrvThread{ run(){ while(true){ for(int i=0;i
回答: ``` while(flag){ newMsg.add(in.inp()); } ``` これいつflagがfalseになるんでしょうね。