자바 메모리 구조


1. Method Area (= Static Area = Class Area = Code Area)
Java Compiler가 일차적으로 컴파일한 바이트코드(.class)을 Class Loader를 통해 읽어 저장하는 영역. 클래스/인터페이스에 대한 상수 풀, 멤버변수, static 변수, 생성자와 메소드를 저장하는 영역

* Class Loader : Runtime 시 바이트코드를 로딩한다.
* Excution Engine : Runtime Data Area에 배치된 바이트 코드를 명령어 단위로 실행한다.
* Garbage Collector : heap을 사용 가능한 만큼 자유롭게 사용하고, 더 이상 사용되지 않는 object들은 GC 프로세스가 메모리에서 제거한다. Heap영역의 object 중 stack에서 도달불가능한(unreachable) object는 garbage collection의 대상이 된다.
* Runtime Data Area : JVM이 OS에서 할당받은 메모리 영역이다.

2. Stack Area
기본 타입(primitive type) 변수가 저장되는 영역. Heap Area에 생성된 객체의 주소가 참조 타입 변수에 할당된다. 각 Thread는 자신만의 Stack Area를 가진다. CPU에서 LIFO(Last In, First Out) 형식으로 관리된다. 함수가 종료되면 모든 변수가 스택에서 팝아웃된다.


3. Heap Area
JVM이 관리하는 프로그램에서 데이터를 저장하기 위하여 동적으로 할당하여 사용하는 메모리 영역이다. 모든 Object 타입은 Heap Area에 저장되며, 하나의 Heap Area만 존재한다. Garbage Collector를 통해 메모리가 반환된다.

1) Permanent : 생성된 객체들의 주소 값이 저장된 공간
2) New Area
- Eden : 객체들이 최초로 생성되는 공간
- Survivor : Eden에서 참조되는 객체들이 저장되는 공간
3) Old Area : New Area에서 일정시간이상 참조되고 있는 객체들이 저장되는 공간


4. PC register
Thread가 생성될 때마다 생성되는 영역으로 Program Counter, 즉 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.


5. Native Method Stack Area
자바 외에 언어로 작성된 Native Code가 저장되는 영역. JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 공간이다.

댓글

이 블로그의 인기 게시물

아스키 코드(ASCII)와 유니코드(unicode)

네트워크의 기본 #2 - TCP/IP 4계층

디자인 패턴 #5 - 컴포지트 패턴 (composite pattern)