Memory usage of Java objectsby Pigbrain
- 일반적으로 오브젝트들은 힙 메모리에 관리된다
- JVM은 작은Thread-Local 오브젝트들은 힙이 아닌 스택 혹은 레지스터에 관리한다
- 오브젝트 정보(housekeeping)가 관리되는 헤더는 소수의 바이트로 구성된다
- primitive 타입의 필드들은 아래에 명시된 크기로 할당된다
- reference 타입의 필드들은 다음과 같이 할당된다
- 4바이트 in 32bit
- 8바이트 in 64bit
- padding
- 오브젝트의 데이터들 뒤에 붙는 사용되지 않는 바이트들이다
- 오브젝트의 메모리주소를 특정 바이트의 배수로 시작하게하고 오브젝트의 포인터들을 표현하기 위해 필요한 부가적인 비트들을 필요 없도록 해준다
Sizes of primitive types
- 오브젝트들은 실제 자신이 가진 필드들만큼의 메모리 공간을 갖지 않는다
- 필드들이 차지하는 메모리외에 오브젝트의 클래스 정보, ID, 오브젝트에 접근 할 수 있는지에 대한 플래그 등등을 보관하는 정보를 추가적으로 필요로 한다
- 일반적인 오브젝트들은 8bytes의 헤더 공간(housekeeping)을 갖는다
- 배열은 12bytes의 헤더 공간(housekeeping)을 갖는다
- 일반 오브젝트에 비해 배열의 길이를 표현하기 위한 4bytes의 추가 공간을 갖는 것이다
Object size granularity
- 모든 오브젝트는 8바이트 단위로 할당된다
- 오브젝트의 헤더와 필드들의 메모리 공간이 8의 배수가 되지 않는다면 padding을 더하여 8의 배수로 맞춘다
- Example
- 아무런 필드가 없는 오브젝트는 8바이트다
- 하나의 boolean 변수를 갖는 오브젝트는 16바이트다
- 헤더(8바이트) + boolean(1바이트) + padding(7바이트)
- 8개의 boolean 변수를 갖는 오브젝트는 16바이트다
- 헤더(8바이트) + boolean*8(8바이트)
- 2개의 long 변수, 3개의 int 변수, 1개의 boolean 변수를 갖는 오브젝트는 40바이트다
- 헤더(8바이트) + long2(16바이트) + int3(12바이트) + boolean(1바이트) + padding(3바이트)
원문
- http://www.javamex.com/tutorials/memory/object_memory_usage.shtml
Published 06 May 2016