求救!!!java内存漏洞问题应怎么解决!? 不要一个劲地new 对象!可以重用的就中用。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 定时强制进行内存回收!System.gc();回收的是不再被引用的对象,可是我做的程序是个无限循环啊,能收走吗?不过我可以试一下! 看看 http://www.cn.ibm.com/developerWorks/java/j-leaks/index.shtml 吧,很不错的一篇文章。 你看来是对JAVA的还是不太了解,不管是你的程序是不是无限循环,当然是可以定时回收的。比如说,你改一下你的原程序,比如说再开个优先级比较第的线程进行定时回收! hobby:呵呵,我是初学者!很多java高级技术都没有深入研究!我不太知道java程序里到底什么样的东西算是垃圾,并可以回收!既然程序里有垃圾对象,java VM为什么不自动回收它呢?哎,苦恼啊! hobby:呵呵,我是初学者!很多java高级技术都没有深入研究!我不太知道java程序里到底什么样的东西算是垃圾,并可以回收!既然程序里有垃圾对象,java VM为什么不自动回收它呢?哎,苦恼啊! java本身的程序在怎么写也不会有内存泄漏的,否则就不是java了。如果真的是内存泄漏的话,一定跟别的有关系。可能是你的程序调用了其他的系统资源,比如网络连接,或是数据库连接,这些资源要及时、强制的释放掉。还有可能是java VM有问题,我机器上的jdk1.3在运行jbuilder的时候经常会出现非法操作,以前用jview我也遇到过内存泄漏。你可以换个javaVM或是换个操作系统看看。 我把程序重新写了,这样又引起其他的问题!数据库那边刚开始写的很正常,执行一段时间后就执行的特别慢,我不知道怎么排除这个难题,还忘各位给我指点!!!!!谢谢!!!!!下面是这部分的主要代码!!!!!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; } }//:~时间转换为字符串***** could not find the main class,program will exit jtree的使用(Swing) NoSuchMethodError 求一个简单函数,初学者提问,谢谢 急,困扰了两天的问题,应该不难解决,但我就是没办法,望高手指点 连数据库的程序,打成Jar包后的问题 请教中文转换的问题 把java类作为参数传到procedure中的问题 请教applet的一个问题?? 这个要求值50分吗? javascript 控制鼠标为,方向型,手型的难题,如<-> lichlong(传龙),jant在哪下载?
比如说,你改一下你的原程序,比如说再开个优先级比较第的线程进行定时回收!
呵呵,我是初学者!很多java高级技术都没有深入研究!我不太知道java程序里到底什么样的东西算是垃圾,并可以回收!既然程序里有垃圾对象,java VM为什么不自动回收它呢?
哎,苦恼啊!
呵呵,我是初学者!很多java高级技术都没有深入研究!我不太知道java程序里到底什么样的东西算是垃圾,并可以回收!既然程序里有垃圾对象,java VM为什么不自动回收它呢?
哎,苦恼啊!
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;
}
}//:~时间转换为字符串*****