자바에서 byte[] memory usage
- Posted at 2008/04/17 14:00
- Filed under Program/JAVA
길이 10의 byte[]를 10,000개 만들 경우 실제 데이터의 메모리는 100,000 byte가 됩니다. 하지만 프로파일러에는 234KB가 10,0001개 생성되었고 234KB 할당 되어 있다고 나옵니다.

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
Posted by 김형준
- Response
- No Trackback , 3 Comments
Trackback URL : http://www.jaso.co.kr/trackback/252
Comments List
-
10 length 짜리 String object 2개를 20 length짜리 String object로 합친 후 연산 전에 생성된 object를 GC가 다 제거했다면, 똑같을 것 같은데...
GC가 다 제거 하지 않았다고 봐야할까요? -
해결해 주오^^.. 전에 이문제땜에 자바 때려칠까 그랬음...
-
잘 읽었습니다.
요즘 검색엔진의 TERM들을 메모리로 올려서 동적색인성능을 향상시키는 테스트를 하고있었는데, 파일사이즈가 300M임에도 메모리에 올리니 700M를 차지 하더군요.
그 역시 내부데이터에 byte[]가 대부분인지라 ENTRY당 12byte의 오버헤드를 감안하면 비슷한 수치가 나오네요.
그런데 그보다도 실제 문제는, 메모리가 3G로 충분함에도 700M의 SPACE를 더 사용해버리니 GC가 더욱 자주일어나며 FGC시간이 3~4초대로 늘어나 엔진이 잠시 멈추는 현상이 발견된다는 것입니다. 따라서 전체적인 THROUGHPUT이 70%에도 못미친다는.... 물론 다른 모듈의 메모리 사용정책이 방만해서 일어난 현상이라고는 하지만 요즘 저도 자바가 미오지고 있음당...ㅋ.ㅋ JASO님 혹시 이문제 해결하셨으면 저도 좀 알려주세용..ㅋ






