Exception in thread "main" java.lang.OutOfMemoryError我做了一个Socket服务.监听7389端口,如果有数据过来的话,我就接收,再发送到一个url链接里.相当于把一个TCP/IP协议转换成HTTP协议.
但现在监听7389端口的ServerSocket有了问题.就是大数据量的时候,会出现这个内存溢出的问题.我该关闭的连接关闭了,现在对这个问题挺郁闷的,呵呵.请大侠们指点

解决方案 »

  1.   

    以下是我的程序:
    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];
       
       
      

  2.   

    for(int i=0;i<=lenint/buff;i++)//一个字节一个字节的接收,一个字节为一个单位的接收.
       {
       //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);
      }
    }
    }
      

  3.   

    启动时候加参数 默认64M 改成128M
    只要不是时间一长就OutOfMemoryError就行(如果是的话是资源没释放)
    有个测试运行内存使用情况的的软件JPROJECT?忘了,和EXE4J一个公司出的,拿来检测下
      

  4.   

    我晕,蛮野蛮,你真厉害.我确实是南天的.我现在已经改成512M了,还出现这个问题.NND