종종 자바 오브젝트가 딱 데이터만큼 메모리를 소비한다고 생각하는 개발자들이 있어서 공유한다. 메타데이터 데이터가 자바 오브젝트에 있다. 사실 String 이나 Java collection 코드를 보면 생각보다 데이터를 많이 갖고 있음을 알면 좋다. 




자바 오브젝트는 접근하기에 충분히 빠르지만 원시 필드의 실제(원시) 데이터보다 2~5배 더 많은 공간을 차지한다. 



예를 들어 각 개별 자바 오브젝트에는 오브젝트 헤더를 갖고 있는데 16바이트를 포함한다. 



또한 자바 문자열의 경우 원시 문자열 대비 추가로 거의 40바이트가 추가된다. 




또한 Set, List, Queue, ArrayList, Vector, LinkedList, PriorityQueue, HashSet, LinkedHashSet, TreeSet 등과 같은 자바 컬렉션 클래스도 사용된다. 



반면에 연결 데이터 구조(예, LinkedList)는 너무 복잡해서 데이터 구조의 각 항목에 대한 래퍼(wrapper) 오브젝트가 있기 때문에 너무 많은 공간을 차지한다. 



한편 원시 타입의 컬렉션은 java.lang.Double과 java.lang.Integer와 같은 박스형 오브젝트이기 때문에 메모리에 저장한다.



Posted by 김용환 '김용환'