[JAVA]Download outOfMemory

JAVA 2017. 11. 3. 15:53

Download outOfMemory


JAVA 에서 파일 다운로드 구현 시 파일사이즈가 작은 경우는 아무렇게나 코딩을 해도 쉽사리 에러가 나지 않습니다. 하지만 큰 파일을 다운로드 하는 서블릿이나 Action 을 구현할 경우 종종 OutOfMemory 가 발생 할 수 있습니다.


byte[] buffer 를 이용하는 것은 널리 알려져 있지만, 그래도 종종 문제가 되는 상황을 보게 되는데, StackOverFlow에 좋은 답변이 나와있어서 개인적으로 정리를 해보기 위해 작성합니다.



원문

http://stackoverflow.com/questions/7106775/how-to-download-large-files-without-memory-issues-in-java


1. byte[] buf = new byte[8192];

(보통은 1024로 해도 됩니다. ) 식으로 코딩적으로 read buffer 를 구성하면 한번에 읽어들여 메모리상에 올리지 않도록 함.


2. 파일이 클경우는 while 루프를 모두 돌아 한방에 flush() 을 했다가는 여차하면 OutOfMemory 가 발생하므로 적절하게 중간에 flush()를 해서 write 버퍼를 비우는 작업을 해줍시다. (파일이 작을경우는 상관없지만, 파일이 크게되면 필수적으로 해주는게 좋을꺼같습니다.)


3. 추가적으로 파일이 클 경우 흔히들 사용하는 BufferedInputStream 보다 FileInputStream 을 사용하는게 메모리 사용상 좋다고 합니다. (제 의견보다는 원문에 작성자분께서 우선적으로 사용해보면 좋다고..)


ex) Servlet 이든 jsp 이든 적절히 둘러싸면 될꺼 같습니다.


FileInputStream fileInputStream  = new FileInputStream(file);

byte[] buf = new byte[8192];

int bytesread = 0, bytesBuffered = 0;

while( (bytesread = fileInputStream.read( buf )) > -1 ) {

out.write (buf, 0, bytesread);


bytesBuffered += bytesread;

    if (bytesBuffered > 1024 * 1024) { //flush after 1MB

        bytesBuffered = 0;

        out.flush();

}

}

out.flush();



'JAVA' 카테고리의 다른 글

[JAVA] error  (0) 2017.11.06
[JAVA]EncodingFilter 구현  (0) 2017.11.06
[JAVA]Dispatche :: request.getRequestDispatcher("/prg/board_excel.jsp");  (0) 2017.11.03
[JAVA]dbconnection 끊어지는 현상  (0) 2017.11.03
[JAVA] DateUtil2  (0) 2017.11.01
블로그 이미지

마크제이콥스

초보 개발자의 이슈및 공부 내용 정리 블로그 입니다.

,