JVM 메모리 구조
JVM 구조
Java 애플리케이션이 JVM 위에서 어떻게 동작하는지 알아보자.
첫번째 과정은 컴파일
Java 소스코드는 먼저 컴파일되어야 한다. 만약 기본적인 Java 애플리케이션을 구현했다면 코드를 실행하기 위해서 먼저 컴파일 과정을 거쳐야 한다.
$ javac application.java
컴파일이 완료되면 application.class 라는 파일이 생성된다.
.class 확장자를 가진 파일은 Byte Code 파일로 컴퓨터가 해석할 수 있는 기계어에서 조금 더 추상화된 언어 파일이라고 생각하면 된다. 바이트코드 위키
클래스 로더가 하는 일
컴파일이 완료된 .class 파일은 JVM 위에 존재하는 클래스 로더로 전달된다.
클래스 로더는 .class 파일을 해석하여 프로그램 내 선언된 자료구조들을 메모리에 저장하는 역할을 한다. 메모리에 저장한다는 것은 곧 일할 준비를 한다는 의미로 받아드리면 될 것 같다.
Execution Engine 은 실행을 담당
클래스 로더가 바이트 코드를 해석하여 메모리에 올리는 일을 했다면, Execution Engine 은 실행하는 역할을 수행한다.
클래스 로더에 저장된 바이트 코드를 명령어 단위로 분류하여 하나씩 실행한다.
Garbage Collector 는 청소 담당
모든 자료구조가 프로그램의 수행 동안 유지되어야 하는 것은 아니다. Garbage Collector 는 더 이상 사용하지 않는 자료구조들을 메모리에서 소멸시키는 역할을 수행한다.
Runtime Data Area (Memory Area) 는 저장 담당
JVM 이 프로그램을 수행하기 위해서 운영체제로부터 할당받은 메모리 공간이며, 클래스 로더가 읽어온 바이트 코드 내에 자료구조들이 저장된다. Runtime Data Area 내에는 다양한 영역들이 존재하고 각각의 성격이 다르다. 또 그에따라 중요한 이슈인 동시성 관리 기법이 달라지기 때문에 좀 더 자세히 살펴보자.
Runtime Data Area (Memory Area) 구조
1) Method Area
- JVM 이 실행되면서 생기는 공간이다.
- Class 정보, 전역 변수 정보, Static 변수 정보가 저장된다.
- Runtime Constant pool 에는 상수 정보가 저장된다.
- 모든 스레드에서 정보가 공유된다.
2) Heap
- 객체의 인스턴스 메모리, Array 와 같은 동적으로 생성된 데이터가 저장되는 공간
- Heap 에 저장된 데이터는 GC 가 처리하지 않는 한 소멸되지 않는다.
- Reference Type 의 데이터가 저장된다.
- 모든 스레드에서 정보가 공유된다.
3) Stack
- 지역 변수, 메소드의 매개변수와 같이 잠시 사용되고 필요 없어지는 데이터가 저장되는 공간
- Last In First Out, 나중에 들어온 데이터가 먼저 나간다.
- 만약 지역변수 이지만 Reference Type 일 경우에는 Heap 에 저장된 데이터의 주소값을 Stack 에 저장해서 사용하게 된다.
- 스레드에서 정보가 공유되지 않는다. 스레드 마다 하나씩 존재한다.
4) PC Register
- 스레드가 생성되면서 생기는 공간
- 스레드가 어느 명령어를 처리하고 있는지 그 주소를 등록한다.
- JVM 이 실행되고 있는 현재 위치를 저장하는 역할
5) Native Method Stack
- Java 가 아닌 다른 언어로 구성된 메소드를 실행할 필요가 있을 때 사용되는 공간