系统采用的是struts,hibernate,开发工具是myeclipse,系统是XP系统提交一个Integer[],数量超过200的时候会报java.lang.OutOfMemoryError: Java heap space的错误但是很奇怪,第一次提交的时候不会报,以后提交都会报这个错误。用到Integer[]的action里面就是Integer[] s = f.getChosen();for (Integer staffID : s) {
.......
}尝试改过tomcat里面的参数:set JAVA_OPTS=-Xms64m -Xmx256m
但是不管用,请教一下,我这个问题是出在什么地方
.......
}尝试改过tomcat里面的参数:set JAVA_OPTS=-Xms64m -Xmx256m
但是不管用,请教一下,我这个问题是出在什么地方
不一定是这段代码的事情。你可以考虑,删除这段处理代码看看,是否还出现内存溢出。
2>. 如果确定是, 检查这段代码外部是否有循环.
3>.
Integer[] s = f.getChosen(); for (Integer staffID : s) {
.......
//使用完
staffID = null;
}
s = null;
4>. 还不能解决问题:
在第一次调用完后,调用System.gc();
int staffID = s[i];
// 录入staffID
Staff staff = new Staff();
StaffDAO staffdao = new StaffDAO();
TrainStaffAndStaff tss = new TrainStaffAndStaff();
TrainStaffAndStaffDAO tssdao = new TrainStaffAndStaffDAO();
TrainStaffAndDept tsd = new TrainStaffAndDept();
TrainStaffAndDeptDAO tsddao = new TrainStaffAndDeptDAO();
tss.setStaffID(staffID);
tss.setTrainStaffID(trainStaffID);
// 如果没有重复则录入
if (!tssdao.hasSame(trainStaffID, staffID)) {
tssdao.addTrainStaffAndStaff(tss);
}
// 录入deptID
staff = (Staff) staffdao.getStaff(staffID);
int deptID = staff.getDeptID();
tsd.setDeptID(deptID);
tsd.setTrainStaffID(trainStaffID);
// 如果没有重复的则录入
if (!tsddao.hasSame(trainStaffID, deptID)) {
tsddao.addTrainStaffAndDept(tsd);
}
}
System.gc();tomcat中内存调大后不会报错,但每次录入都会增加。增加到上限也还是会报错。搞不懂为什么只增加不减少
1>.
StaffDAO staffdao = new StaffDAO();
TrainStaffAndStaffDAO tssdao = new TrainStaffAndStaffDAO();
TrainStaffAndDeptDAO tsddao = new TrainStaffAndDeptDAO();
3个DAO的实例化应该提到for循环外面, 只需要实例化一次
2>. Staff staff = new Staff(); 好象没用,应该删除
3>. staff, tss, tsd用完应该设置为null,促进GC及时回收修改过代码如下:
StaffDAO staffdao = new StaffDAO();
TrainStaffAndStaffDAO tssdao = new TrainStaffAndStaffDAO();
TrainStaffAndDeptDAO tsddao = new TrainStaffAndDeptDAO();
for(int i = 0; i < s.length; i++){
int staffID = s[i];
// 录入staffID
TrainStaffAndStaff tss = new TrainStaffAndStaff();
TrainStaffAndDept tsd = new TrainStaffAndDept(); tss.setStaffID(staffID);
tss.setTrainStaffID(trainStaffID);
// 如果没有重复则录入
if (!tssdao.hasSame(trainStaffID, staffID)) {
tssdao.addTrainStaffAndStaff(tss);
}
// 录入deptID
Staff staff = (Staff) staffdao.getStaff(staffID);
int deptID = staff.getDeptID();
tsd.setDeptID(deptID);
tsd.setTrainStaffID(trainStaffID);
// 如果没有重复的则录入
if (!tsddao.hasSame(trainStaffID, deptID)) {
tsddao.addTrainStaffAndDept(tsd);
}
staff = null;
tss = null;
tsd = null;
}