알아보자
1k
2019-04-04 09:56:19
7
208

가비지 콜렉션 heap space 에러


자바프로그램에서 heap space 에러 떠서 configurations에서 arguments에다 

-XX:MaxPermSize=2048 -Xms2048m -Xmx4096m  이렇게 써줬는데도 똑같은 에러가 뜨네요

혹시 추가적으로 써야할 게 있을까요?

0
0
  • 답변 7

  • redeye0922
    778
    2019-04-04 10:04:47

    -XX:MaxPermSize=2048 (X)

    -XX:MaxPermSize=2048m (o)

    아닐까요?

    0
  • 알아보자
    1k
    2019-04-04 10:20:22

    아 오타가 있었네요..

    근데 수정해서 해보니까 java.lang.OutOfMemoryError: GC overhead limit exceeded 나오네요 ㅠㅠ

    0
  • 배우고싶은이
    607
    2019-04-04 10:41:40
    왠만한 시스템도 2G면 충분히 돌아가는데요.. 아마 어딘가에서 메모리 누수가 있는것 아닐까요?
    0
  • 알아보자
    1k
    2019-04-04 13:08:28

    메모리누수가 있다는게 프로그램 자체에 문제가 있다는 말인가요? 아님 다른 뜻이 있는건가요?

    0
  • 배우고싶은이
    607
    2019-04-04 14:03:06

    보통은 프로그램자체에 문제던데요.

    혹시 매우 큰데이터가 한번에 메모리에 로드되는것이ㅜ있나요?

    0
  • 알아보자
    1k
    2019-04-04 14:28:38

    사진파일들이 1.3기가 들어있는데 폴더로 읽어와서 엑셀파일로 만드는 작업이 있는데 이거 할 때 에러가 뜨는거라서요...

    0
  • 배우고싶은이
    607
    2019-04-04 15:10:12

    1.3기가 데이터를 메모리에 다 올리고 그상태에서 일반적으로 엑셀을 만들면 엑셀 파일 자체도 최소 1.3기가..


    둘이 합하면 그것만 메모리에 2.6기가 올라가겠네요.


    POI 라이브러리 쓰시면 SXSSFWorkbook 로 워크북 만드시고.. 

    만드실때 workBook = new SXSSFWorkbook(100); 이런식으로 사이즈를 주시면 엑셀파일이 다 만들어질때까지 메모리에 전부 가지고 있지 않게됩니다.(100행을 쓰고 버퍼내용을 파일로 떨굼)


    이미지도 한꺼번에 메모리에 올리지 마시고 하나씩 로드해서 엑셀에 쓰고 바로 비워주는 방식으로 하면 메모리 낭비를 막을 수 있습니다.


    for (.....) {

      File img = new File(...);

      이미지 작업.....

    }


    이런식으로 하면 루프 갯수만큼 객체가 계속 생성되고 새로운 변수에 담습니다.

    GC가 알아서 돌린다고는 하지만 일단 계속 메모리가 늘어나다가 어느시점에 GC가 돌면서 정리하겠죠.(않좋은 방법 입니다.)


    File img = null;

    for (.....) {

      img = new File(...);

      이미지 작업.....

    }

    루프 밖에서 변수 선언하고 재사용하면 GC입장에서 이전 객체는 안쓴다는 것이 명확함으로 더 좋은 결과를 볼수 있습니다.

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.