org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
java.lang.OutOfMemoryError: Java heap space

解决方案 »

  1.   

    这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实现.
    设置的方法主要是几个.1.可以在windows 更改系统环境变量
    加上JAVA_OPTS=-Xms64m -Xmx512m2,如果用的tomcat,在windows下,可以在C:\tomcat5.5.9\bin\catalina.bat  中加上:set JAVA_OPTS=-Xms64m -Xmx256m位置在: rem Guess CATALINA_HOME if not defined  这行的下面加合适.3.如果是linux系统
    Linux  在{tomcat_home}/bin/catalina.sh的前面,加
    set JAVA_OPTS='-Xms64 -Xmx512'
    java.lang.OutOfMemoryError: Java heap space
    使用Java程序从数据库中查询大量的数据时出现异常:
    java.lang.OutOfMemoryError: Java heap space
    在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。
    例如:java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar
    如果Heap Size设置偏小,除了这些异常信息外,还会发现程序的响应速度变慢了。GC占用了更多的时间,而应用分配到的执行时间较少。
    Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
    Heap size的 -Xms -Xmn 设置不要超出物理内存的大小。否则会提示“Error occurred during initialization of VM Could not reserve enough space for object heap”。
      

  2.   

    package com.sitech.action.opertable;import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;public class TestExcel {
    public static void main(String[] args) throws IOException {
    List<String[]> rowList = getExcel();
    for (int i = 0; i < 5; i++) {
    String[] strs = rowList.get(i);
    for (int j = 0; j < 8; j++) {
    String str = strs[j];
    System.out.print(str + "  ");
    }
    System.out.println();
    }
    } public static List<String[]> getExcel() {
    try {
    InputStream myXls = new FileInputStream("D:\\号百法律秘书退赔款.xls");
    HSSFWorkbook hwb = new HSSFWorkbook(myXls);// 获取excel文本对象
    HSSFSheet sheet = hwb.getSheetAt(1);
    int rowCount = sheet.getLastRowNum() + 1;
    System.out.println(rowCount);
    List<String[]> rowList = new ArrayList<String[]>();
    for (int i = 0; i < rowCount; i++) {
    HSSFRow row = sheet.getRow(i);
    if(row == null){
    continue;
    }
    String[] cellvalue = new String[8];
    for (short j = 0; j < 8; j++) {
    HSSFCell cell = row.getCell(j);
    if (cell != null) {
    if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {// 判断单元格为字符串
    cellvalue[j] = cell.getStringCellValue().trim();
    System.out.println("第" + i + "行第" + j + "列: "
    + cellvalue[j]);
    } else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {// 判断单元格为数字
    if (j == 7) {
    cellvalue[j] = cell.getNumericCellValue() + "";
    }
    cellvalue[j] = (int) cell.getNumericCellValue()
    + "";
    System.out.println("第" + i + "行第" + j + "列: "
    + cellvalue[j]);
    } else {
    cellvalue[j] = "";
    }
    }else{
    break;
    }
    }
    rowList.add(cellvalue);
    }
    return rowList;
    } catch (Exception e) {
    e.printStackTrace();
    return null;
    }
    }
    }
    这是我的测试代码,直接运行就可以。在文本页面运行就报错了
      

  3.   

    已经解决了。这个程序是使用POI读取excel文件,但是它最大好像只能读取小于3M的文件。