[英]Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at org.apache.commons.lang3.ArrayUtils
[英]java.lang.OutOfMemoryError: Java heap space at org.apache.xmlbeans.impl.store.Saver$TextSaver.resize
我試圖將我的數據導出到包含近70000行的excel工作表中。 我收到以下錯誤:
線程“ http-bio-8765-exec-1”中的異常java.lang.OutOfMemoryError:org.apache處org.apache.xmlbeans.impl.store.Saver $ TextSaver.resize(Saver.java:1700)處的Java堆空間.xmlbeans.impl.store.Saver $ TextSaver.preEmit(Saver.java:1303)在org.apache.xmlbeans.impl.store.Saver $ TextSaver.emit(Saver.java:1190)
以下是用於編寫Excel的代碼:
public String getXLSWriter(ResultSet rs, String file_name)
{
String filepath="";
try {
//String filename=file_name.replace('/','_');
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet(file_name);
XSSFRow rowhead = sheet.createRow((int) 0);
filepath=prop.getProperty("file_store_path")+file_name+timeStamp+".xlsx";
FileOutputStream fileOut = new FileOutputStream(filepath);
rowhead.createCell((int) 0).setCellValue("ID");
rowhead.createCell((int) 1).setCellValue("firstName");
rowhead.createCell((int) 2).setCellValue("LastName");
int i = 1;
while (rs.next()){
XSSFRow row = sheet.createRow((int) i);
row.createCell((int) 0).setCellValue(rs.getString("id"));
row.createCell((int) 1).setCellValue(rs.getString("first_name") );
row.createCell((int) 2).setCellValue(rs.getString("last_name"));
i++;
}
workbook.write(fileOut);
fileOut.close();
System.out.println("XLS done!!");
} catch (SQLException e1) {
e1.printStackTrace();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
以下是我用於下載Excel的代碼:
public void getDownloaded(String filepath,HttpServletResponse response)
{
try {
File file=new File(filepath);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment;filename="+file.getName());
FileInputStream in=new FileInputStream(file);
ServletOutputStream out=response.getOutputStream();
byte[] outputByte = new byte[4096];
//copy binary content to output stream
int length;
while((length=in.read(outputByte, 0, 4096)) != -1){
out.write(outputByte, 0, length);
}
in.close();
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
啟動Java來增加最大內存時,不要一次讀取所有數據,也不要使用-Xmx選項。 檢查是否存在內存泄漏,並將此數據導入數據庫以保存本地內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.