【发布时间】:2010-12-28 19:57:59
【问题描述】:
我想知道如何设置一个已创建的线程进行 GC。我做了一个简单的多线程服务器来接受来自客户端的连接,但是每次客户端连接时,内存使用量都会增加大约 80k ......可以理解。问题是客户端和服务器断开连接后,我不知道如何从快速增长中恢复过来。
这是设置线程的主类:
public static void main(String[] args) {
try {
serverSock= new ServerSocket(9999);
} catch (IOException e1) {
e1.printStackTrace();
}
while (true){
try {
Thread t = new server(serverSock.accept());
t.start();
t = null;
} catch (IOException e) {
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会怎样?线程不会发生任何不好的事情。 -
我的印象是,除非我们保留指向线程子类的指针,否则它可能会在超出范围后进行 GC(与任何其他对象一样)。我猜……不是吗?
标签: java multithreading garbage-collection