64 bits JVM vs. 32 bits JVM
- Posted at 2007/11/09 08:54
- Filed under Program/JAVA
최근 작업 중에 이상한 점을 발견했는데 프로그램에서 사용하는 메모리가 크게 증가 되었다는 점이다.
확인해본 결과 64 bits의 JVM을 사용하기 때문에 발생하는 문제였다. 자세히는 살펴보지 않았지만 짐작컨데 32 bits에서는 레퍼런스를 저장하는 부분이 32bits로 설정되어 있고, 64 bits 에서는 2배로 더 많이 잡혀져 있을 것이다. 그래야만 Heap을 더 많이 사용할 수 있을테니까...
이런 이유때문에 사이즈가 작은 많은 객체를 사용하는 애플리케이션에서는 객체의 레퍼런스를 유지하는데 사용되는 메모리가 당연히 증가할 수 밖에 없다.
다음과 같은 프로그램을 이용하여 테스트 해보았다.
public class MemoryTest {
public static void main(String[] args) {
Runtime.getRuntime().gc();
System.out.println("Total allocated memory before test:
" + Runtime.getRuntime().totalMemory());
long beforeFree = Runtime.getRuntime().freeMemory();
String str = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
SortedSet<MyItem> datas = new TreeSet<MyItem>();
long real = 0;
for(int i = 0;i < 10000; i++) {
MyItem item = new MyItem();
item.id = i;
item.data = str.getBytes();
datas.add(item);
real += item.data.length + Integer.SIZE;
}
Runtime.getRuntime().gc();
long endFree = Runtime.getRuntime().freeMemory();
System.out.println("Used memory: " + (beforeFree - endFree) + ", real data memory: " + real + ", allocated memory: " + Runtime.getRuntime().totalMemory());
}
}
class MyItem implements Comparable<MyItem> {
int id;
byte[] data;
public int compareTo(MyItem item) {
if(id == item.id) return 0;
return id > item.id ? 1 : -1;
}
}
[tempsrc]$/usr/java/jdk1.6.0/bin/java MemoryTest
Total allocated memory before test: 61997056
Used memory: 1916456, real data memory: 1320000, allocated memory: 61997056
[tempsrc]$ /usr/java/jdk1.6.0_03/bin/java MemoryTest
Total allocated memory before test: 63832064
Used memory: 1514056, real data memory: 1320000, allocated memory: 63832064
Posted by 김형준
- Response
- No Trackback , No Comment
Trackback URL : http://www.jaso.co.kr/trackback/190






