/**
 * 读取日志
 */
private void read(DataInputStream dis,
  Vector<LogRec> logins,
  Vector<LogRec> logouts)
throws LogFileException{
try {
int len = dis.available();
int count = len/372;
for(int i=0;i<count;i++){
System.out.println("记录第"+i);
byte[] bloginName = new byte[32];
dis.read(bloginName);
String loginName = new String(bloginName).trim();
//跳过36字节
dis.skipBytes(36);
//读取进程ID
int pid = dis.readInt();
//读取登录类型
short type = dis.readShort();
//跳过6个字节
dis.skipBytes(6);
//读取登录的或登出的时刻(文件中是以妙算的,让它换成毫秒)
long loginTime = dis.readInt()*1000L;
//跳过30字节
dis.skipBytes(30);
//读取登录IP
byte[] bloginIp = new byte[257];
dis.read(bloginIp);
String loginIp = new String(bloginIp).trim();
//跳过1字节(因为C语言中的类型补齐)
dis.skipBytes(1);
//判断7 8 放入响应的数据结构
//两个过滤:1.登录名不能以.开头 例如: .telnet(因为有些命令也会产生登录用户,并以.开头)
    //   2. 7和8过滤
if(!loginName.startsWith(".")){
if(type == 7 || type == 8){
LogRec log = new LogRec();
log.setLoginName(loginName);
log.setLoginIp(loginIp);
log.setLoginTime(loginTime);
log.setPid(pid);
if(type == 7){
logins.add(log);
}else{
logouts.add(log);
}
//数据读到500条回收下内存
if(i%500 == 0){
Runtime.getRuntime().gc();
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
throw new LogFileException("日志文件读取错误");
} finally{
if(dis!=null) try{ dis.close(); } catch(IOException e){e.printStackTrace();}
}
}自家内存1G,文件一共才50mb   数据量是16万条机器内存肯定够用的,但为什么会java.lang.OutOfMemoryError: Java heap space 呢?
是不是因为vector存不下这么多?请大牛们指点!!

解决方案 »

  1.   

    jvm默认最大内存好象是64M吧,你要在启动时加上vm参数-Xms256 -Xmx512
    -Xms256表示初始内存256M
    -Xmx512表示最大内存512M
      

  2.   

    ECLIPSE上加了怎么没反应?说没次参数到底该加哪?
      

  3.   

    调整jvm内存参数,除非写数据库或文件,别无它法,迟早要溢出的
      

  4.   

    即使内存足够 ,这里也绝对不应该使用Vector,应该直接用数组,因为你的长度是已知的
      

  5.   

    调整JVM内存大小吧. java --help
      

  6.   

    //数据读到500条回收下内存
    if(i%500 == 0){
        Runtime.getRuntime().gc();
    }这句写了等于白写,基本上没有垃圾内存来回收,就算有垃圾内存在调用 gc 方法也并不是立即会执行的。把信息存到这两个 Vector 中的目的是什么呢?最后这里面的数据到哪去呢?
      

  7.   


    然后用一个方法把两个VECTOR中的数据进行匹配gc不是执行垃圾回收吗?怎么没效果?
      

  8.   

    GC什么时候执行 你根本就不知道的。即使你调用了GC,它也不会马上执行的,具体执行时间,你还是不知道的。
      

  9.   

    Runtime.getRuntime().gc(); 只是通知下jvm该回收内存,jvm是否回收那就不一定了