티스토리 뷰

Java Heap은 Instance또는 Java Object나 Array가 저장되는 공간으로 모든 Thread들에 의해 공유된다. 그렇기 때문에 동기화 문제도 발생할 수도 있는 공간이기도 하다. Heap도 JVM이 기동할 때 같이 생성된다.

JVM는 Heap에 메모리를 할당하는 instruction만 존재한다. Bytecode로는 new, newarray, anewarray, multianewarray만이 존재한다. 그리고 메모리 해제를 위한 명시적인 java code나 bytecode도 존재하지 않는다. 메모리의 해제는 오로지 Garbage Collection를 통해 수행된다.

Java Heap의 구현은 역시 Vendor의 재량이기 때문에  각 JVM Vendor마다 Heap의 구조 및 Garbage Collection, Garbage Collector의 구현이 다르게 된다.

Heap내에서 생성되는 Object도 JVM에 따라 다르게 구현되어 있다.

Hotspot JVM의 경우 Heap에 저장되는 Object와 Array는 모두 Header와 Data로 구성되어 있다.

그림에서 보듯 Object는 두개의 header를 Array는 3개의 header를 가지고 있다.

각 Header는 1Word의 크기를 가지고 있다.

첫번째 header는 Mark Word라고도 불리며 GC와 Synchronization작업을 위해 사용된다. 아래는 Mark Word의 Layout을 나타낸 것이다.

두번째 header는 Method Area의 Object Class로 향하는 Reference주소를 가지고 있게 된다. 세번재 header는 Array의 경우만 가지고 있는데 Array의 크기 정보를 저장하고 있다.



IBM JVM의 경우 1.4버전까지는 Object와 Array의 구분 없이 세 개의 header를 가진다.  레이아웃은 아래와 같다.


Java 5부터는 Layout이 달라진다. Object의 경우 2개의 Header를 Array의 경우 3개의 Header를 가지는 방식으로 변경되었다. Header의 정보도 크게 달라졌는데 첫번째 Header에 정보를 모두 가지고 있는 것이 아니라 정보는 VTable이라는 구조체에 저장하고 Header에서는 이 VTable의 Reference만을 가지고 있게 되었다.


저작자 표시 비영리 변경 금지
신고

'기술이야기' 카테고리의 다른 글

Memory Leak 개요  (0) 2009.10.28
Runtime Data Areas - Heap과 Object Layout  (0) 2009.10.28
Runtime Data Areas - Native Method Stacks  (1) 2009.10.28
Runtime Data Areas - Method Table  (2) 2009.10.28
댓글
댓글쓰기 폼