■ 정의 : Runtime Data Areas는 Process로서의 JVM이 프로그램을 수행하기 위해 OS로 부터 할당받는 메모리 영역
Runtime Data Areas의 5개의 영역
PC Registers
Method Area
Heap
Native Method Stacks
Java Virtual Machine Stack
※ Method Area
Method Area는 모든 Thread들이 공유하는 메모리 영역이다. 이 영역은 Load된 Class나 Interface를 저장하는 논리적인 공간이다.
저장되는 정보는 클래스나 인터페이스의 바이트코드 뿐만 아니라, 모든 변수, 상수, referenc, Method Data 등이 포함된다. 또한 클래스나 인스턴스, 인터페이스의 초기화때 사용되는 Class Variable과 Method와 생성자의 정보도 포함된다. 이 정보들은 ClassLoader에게 넘겨받은 Class File에서 Type관련 정보를 추출하여 저장하게 된다.
Method Area는 JVM이 기동할 때 생성이 되며 Garbage Collection의 대상이 된다. 이 Method Area 역시 벤더마다 다르게 구현되어 있으며, Hotspot JVM의 경우는 Permanent Area라는 명칭으로 특정 메모리 영역으로 구분되어 있다.
Type == class, interface
- Method Area의 Type정보는
Type Information, Constant Pool, Field Information, Method Information, Class Variables, Reference to class ClassLoader, Reference to class Class
의 7가지 정보로 구성됨
Type Information : 가장 기본이 되는 정보로 Type에 대한 전반적인 내용이 포함된다.
- Package.class의 형태를 지니는 Type의 전체이름(Full Qualified Name)
- Type의 직계 super class의 전체 이름, Type이 Interface이거나, java.lang.object class이거나 super class가 없는 경우는 제외됨
- Type이 Class 인지 Interface인지의 여부
- public, abstrace, final 등 type의 Modifier
- Interface의 경우 직접 Link 되고 있는 객체의 리스트로 객체는 전체 이름으로 표현됨
Constant Pool : Class나 Interface의 모든 Constant 정보를 가지고 있는 부분이며, Constant라 함은 Literal Constant는 물론이고, Type, Field(Member Variable, Class Variable), Method로의 모든 Symbolic Reference까지 확장한 개념으로 받아들여야 한다.
Symbolic Reference가 저장되는 공간이 Constant Pool이다.
Class Variable : 클래스 멤버는 static으로 선언된 변수이며, Class에서는 하나의 값으로 유지가 된다. 이 변수는 모든 Instance에 공유되기 때문에 이를 이용하는데 있어 동기화 이슈가 발생한다. 이 변수는 Class와 관련이 있기 때문에 Instance가 없어도 접근이 가능하다. Class Data의 논리적 부분으로 기능을 하는 Class Variable은 Class를 사용하기 전부터 Method Area에 미리 메모리를 할당 받는다.
Class Variable을 final로 선언할 경우 상수로 취급하기 때문에 Constant Pool에 Literal Constant로 저장된다.
Field Information
Field의 이름
Field의 데이터 타입, 선언된 순서
public, private, protected, static, final, volatile, transient와 같은 Field의 Modifier
Method Information
Type(Class, Interface)에서 선언된 모든 Method의 정보를 의미한다.
Method의 이름
Method의 반환값의 Data Type 또는 void
Method Parameter의 수와 Data Tpye, 선언된 순서
Method Modifier
만약 Method가 native나 abstract 가 아니라면 다음의 정보가 추가된다.
Method의 Bytecode
Method Stack Frame의 Operand Stack 및 Local Variable Section의 크기
Exception Table
Reference to class ClassLoader
Type이 JVM에 Load 될 때 항상 이 Type은 어떤 ClassLoader를 경유하여 Loading 되었는지를 추적하게 된다. Type이 다른 Type을 참조할 경우 ClassLoader를 사용하도록 되어 있기 때문이다.
Reference to class Class
Type이 JVM에 Load되면 항상 java.lang.class class 의 Instance가 하나 생성된다. 그래서 Method Area에는 Type 정보의 일부로 이 Instance의 Reference를 저장하고 있다. getName()을 통해 Class의 이름을 알아오거나 isIntetface()를 통해 interface인지의 여부등을 알수 있는것도 class Instance의 Reference를 통하기 때문임
※ Method Table
Method Area에서 원하는 정보를 찾는 속도는 성능의 중요한 이슈가 될 수도 있다. 이를 위해 JVM을 설계할 때 Method Table이라는 데이터 구조를 사용하기도 한다. Method Table이 Class의 하위 자료이기 때문에 Class가 Loading 될 때 함께 생성된다.
■ Heap
Java Heap은 Instance( 또는 Object ) 와 Array 객체 두 가지 종류만 저장되는 공간이다.
모든 Thread들에 의해 공유되며, 같은 Application을 사용하는 Thread 사이에서는 공유된 Heap Data를 이용할 때 동기화 이슈가 발생할 수 있다.
JVM은 Java Heap에 Memory를 할당하는 Instruction(Bytecode로 new, newarray, anewarray, multianewarray) 만 존재하고 메모리 해제를 위한 어떤 Java Code나 Byte Code도 존재하지 않는다. Heap의 메모리 해제는 오로지 Garbage Collection 을 통해서만 수행된다.
첫번째 헤더는 Mark Word라고 불리며 Garbage Collector와 Synchronization 작업을 위해 사용한다. 위와 같은 레이아웃을 가지고 있다.
Mark Word는 Hash Code 또는 Thread ID, Age, Biased Bit, Tag Flag로 구성되어 있다.
하위 3bits는 Biased Lock의 사용여부와 Tag Flag를 나타낸다. Biased Bit가 1이면 Biased Lock을 사용한다는 것으로 Synchronization 작업을 수행할 때 Lock을 획득하기 위한 연산을 수행핮 않고 가볍게 Lock을 획득함을 의미한다. Biased Lock을 사용하게 되면 Biased Lock Mode로 Synchronization을 수행하는지에 대한 상태값만이 존재한다. 그 밖에 Biased Lock을 사용하지 않으면 Biased Bit는 0이 되고 Tag 별로 4가지 상태를 나타낸다.
Hashcode 또는 Thread ID는 23Bits 를 할당받고 있으며 Biased Bit와 Tag에 따라 값이 결정된다. Based Bit가 1이면 Biased Lock을 획득한 Thread의 ID가 기록된다.
Biased Bit가 0이고, 이전 Synchronization 작업 때 산출된 Hash Code가 있다면 Tag에 따라 각각 다른 값이 저장된다.
Light-Weight Locked 상태에서는 Lock Record Address, Heavy-Weight Locked 상태에서는 Monitor Address 등의 Lock과 관련한 Pointer 정보, 그리고 Marked fo GC에서는 Forwarding Address의 정보를 Hash Code로 가지고 있게 된다. Age 정보는 6Bits로 Young Generation의 Object가 Eden과 Survivor를 넘나든 횟수를 기록한다.
두번째 Header에는 Method Area의 Class 정보를 가리키는 Reference 정보가 저장된다. 이 두개의 Header는 Object와 Array 모두 동일하다. 그러나 Array의 경우는 Array Size를 위한 Header가 하나더 추가된다.
Data 영역에는 Object나 Array에 따라 적절한 구조와 크기를 가진다
댓글 없음:
댓글 쓰기