Java(자바)
Java excel poi 메모리 누수 대비(memory leak), 자바 xlsx만들기, Java xlsx 만들기
마샤와 곰
2019. 12. 19. 17:34
자바에서 poi라는 패키지는 엑셀을 만드는데 자주 사용되는 라이브러리이다.
그런데 요녀석을 사용하다보면 메모리를 너무많이 사용해서 문제가 되는 경우가 많다.
아래 코드를 보면 통상적으로 xlsx 파일을 만드는 모습이다.
//생략..
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet();
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(1);
cell.setCellValue("값");
File file = new File("D:/test.xlsx");
FileOutputStream fos = new FileOutputStream(file);
workbook.write(fos);
workbook.close();
//생략..
요러한 기능을 통해서 약 3만건의 엑셀파일을 10회에 걸쳐서 여러번 만들면..
저렇게 올라간 메모리는 어떤 이유인지는 몰라도 자바의 가비지컬렉터(gc)가 해제를 시켜주는데 꽤 오래걸렸다.
이러한 현상을 대비하기 위하여 나온 클래스가 있다!
바로 SXSSFWorkbook 라는 클래스이다.
해당 클래스는 마찬가지로 아파치poi 패키지에 포함되어 있는 기본 클래스이다. 만약 해당클래스가 없다면 라이브러리 버전을 업그레이드 해 주어야 한다.
사용법도 기존 메소드 호출방법과 100% 동일하다. 아래코드를 보면,
//생략..
SXSSFWorkbook workbook = new SXSSFWorkbook();
SXSSFSheet sheet = workbook.createSheet();
SXSSFRow row = sheet.createRow(0);
SXSSFCell cell = row.createCell(1);
cell.setCellValue("값");
File file = new File("D:/test.xlsx");
FileOutputStream fos = new FileOutputStream(file);
workbook.write(fos);
workbook.close();
//생략..
기존 소스코드와 다른점이 없다.
패키지명을 비교하여 보면,
//기존에 메모리를 많이 사용하는 클래스
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
//메모리를 적게 사용하는 클래스
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
클래스 바로위에 streaming 이라는 패키지가 추가 된 것을 볼 수 있다.
클래스를 변경하고 나서 약 3만건의 엑셀파일을 10회에 걸쳐서 여러번 만들어 보았다.
만들어진 속도도 비슷한 것 같다.
엑셀을 만들다가 메모리 문제에 계속 직면한다면 poi의 streaming 패키지에 있는 클래스를 활용하는 것 도 좋을 것 같다.
반응형