長時間のユーザー、初回投稿...JavaでGCするスレッドを正しく設定するにはどうすればよいですか?
とにかく、私は作成されたスレッドをGC'dに設定する方法を考えていました。私はクライアントからの接続を受け入れるための単純なマルチスレッドサーバーを作ったが、クライアントが接続するたびにメモリ使用量は約80k増加した。分かりやすい。問題は、クライアントとサーバーの接続が切断された後の急速な成長から戻ってくる方法がわからないことです。ここで
は、スレッドを設定し、メインクラスです:
public static void main(String[] args) {
try {
serverSock= new ServerSocket(9999);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
while (true){
try {
Thread t = new server(serverSock.accept());
t.start();
t = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
そしてここでは、基本的なサーバのスレッドです:
今public class server extends Thread {
private Socket serverSocket = null;
public static String command = null;
public server(Socket serverSocket2) {
super("server");
serverSocket = serverSocket2;
}
@Override
public void run(){
BufferedReader fromClient = null;
PrintStream toClient = null;
String line = null;
String[] user = new String[2];
try {
serverSocket.setSoTimeout(10000);
fromClient = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
toClient = new PrintStream(serverSocket.getOutputStream());
System.out.println("Got connection");
System.out.println("Terminating server");
fromClient.close();
toClient.close();
serverSocket.close()
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
System.out.println("Connection established, but timeout on" +
" message recieve may have occured");
e.printStackTrace();
}
}
、どのように正確に私はちょうどこのスレッドを可能にします...死んで、離れて行くのではなく、現在起こっているメモリリークを引き起こすのですか?
また、私はJavaに慣れていません - スレッドを気にしないでください。明白な場合は、それについて素敵なことを試してください。あなたが提供できるお手伝いをありがとう!
't'を' null 'に設定しても効果はありません。その文の直後にブロックが終了し、 't'が範囲外になるからです。 @ Pete:スレッド実行中に 't'を' null'にするとどうなりますか?スレッドには何も悪いことはありません。 – Jesper
私はスレッドサブクラスへのポインタを保持しない限り、他のオブジェクトのようにスコープ外に出た後にGCすることができるという印象を受けました。私は...ないと思う? – Pete