不要一个劲地new 对象!
可以重用的就中用。

解决方案 »

  1.   

    定时强制进行内存回收!System.gc();回收的是不再被引用的对象,可是我做的程序是个无限循环啊,能收走吗?不过我可以试一下!
      

  2.   

    看看 http://www.cn.ibm.com/developerWorks/java/j-leaks/index.shtml 吧,很不错的一篇文章。
      

  3.   

    你看来是对JAVA的还是不太了解,不管是你的程序是不是无限循环,当然是可以定时回收的。
    比如说,你改一下你的原程序,比如说再开个优先级比较第的线程进行定时回收!
      

  4.   

    hobby:
    呵呵,我是初学者!很多java高级技术都没有深入研究!我不太知道java程序里到底什么样的东西算是垃圾,并可以回收!既然程序里有垃圾对象,java VM为什么不自动回收它呢?
    哎,苦恼啊!
      

  5.   

    hobby:
    呵呵,我是初学者!很多java高级技术都没有深入研究!我不太知道java程序里到底什么样的东西算是垃圾,并可以回收!既然程序里有垃圾对象,java VM为什么不自动回收它呢?
    哎,苦恼啊!
      

  6.   

    java本身的程序在怎么写也不会有内存泄漏的,否则就不是java了。如果真的是内存泄漏的话,一定跟别的有关系。可能是你的程序调用了其他的系统资源,比如网络连接,或是数据库连接,这些资源要及时、强制的释放掉。还有可能是java VM有问题,我机器上的jdk1.3在运行jbuilder的时候经常会出现非法操作,以前用jview我也遇到过内存泄漏。你可以换个javaVM或是换个操作系统看看。
      

  7.   

    我把程序重新写了,这样又引起其他的问题!数据库那边刚开始写的很正常,执行一段时间后就执行的特别慢,我不知道怎么排除这个难题,还忘各位给我指点!!!!!谢谢!!!!!下面是这部分的主要代码!!!!!
    import java.lang.*;
    import java.io.*;
    import java.net.*;
    import java.util.*;
    import java.sql.*;
    class DR
    {
    private static final int imax1=10,imax2=1500,imax3=10080,type=0xc8,yxs=1280,ycs=0,finalMax=35040;
    private static final float fmax1=255 + 255 * 256 + 255 * 4096 + 255 * 65536;
    private static byte[] bArrBuffer=new byte[imax2];
    private static byte[][] bArr1=new byte[imax1][imax2];
    private static int[] iArrData=new int[imax3];
    private static int[] iArrLen=new int[imax1];
    private static int[] iArrSendNo=new int[imax3];
    private static int[] iArrHead=new int[16];
    private static int iMax=0,count1=0,id1=0,id2,num,i,j,k,m,n;
    private static int iYxNumber,iYcNumber,iYxycNumber,iYxB,iPort,iTimeslot,yxno,ycno,fengaowei,fendiwei,fen;
    private static float[] fArrData=new float[imax3];
    private static float f1;
    private static MulticastSocket mcs;
    private static DatagramPacket dp;
    private static TimeString  timestring;
    private static String strTime,strfen="";;
    private static String dbURL="jdbc:odbc:test";
    private static String user="sa"
    private static String password="";
    private static String select="SELECT MAX(FLAGS) FROM Y_MIDDLECHASEND";
    private static String select2="SELECT MAX(FLAGS) FROM Y_FINALCHASEND";
    private static String insert="INSERT INTO Y_MIDDLECHASEND(DATADATE,CHASENDN,DATAS,FLAGS) VALUES(?,?,?,?)";
    private static String insert2="INSERT INTO  Y_FINALCHASEND(DATADATE,CHASENDN,DATAS,FLAGS) VALUES(?,?,?,?)";
    private static String delete="DELETE FROM Y_MIDDLECHASEND WHERE FLAGS<=?";
    private static String update="UPDATE Y_MIDDLECHASEND SET FLAGS=FLAGS - ?";
    private static String delete2="DELETE FROM Y_FINALCHASEND WHERE FLAGS<=?";
    private static String update2="UPDATE Y_FINALCHASEND SET FLAGS=FLAGS - ?";
    private static Connection conn;
    private static Statement stmt;
    private static Statement stmt2;
    private static PreparedStatement ps;
    private static PreparedStatement ps2;
    private static PreparedStatement ps3;
    private static PreparedStatement ps4;
    private static PreparedStatement ps5;
    private static PreparedStatement ps6;
    private static ResultSet rs;
    private static ResultSet rs2; public static void main(String[] args)
    {
    if(args.length<2)
    {
    System.out.println("usage:java DR 1800 30\n1800:port\n30:timeslot");
    System.exit(0);
    }
    iPort=Integer.parseInt(args[0]);
    iTimeslot=3600/Integer.parseInt(args[1]);
    try
    {
    mcs=new MulticastSocket(iPort);
    dp=new DatagramPacket(bArrBuffer,imax2);
    timestring=new TimeString();
    System.out.println("Service port: "+mcs.getLocalPort());
    while(true)
    {
    try
    {
    mcs.receive(dp);
    strTime=timestring.timeString();
    for(i=0;i<16;i++)
    if(dp.getData()[i]<0)
    iArrHead[i]=dp.getData()[i]+256;
    else
    iArrHead[i]=dp.getData()[i];
    if(type!=iArrHead[6])//不是远动数据
    continue;
    else
    {
    id2=iArrHead[7];
    System.out.println(strTime);
    System.out.println("id:"+id2);
    if(id1==id2)//重复报文了
    {
    System.out.println("受到重复报");
    continue;
    }
    else
    {
    id1=id2;
    count1++;
    bArr1[id2-1]=bArrBuffer;
    iArrLen[id2-1]=iArrHead[4]+iArrHead[5]*256;
    num=iArrHead[8];
    iYxNumber=iArrHead[10]+iArrHead[11]*256;
    iYcNumber=iArrHead[12]+iArrHead[13]*256;
    iYxycNumber=iYxNumber+iYcNumber;
    if(num!=id2)
    continue;
    else
    {
    if(count1!=num)//丢报了
    {
    System.out.println("丢报了");
    id1=0;
    count1=0;
    continue;
    }
    else
    {
    System.out.println("OK!");
    n=0;
    for(i=0;i<num;i++)
    for(j=0;j<iArrLen[i];j++)
    {
    bArr1[i][j]=bArr1[i][j+16];//去头
    if(bArr1[i][j]<0)//合报
    iArrData[n++]=bArr1[i][j]+256;
    else
    iArrData[n++]=bArr1[i][j];
    }
    if(iYxNumber%8==0)//字节数
    iYxB=iYxNumber/8;
    else
    iYxB=iYxNumber/8+1;
    n=0;
    for(i=0,yxno=yxs;i<iYxB;i++)
    {
    m=iArrData[i];
    int iResult;
    for(j=0;j<8;j++)
    {
    k=m&0x01;
    if(n<iYxNumber)
    {
    iArrSendNo[n]=yxno;
    fArrData[n]=k;
    n++;
    yxno++;
    m=m>>1;
    }
    }
    }
    System.out.println("yao xin turned!");
    //遥测数据转换
    //f1遥测量值
    for(j=0,i=iYxB,ycno=ycs;j<iYcNumber;i=i+4,j++)
    {
    f1=iArrData[i] * 1 + iArrData[i+1] * 256 + iArrData[i+2] * 4096 + iArrData[i+3] * 4096 * 16;
    if(iArrData[i+3]>=128)
    f1=f1-fmax1;
    f1=f1/10;//小数
    iArrSendNo[n]=ycno;
    fArrData[n]=f1;
    n++;
    ycno++;
    }
    System.out.println("yao ce turned!");
    //写表
    try
    {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    conn=DriverManager.getConnection(dbURL,user,password);
    conn.setAutoCommit(true);

    stmt=conn.createStatement();
    stmt2=conn.createStatement();

    ps=conn.prepareStatement(insert);
    ps2=conn.prepareStatement(insert2);

    ps3=conn.prepareStatement(delete);
    ps4=conn.prepareStatement(update);

    ps5=conn.prepareStatement(delete2);
    ps6=conn.prepareStatement(update2);

    rs=stmt.executeQuery(select);
    iMax=0;
    while(rs.next())
    iMax=rs.getInt(1); 
    System.out.println("==>  中间表的标记最大值="+iMax);
    strTime=timestring.timeString();
    System.out.println("TimeString:"+strTime);
    for(i=0;i<iYxycNumber;i++)
    {
    ps.clearParameters();//清参
    ps.setString(1,strTime);//datadate
    ps.setString(2,String.valueOf(iArrSendNo[i]));//chasendn
    ps.setFloat(3,fArrData[i]);//datas
    ps.setInt(4,iMax+1);//flags
    ps.executeUpdate();
    if(i==0)System.out.print("==>  Inserting to table Y_MIDDLECHASEND ...");
    if(i%20==0)System.out.print(".");
    }
    System.out.println("OK!");
    if(iMax>iTimeslot)
    {
    System.out.println("==>  IMAX,MIDDLEMAX "+iMax+","+iTimeslot);
    ps3.clearParameters();
    ps3.setInt(1,iMax-iTimeslot);
    ps3.executeUpdate();
    //ps3.close();
    System.out.println("==>  DELETED! ");
    ps4.clearParameters();
    ps4.setInt(1,iMax-iTimeslot);
    ps4.executeUpdate();
    //ps4.close();
    System.out.println("==>  UPDATE!");
    }
    //写最终表

    try
    {
    fengaowei=Integer.parseInt(strTime.substring(10,11));
    fendiwei=Integer.parseInt(strTime.substring(11,12));
    fen=fengaowei*10+fendiwei;
    if(fen>=0&&fen<15)strfen="0000";
    if(fen>=15&&fen<30)strfen="1500";
    if(fen>=30&&fen<45)strfen="3000";
    if(fen>=45&&fen<59)strfen="4500";
    strTime=strTime.substring(0,10)+strfen;
    System.out.println("==>  时间字段="+strTime);
    rs2=stmt2.executeQuery(select2);
    iMax=1;
    while(rs2.next())
    iMax=rs2.getInt(1); 
    System.out.println("==>  最终表的标记最大值="+iMax);
    for(i=0;i<iYxycNumber;i++)
    {
    ps2.clearParameters();//清参
    ps2.setString(1,strTime);//datadate
    ps2.setString(2,String.valueOf(iArrSendNo[i]));//chasendn
    ps2.setFloat(3,fArrData[i]);//datas
    ps2.setInt(4,iMax+1);//flags
    ps2.executeUpdate();
    if(i==0)System.out.print("==>  Inserting to table Y_FINALCHASEND ...");
    if(i%20==0)System.out.print(".");
    }
    System.out.println("OK!");
    if(iMax>finalMax)
    {
    System.out.println("==>  IMAX,finalMAX "+iMax+","+finalMax);
    ps5.clearParameters();
    ps5.setInt(1,iMax-finalMax);
    ps5.executeUpdate();
    //ps5.close();
    System.out.println("==>  DELETED! ");
    ps6.clearParameters();
    ps6.setInt(1,iMax-finalMax);
    ps6.executeUpdate();
    //ps6.close();
    System.out.println("==>  UPDATE!");
    }
    }catch(SQLException sqlex)
    {
    System.out.println("**ALREADY EXIST**");
    System.out.println(sqlex);
    }

    stmt.close();
    rs.close();
    ps.close();
    stmt2.close();
    rs2.close();
    ps2.close();
    stmt=null;
    rs=null;
    ps=null;
    stmt2=null;
    rs2=null;
    ps2=null;
    conn.close();

    }catch(Exception ex)
    {
    System.out.println();
    System.out.println("==>  *** 警告 ***");
    System.out.println(ex);
    System.out.println("==>  ************");
    }
    }//else4
    }//else3
    }//else2
    }//esle1
    }catch(Exception ex)
    {
    System.out.println(ex);
    }
    iMax=0;
    count1=0;
    id1=0;
    System.out.println("Stand by......");
    System.gc();
    }//while
    }catch(Exception ex)
    {
    System.out.println(ex);
    System.out.println("Fail!try again!!");
    System.exit(0);
    }
    }
    }
    //时间转换为字符串*****
    class TimeString
    {
    String timestr;
    String year;
    String month;
    String day;
    String hour;
    String minute;
    String second;
    TimeString()
    {
    }
    public String timeString()
    {
    java.util.Date date=new java.util.Date();
    year=String.valueOf(date.getYear()+1900);
    if ((date.getMonth()+1)<10)
    month="0"+String.valueOf(date.getMonth()+1);
    else
    month=String.valueOf(date.getMonth()+1);
    if(date.getDate()<10)
    day="0"+String.valueOf(date.getDate());
    else
    day=String.valueOf(date.getDate());
    if(date.getHours()<10)
    hour="0"+String.valueOf(date.getHours());
    else
    hour=String.valueOf(date.getHours());
    if(date.getMinutes()<10)
    minute="0"+String.valueOf(date.getMinutes());
    else
    minute=String.valueOf(date.getMinutes());
    if(date.getSeconds()<10)
    second="0"+String.valueOf(date.getSeconds()); 
    else
    second=String.valueOf(date.getSeconds()); 
    timestr=year+month+day+hour+minute+second;
    return timestr;
    }

    }//:~时间转换为字符串*****