谢谢!
我也想知道“弱引用”是什么意思,
不过我更希望大家能帮我分析一下上面的代码是否存在
OutOfMemoryError隐患。

解决方案 »

  1.   

    弱引用:http://www.java-cn.com/technology/technology_detail.jsp?id=2903你的程序出现OutOfMemoryError很正常,在线程里所有用来读取数据的reader, DataOutputStream 都没有关,如果出错的话,这些将驻留内存不会被回收.
    try {
    socket=new Socket("127.0.0.1",5000);
    //接下来要用户验证
    BufferedReader br=new BufferedReader (new InputStreamReader(socket.getInputStream()));
    DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
    br.readLine();
    dos.writeBytes("username");
    br.readLine();
    dos.writeBytes("password");
    //做别的事....
    } catch(Exception e) { }
                      finally {
                          br.close();
                          dos.close();
                      }
      

  2.   

    不好意思,更正一下代码。
    public class Handler implements Thread 
    =>public class Handler extends Thread 另外whyxx(永远成不了高手) 提的
    finally {
    br.close();
    dos.close();
    }
    在源代码中确实没有,但在catch(Exception e) { }中有
    catch(Exception e) { 
      try {
       if(socket!=null) {
    socket.close();
    socket=null;
       }
      } catch(Exception e2) {}
    }
    也就是说socket的关闭,对BufferedReader,DataOutputStream的关闭与否不起作用。
      

  3.   

    但是采用下面的版本的话就没有发现过OutOfMemoryError错误,
    Handler类在while循环中遇到任何异常时不再启动一个login线程,
    只是重新调用login()方法。//Handler.java
    import java.io.*;
    import java.net.*;public class Handler implements Thread {
    private Socket client;
    private BufferedReader br;
    private Login login=new Login(); public void login() {
    login.login();
    try {
    client=login.getSocket();
    br=new BufferedReader (new InputStreamReader(client.getInputStream()));
    } catch (Exception e) {}
    } public void run() {
    login();
    String line="";
    while(true) {
    try {
    line=br.readLine();
    if(line==null) {
    Thread.sleep(20000L);
    login();
    }
    //else 做别的事....
    } catch(Exception e) {
    try {
    if(client!=null) {
    client.close();
    client=null;
    }
    } catch(Exception e2) {}
    login();
    }
    }
    }
    }
    //Login.java
    import java.net.Socket;
    import java.io.*;public class Login {
    private Socket socket=null; public Socket getSocket() {
    return socket;
    } public void cancel() {
    try {
    if(socket!=null) {
    socket.close();
    socket=null;
    }
    } catch(Exception e) {}
    } public void login() {
    try {
    socket=new Socket("127.0.0.1",5000);
    //接下来要用户验证
    BufferedReader br=new BufferedReader (new InputStreamReader(socket.getInputStream()));
    DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
    br.readLine();
    dos.writeBytes("username");
    br.readLine();
    dos.writeBytes("password");
    //做别的事....
    } catch(Exception e) { 
    try {
    if(socket!=null) {
    socket.close();
    socket=null;
    }
    } catch(Exception e2) {}
    }
    }
    }
      

  4.   

    finally {
    br.close();
    dos.close();
    }
    但是在关闭输入输出流后,Socket也自动关闭了
    今天我单独按上面的代码做测试,在while中循环了上百万次,
    每次都产生异常,但却没有产生OutOfMemoryError错误.