/**
* 读取日志
*/
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存不下这么多?请大牛们指点!!
* 读取日志
*/
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存不下这么多?请大牛们指点!!
-Xms256表示初始内存256M
-Xmx512表示最大内存512M
if(i%500 == 0){
Runtime.getRuntime().gc();
}这句写了等于白写,基本上没有垃圾内存来回收,就算有垃圾内存在调用 gc 方法也并不是立即会执行的。把信息存到这两个 Vector 中的目的是什么呢?最后这里面的数据到哪去呢?
然后用一个方法把两个VECTOR中的数据进行匹配gc不是执行垃圾回收吗?怎么没效果?