-
JVM 메모리 구조Java, Kotlin, Spring 2022. 5. 20. 09:47
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 가 아닌 다른 언어로 구성된 메소드를 실행할 필요가 있을 때 사용되는 공간
반응형'Java, Kotlin, Spring' 카테고리의 다른 글
Spring Bean 스코프 (0) 2022.06.19 Java 8 주요 업그레이드 사항 (0) 2022.05.25 @SpringBootApplication 어노테이션 (0) 2022.05.20 Java Compile 과정 (0) 2022.05.07 Testcontainers 재사용 설정하기 (0) 2022.01.12