首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取java.lang.OutOfMemoryError:超出Jboss中的GC开销限制

获取java.lang.OutOfMemoryError:超出Jboss中的GC开销限制
EN

Stack Overflow用户
提问于 2014-06-11 15:37:32
回答 1查看 10.6K关注 0票数 1

我正在尝试使用Struts2来部署一个web应用程序,它从两个Excel表格中读取大约40mb文件中的数据并更新它,我正在将它部署到Jboss-5中,但是我得到了java.lang.OutOfMemoryError: GC overhead limit exceeded错误。

当我通过Netbeans运行我的简单Java应用程序时,使用相同的脚本;最初我遇到了同样的问题,但我通过将-Xmx值增加到2g来增加Java堆内存,然后脚本运行得很好。

我也尝试在Jboss中增加-Xmx的值,但有些人又抛出了java.lang.OutOfMemoryError: GC overhead limit exceeded" error

下面是完整的堆栈跟踪。

代码语言:javascript
复制
java.lang.OutOfMemoryError: GC overhead limit exceeded
        at org.apache.poi.hssf.record.aggregates.ValueRecordsAggregate.addMultipleBlanks(ValueRecordsAggregate.java:159)
        at org.apache.poi.hssf.record.aggregates.RowRecordsAggregate.<init>(RowRecordsAggregate.java:103)
        at org.apache.poi.hssf.model.InternalSheet.<init>(InternalSheet.java:208)
        at org.apache.poi.hssf.model.InternalSheet.createSheet(InternalSheet.java:163)
        at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:296)
        at com.zaxis.tm.utils.ExcelParser.readXldata(ExcelParser.java:84)
        at com.zaxis.tm.action.UploadFile.execute(UploadFile.java:231)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
        at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
        at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)
        at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)
        at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
        at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
        at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
        at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
        at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
        at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
        at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
        at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
        at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
        at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
        at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

方法,我得到的问题是

代码语言:javascript
复制
public boolean readXldata(String path,UpdateBean term) {

    logger.info("%%%%%%%%%%%%%%%% Inside Reading Export main Fle %%%%%%%%%%%%%%%%");


    ExportBean video = null;
    HSSFRow myRow = null;
    boolean status = false;
    ProcessMethods methds = new ProcessMethods();
    try{


        if(myFileSystem == null){
           myFileSystem = new NPOIFSFileSystem(new File(path));
        }
        if (myWorkBook == null){
           myWorkBook = new  HSSFWorkbook(myFileSystem.getRoot(),true);
        }
        if (mySheet == null){
            mySheet = myWorkBook.getSheetAt(0);
        }
        if(mySheet.isColumnHidden(2)){

            mySheet.setColumnHidden(2, false);
        }
       Iterator rowIter = mySheet.rowIterator();

       int start = term.getStart_index();

       logger.info("TARGET LANG START INDEX ::" +start+ "LAST INDEX ::" +term.getEnd_index());


       while(rowIter.hasNext()){



            flag = 0;
            myRow = (HSSFRow) rowIter.next();
            int id = 0;

            try{
                id = new Double(myRow.getCell(0).toString().trim()).intValue();
                logger.info("ID ::" +myRow.getCell(0));

            }catch(NumberFormatException nex){
                logger.info("\nNUMBER FORMAT EXCEPTION WHIILE READING CONTENT ENTRY IN FILE ::");
                continue;
            }

            }else{
                 logger.info("\nNUMBER FORMAT EXCEPTION WHIILE READING CONTENT ENTRY IN FILE ::");
                continue;
            }

            video = new ExportBean();

            video.setConcept(id);



            int Rownum =myRow.getRowNum();
            video.setRowno_ex(Rownum);

            int LastRow = mySheet.getPhysicalNumberOfRows() - 7 ;




             if(myRow.getCell(1)!=null && !myRow.getCell(1).toString().equals("")){
                video.setEntryclass(myRow.getCell(1).toString().trim());

            }







            flag=0;
            logger.info("LAST ROW NUMBER ::" +LastRow+" ROW NUMBER  ::" +Rownum+ "FLAG ::" +flag);

            if(term.getEnglish_term().equalsIgnoreCase(video.getEng_term())){
               flag = 1;


              if(!term.getTarget_term().equalsIgnoreCase(video.getTar_term())){

                  logger.info("Termlist English term is same to Export main  english term");
                  logger.info("Termlist English term" +term.getTarget_term()+" is not same to Export main  english term");

                  if(this.Update_Row(video,term)){

                      logger.info(" ############ ROW  NO::"+ video.getRowno_ex() + "SUCCESSFULLY UPDATED #######");
                      status = true;
                      return status;
                                                 }else{
                      logger.info(" ############  UPDATION FAILED  #########");
                      return status;
                                                      }

              }

            }else if (LastRow == Rownum && flag == 0){

                  logger.info("Reached to end of the row");

                 if(Insert_Row(video,term)){
                     logger.info("Insertion done successfully at row "+ mySheet.getLastRowNum());

                     return status=true;

                 }else{
                    logger.info("Failed to insert values at the last row");
                    return status;

                 }
              }

              logger.info("Termlist Eng term  is not same to main term " +video.getEng_term()+ " Continue with the process.......");

             continue;

        }

     myFileSystem.close();



    } catch (Exception e) {
        e.printStackTrace();
    }

    return status;
}
EN

回答 1

Stack Overflow用户

发布于 2014-06-11 16:02:50

超出GC开销限制意味着JVM花费了太多时间进行垃圾收集,这通常意味着您没有足够的内存。因此,您可能有内存泄漏,您应该启动jconsole或jprofiler,并将其连接到您的jboss,并在其运行时监视内存使用情况。

暂时将内存(Xmx)增加到尽可能多的空闲内存,这也有助于解决此问题。因为如果您可以延迟内存不足,您将有更多的时间来查找潜在的泄漏

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24157183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档