请教OutOfMemoryError问题 谢谢!我也想知道“弱引用”是什么意思,不过我更希望大家能帮我分析一下上面的代码是否存在OutOfMemoryError隐患。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 弱引用: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(); } 不好意思,更正一下代码。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的关闭与否不起作用。 但是采用下面的版本的话就没有发现过OutOfMemoryError错误,Handler类在while循环中遇到任何异常时不再启动一个login线程,只是重新调用login()方法。//Handler.javaimport 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.javaimport 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) {} } }} finally {br.close();dos.close();}但是在关闭输入输出流后,Socket也自动关闭了今天我单独按上面的代码做测试,在while中循环了上百万次,每次都产生异常,但却没有产生OutOfMemoryError错误. JPanel中动态添加JLabel无法显示,求大神 jdbc 实现Oracle全库备份 无法读取Resultset结果!!!!!!奇怪 求大侠 为什么我用BufferedWriter将字符串写入文件,却没有文件生成呢? LinkedList 的简单的问题啊 有关JTable的问题 java工具 菜鸟问题,在线等待,如何删除和增加JList中的Item啊? 有没有函数从html文本中获取纯文本内容??? JDK v1.3给我出了这样一个难题,帮帮我 如何画一个有立体感的方块 JTEXTAREA可以实现这个吗?
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();
}
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的关闭与否不起作用。
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) {}
}
}
}
br.close();
dos.close();
}
但是在关闭输入输出流后,Socket也自动关闭了
今天我单独按上面的代码做测试,在while中循环了上百万次,
每次都产生异常,但却没有产生OutOfMemoryError错误.