系统采用的是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 
但是不管用,请教一下,我这个问题是出在什么地方

解决方案 »

  1.   

    200个Integer[] 这个占用不了多少空间的。
    不一定是这段代码的事情。你可以考虑,删除这段处理代码看看,是否还出现内存溢出。
      

  2.   

    其他地方不报错,第二次数量比较小的话也不会报错看内存似乎上限是108m,怀疑是myeclipse里面设置的问题
      

  3.   

    1>. 首先确定是不是这段代码导致的问题.
    2>. 如果确定是, 检查这段代码外部是否有循环.
    3>. 
    Integer[] s = f.getChosen(); for (Integer staffID : s) { 
    .......
        //使用完
           staffID = null; 

    s = null;
    4>. 还不能解决问题:
        在第一次调用完后,调用System.gc();
      

  4.   

    详细部分如下:for(int i = 0; i < s.length; i++){
    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中内存调大后不会报错,但每次录入都会增加。增加到上限也还是会报错。搞不懂为什么只增加不减少
      

  5.   

    同意这个: 在第一次调用完后,调用System.gc();
      

  6.   


    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;