Exception in thread "main" java.lang.OutOfMemoryError我做了一个Socket服务.监听7389端口,如果有数据过来的话,我就接收,再发送到一个url链接里.相当于把一个TCP/IP协议转换成HTTP协议.
但现在监听7389端口的ServerSocket有了问题.就是大数据量的时候,会出现这个内存溢出的问题.我该关闭的连接关闭了,现在对这个问题挺郁闷的,呵呵.请大侠们指点
但现在监听7389端口的ServerSocket有了问题.就是大数据量的时候,会出现这个内存溢出的问题.我该关闭的连接关闭了,现在对这个问题挺郁闷的,呵呵.请大侠们指点
package com.nantian.info;import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.SocketException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.log4j.PropertyConfigurator;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;import com.nantian.db.DbConn;public class DialogServer extends Thread{
private Socket s;
private InputStream in;
private BufferedReader bre;
private BufferedInputStream bin;
private String rev,temp;
private byte b[];
private int len;
private char c[];
public DialogServer(Socket ss)
{
s = ss;
//b=new byte[5120000];
try
{
s.setSoTimeout(3000);
//bre = new BufferedReader(new InputStreamReader(s.getInputStream()));
bin = new BufferedInputStream(s.getInputStream(),5120000);
start();
}catch(IOException ie)
{
ie.printStackTrace();
Listenserve.logger.info(ie);
try{
s.close();
}catch(IOException ee){
ee.printStackTrace();
}
}
rev="";
}
public int sendPostData(String xml,String dlurl)
{
try{
PostMethod postMethod = new PostMethod();
//String url = "http://" + ip + ":" + port;
String url = dlurl;
//String url = "http://localhost:7389";
Listenserve.logger.info("URL是:"+url);
HttpClient httpClient = new HttpClient();
//System.out.println(xml);
postMethod = new PostMethod(url);
postMethod.setRequestHeader("Content-Type","text/xml; charset=GBK");
postMethod.addParameter("body", xml);
int re_code= httpClient.executeMethod(postMethod);
return re_code;
}catch(HttpException e){
e.printStackTrace();
Listenserve.logger.info(e);
return 0;
}catch(IOException e){
e.printStackTrace();
Listenserve.logger.info(e);
return 0;
}
} public void sendTcpHttpMsg(String tmp,String dlurl) throws IOException
{
Date dt = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
PropertyConfigurator.configure("Log4j.properties");
String datefor = sf.format(dt);
Listenserve.logger.info("光大端发起"+"====="+"时间:"+datefor+"结果:"+tmp);
int re = sendPostData(tmp,dlurl);
Listenserve.logger.info("电力端返回结果:"+re);
DataOutputStream bs = new DataOutputStream(s.getOutputStream());
if(re==200)
{
bs.write("0".getBytes());
}else{
bs.write("1".getBytes());
}
s.close();
s = null;
} public synchronized void run()
{
try
{
boolean bb = true; //判断是否为
System.out.println("socket connection:"+s.isConnected());
byte[] lenbyte = new byte[8];
bin.read(lenbyte);
int lenint = Integer.parseInt(new String(lenbyte));
Listenserve.logger.info("数据长度是:"+lenint);
System.out.println(lenint);
int buff = 512;
byte[] revbyte = new byte[lenint+lenint/buff];
{
//Thread.sleep(100);
byte[] tmp = new byte[buff];
if(i==lenint/buff)//最后一个报文.因为i是从0开始循环.所以,当i==lenint/buff的时候,已经是最后一个报文了
{
int yu = lenint%buff;
byte[] tmp1 = new byte[yu];
int readlen = bin.read(tmp1);
if(readlen<yu)
{
Listenserve.logger.info("dddddddddddddd");
int tmplen = yu - readlen;
Listenserve.logger.info("yu="+yu);
byte[] tmplenbyte = new byte[tmplen];
boolean readflag = true;
int intflag = readlen;
while(readflag)
{
sleep(100);
int readlen2 = bin.read(tmplenbyte);
Listenserve.logger.info("readlen2="+readlen2);
int readlenrt = tmplen - readlen2;
int x = intflag;
for(int y=0;y<readlen2;y++)
{
Listenserve.logger.info("X="+x);
tmp1[x] = tmplenbyte[y];
x++;
}
if(readlenrt<=0||readlen2<=0)
{
readflag = false;
break;
}
intflag = intflag + readlen2;
}
}
//rev = rev + new String(tmp1);
int j = i * buff;
for(int z=0;z<yu;z++)
{
revbyte[j] = tmp1[z];
j++;
}
}else{
int readlen = bin.read(tmp);
if(readlen<buff)
{
int j = i * buff;//如果缓冲已满,读已经取到这些字节
for(int z=0;z<readlen;z++)
{
revbyte[j] = tmp[z];
j++;
}
int tmplen = buff - readlen;//剩下的没有读到的字节
byte[] tmplenbyte = new byte[tmplen];
boolean readflag = true;
int intflag = readlen;//已读到的字节数
while(readflag)
{
sleep(100);
int readlen2 = bin.read(tmplenbyte);//读剩下的字节
int readlenrt = tmplen - readlen2;
int a = i * buff + readlen;
for(int z=0;z<tmplenbyte.length;z++)
{
revbyte[a] = tmplenbyte[z];
a++;
}
if(readlenrt==0)
{
readflag = false;
break;
}
intflag = intflag + readlen2;
}
}else{
//rev = rev + new String(tmp);
int j = i * buff;
for(int z=0;z<buff;z++)
{
revbyte[j] = tmp[z];
j++;
}
}
}
}
bin.close();
bin = null;
rev = new String(revbyte);
//Listenserve.logger.info("光大端发起"+"====="+"时间:"+rev);
rev = rev.trim();
System.out.println(rev);
if(!(rev.equals("")||rev.equals(" ")))
{
GetBean bean = new GetBean();
Hashtable tmpht = bean.getBean();
String dlip = (String)tmpht.get("dlip".toUpperCase());
String dlurl = (String)tmpht.get("url".toUpperCase());
int dlport = Integer.parseInt((String)tmpht.get("dlport".toUpperCase()));
rev = rev.replaceAll("[\\r\\n]+","");
//rev = new String(rev.getBytes("UTF-8"),"gbk");
//System.out.println(rev);
sendTcpHttpMsg(rev,dlurl);
//解析xml报文
try{
org.dom4j.Document document = null;
Element element = null;
document = DocumentHelper.parseText(rev);
Element root = document.getRootElement();
String nametrans = "";
String valuetrans = "";
String revv = rev.replaceAll("\'","\"");
revv = new String(revv.getBytes("ISO-8859-1"),"GB2312");
for ( Iterator i = root.elementIterator(); i.hasNext(); )
{
element = (Element) i.next();
for(Iterator i2 = element.elementIterator(); i2.hasNext();)
{
Element ele2 = (Element)i2.next();
String name = ele2.getName();
String value = ele2.getText();
if(name.equals("PackageID"))
{
nametrans = "PackageID";
valuetrans = value;
}
}
//时间格式
Date dt = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String datefor = sf.format(dt);
String datefor2 = datefor.replaceAll("-","");
datefor2 = datefor2.replaceAll(" ","");
datefor2 = datefor2.replaceAll(":","");
String sql = "insert into sendtcpinfo(" +
"userid,sendnote,getnote,sendtime,flag,seletime)" +
"values(" +
"'"+valuetrans+"','"+revv+"','','"+datefor+"',1,'"+datefor2+"')";
DbConn dc = new DbConn();
boolean rs = dc.executeUpdate(sql);
if(!rs){
System.out.println(dc.getErrMsg());
}
}
}catch(Exception e){
e.printStackTrace();
Listenserve.logger.info(e);
}
}else{
s.close();
s = null;
}
Listenserve.logger.info("会话socket已断开");
System.out.println("会话socket已断开!");
}
catch(SocketException se)
{
se.printStackTrace();
try{
s.close();
s=null;
}catch(Exception e){
e.printStackTrace();
}
Listenserve.logger.info("客户端已断开");
System.out.println("客户端已断开!");
//new Listenserve();
}
catch(IOException io)
{
io.printStackTrace();
Listenserve.logger.info(io);
s = null;
//System.exit(0);
}
catch(InterruptedException e)
{
e.printStackTrace();
s = null;
Listenserve.logger.info(e);
}
}
}
只要不是时间一长就OutOfMemoryError就行(如果是的话是资源没释放)
有个测试运行内存使用情况的的软件JPROJECT?忘了,和EXE4J一个公司出的,拿来检测下