最近我在我的Web应用程序中遇到了这个错误:
java.lang.OutOfMemoryError:PermGen空间
这是在Tomcat 6和JDK 1.6上运行的典型Hibernate/JPA + IceFaces/JSF应用程序.显然,重新部署应用程序几次后就会发生这种情况.
导致它的原因以及可以采取哪些措施来避免它?我该如何解决这个问题?
我有一个大的.xlsx文件(141 MB,包含293413行,每行62列)我需要在其中执行一些操作.
我在加载此文件(OutOfMemoryError)时遇到问题,因为POI在XSSF(xlsx)工作簿上占用大量内存.
这个问题类似,提出的解决方案是增加VM的分配/最大内存.
它似乎适用于那种文件大小(9MB),但对我来说,即使分配所有可用的系统内存,它也只是不起作用.(嗯,考虑到文件大于15倍,这并不奇怪)
我想知道是否有任何方法以不占用所有内存的方式加载工作簿,但是,没有基于(进入)XSSF的底层XML进行处理.(换句话说,维护清教徒POI解决方案)
如果没有强硬的话,欢迎你说("没有."),并指出了解决"XML"问题的方法.
我需要自动适应大(30k +行)xlsx文件中的所有行.
以下代码通过apache poi适用于小文件,但适用于大文件OutOfMemoryError:
Workbook workbook = WorkbookFactory.create(inputStream);
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
row.setHeight((short) -1);
}
workbook.write(outputStream);
Run Code Online (Sandbox Code Playgroud)
更新:不幸的是,增加堆大小不是一个选项 - OutOfMemoryError出现在-Xmx1024m和30k行不是一个上限.
尝试使用以下代码编写excel文件
public static void main(String[] args)
{
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Book Data");
Map<String, Object[]> data = new TreeMap<String, Object[]>();
data.put("1", new Object[] {"ID", "NAME", "LASTNAME"});
for(int i=2;i<100000;i++)
{
data.put(String.valueOf(i), new Object[] {i, "Name"+i, "LastName"+i});
}
Set<String> keyset = data.keySet();
int rownum = 0;
for (String key : keyset)
{
Row row = sheet.createRow(rownum++);
Object [] objArr = data.get(key);
int cellnum = 0;
for (Object obj : objArr)
{
Cell cell = row.createCell(cellnum++);
if(obj instanceof String) …Run Code Online (Sandbox Code Playgroud) 我正在使用Apache POI来读取excel文件.我的文件大约是100MB,我在加载工作簿时得到了这个java.lang.OutOfMemoryError:Java堆
XSSFWorkbook workbook = new XSSFWorkbook(excelFilePath);
Run Code Online (Sandbox Code Playgroud)
我的计算机内存是8GB,所以它不能使用-Xmx太大.所以我的问题是如何处理这个错误?
编辑
我的数据样本(我的数据大约是1087490行):
apache-poi ×4
java ×4
xssf ×2
exception ×1
heap-memory ×1
java-6 ×1
memory ×1
memory-leaks ×1
permgen ×1
xlsx ×1