자바에서 byte[] memory usage

어제 포스팅한 자바 메모리 관련해서 계속 프로파일링 도중에 다음과 같은 아주 심플한 코드들 JProfiler를 이용하여 프로파일링을 해 봤습니다.

길이 10의 byte[]를 10,000개 만들 경우 실제 데이터의 메모리는 100,000 byte가 됩니다. 하지만 프로파일러에는 234KB가 10,0001개 생성되었고 234KB 할당 되어 있다고 나옵니다.
사용자 삽입 이미지
    List<byte[]> values =  new ArrayList<byte[]>();
   
    byte[] aaa = new byte[10];
   
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String a = "1";
    int size = 0;
    for(int i = 1;  i < 1000000; i++) {
      values.add("1234567890".getBytes());
      size += 10;
     
      if(i % 10000 == 0) {
        System.gc();
        long free = Runtime.getRuntime().freeMemory();
        long total = Runtime.getRuntime().totalMemory();
        System.out.println(i + ">" + size + ">" + free + ">" + total + ">" + (total-free));
        reader.readLine();
      }
    }

이것과 관련해서 검색해보니까 Java에서는 32bit JVM의 경우 하나의 byte[]를 저장하는데 12byte의 추가 메모리가 필요하다고 합니다(http://forum.java.sun.com/thread.jspa?threadID=5216017&messageID=9879177). 그러면 100,000byte + 120,000byte = 220,000 byte로 프로파일링된 결과가 많이 비슷해진 것을 알 수 있습니다.
오버헤드가 너무 심하다는 생각입니다. byte[]에 아주 작은 값이 많이 쌓이는 경우라면 실제 생성한 데이터의 크기와 메모리 할당되는 크기가 너무 차이가 나서 개발자가 예상하지 못한 곳에서 OutOfMemory가 발생할 가능성이 많습니다.
제 경우도 이런 노가다 분석을 시작한 이유가 이것 때문입니다. 실제 데이터는 100MB  정도 넣었는데 메모리는 거의 400MB 이상을 사용하고 있었던 거죠...
난감하네요. 해결해야 하는데

http://www.javaworld.com/javaworld/javatips/jw-javatip130.html?page=2
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


Trackback URL : http://www.jaso.co.kr/trackback/252

Comments List

  1. 홍태희 2008/04/22 13:11 # M/D Reply Permalink

    10 length 짜리 String object 2개를 20 length짜리 String object로 합친 후 연산 전에 생성된 object를 GC가 다 제거했다면, 똑같을 것 같은데...
    GC가 다 제거 하지 않았다고 봐야할까요?

  2. typos 2008/04/22 16:38 # M/D Reply Permalink

    해결해 주오^^.. 전에 이문제땜에 자바 때려칠까 그랬음...

  3. 송상욱 2008/08/04 17:28 # M/D Reply Permalink

    잘 읽었습니다.

    요즘 검색엔진의 TERM들을 메모리로 올려서 동적색인성능을 향상시키는 테스트를 하고있었는데, 파일사이즈가 300M임에도 메모리에 올리니 700M를 차지 하더군요.

    그 역시 내부데이터에 byte[]가 대부분인지라 ENTRY당 12byte의 오버헤드를 감안하면 비슷한 수치가 나오네요.

    그런데 그보다도 실제 문제는, 메모리가 3G로 충분함에도 700M의 SPACE를 더 사용해버리니 GC가 더욱 자주일어나며 FGC시간이 3~4초대로 늘어나 엔진이 잠시 멈추는 현상이 발견된다는 것입니다. 따라서 전체적인 THROUGHPUT이 70%에도 못미친다는.... 물론 다른 모듈의 메모리 사용정책이 방만해서 일어난 현상이라고는 하지만 요즘 저도 자바가 미오지고 있음당...ㅋ.ㅋ JASO님 혹시 이문제 해결하셨으면 저도 좀 알려주세용..ㅋ

Leave a comment
« Previous : 1 : ... 178 : 179 : 180 : 181 : 182 : 183 : 184 : 185 : 186 : ... 388 : Next »