java 메모리 구조의 관해서 공부하던 중 상시로 읽어보기 위해서 기재하였습니다.
JVM 의 전체적인 구조
클래스 로더(Class Loader):
자바 프로그램은 클래스로 구성되어 있으며, 클래스 로더는 이러한 클래스 파일들을 JVM으로 로드합니다.
클래스 로더는 클래스 파일을 찾고 로드하며, 필요한 경우 클래스를 동적으로 로드하여 실행 환경을 구성합니다.메모리 영역(Memory Areas):
JVM은 다양한 메모리 영역을 관리합니다.- 메서드 영역(Method Area): 클래스 정보, 정적 변수, 상수 등이 저장되는 영역입니다.
- 힙(Heap): 인스턴스 객체와 배열이 할당되는 영역으로 동적으로 생성되며, 가비지 컬렉션에 의해 관리됩니다.
- 스택(Stack): 메서드 호출과 관련된 지역 변수와 메서드 호출 정보를 저장합니다. 각 스레드마다 별도의 스택이 할당됩니다.
- 레지스터(Program Counter Register): 각 스레드의 현재 실행 위치를 저장합니다.
- 네이티브 메서드 스택(Native Method Stack): 네이티브 메서드(다른 언어로 작성된 메서드)의 정보를 저장합니다.
실행 엔진(Execution Engine):
실행 엔진은 바이트 코드를 읽어 기계어로 변환하고 실행합니다. 주요한 두 가지 구성 요소로 나뉩니다.- 인터프리터(Interpreter): 바이트 코드를 한 줄씩 읽어 해석하고 실행합니다. 실행 속도는 느리지만 초기 실행에 유리합니다.
- JIT 컴파일러(Just-In-Time Compiler): 인터프리터의 속도 문제를 개선하기 위해 인터프리터가 반복적으로 실행되는 코드를 모아 기계어로 변환하여 캐시에 저장하고, 이후에는 해당 기계어 코드를 실행합니다. 이로써 실행 속도가 향상됩니다.
가비지 컬렉터(Garbage Collector):
자바는 메모리 관리를 위해 가비지 컬렉터를 제공합니다. 가비지 컬렉터는 더 이상 참조되지 않는 객체를 식별하고 메모리를 해제하여 프로그램의 메모리 누수를 방지합니다.네이티브 인터페이스(Native Interface):
자바는 C, C++ 등 다른 언어로 작성된 코드를 호출할 수 있도록 네이티브 인터페이스를 제공합니다. 이를 통해 자바는 플랫폼 별로 다른 기능을 사용할 수 있습니다.네이티브 메서드 라이브러리(Native Method Libraries):
JVM은 자바 라이브러리 외에도 네이티브 메서드 라이브러리를 통해 시스템 라이브러리를 활용할 수 있습니다.실행 타임 데이터 영역(Runtime Data Area):
실행 중에 생성되는 데이터를 저장하는 영역으로, 클래스 인스턴스의 상태와 실행 중인 스레드에 대한 정보를 포함합니다.스레드(Thread):
JVM은 여러 개의 스레드를 지원하여 동시에 여러 작업을 수행할 수 있습니다. 각 스레드는 별도의 프로그램 카운터, 스택, 레지스터 등을 가지고 실행됩니다.
Memory Area
- Method Area
- JVM이 실행되면서 생기는 공간이다.
- Class 정보, 전역변수 정보, Static 변수 정보가 저장되는 공간이다.
- Runtime Constant Pool 에는 말 그대로 '상수' 정보가 저장되는 공간이다.
- 모든 스레드에서 정보가 공유된다.
- Heap
- new 연산자로 생성된 객체, Array와 같은 동적으로 생성된 데이터가 저장되는 공간
- Heap에 저장된 데이터는 Garbage Collector 가 처리하지 않는한 소멸되지 않는다.
- Reference Type 의 데이터가 저장되는 공간
- 모든 스레드에서 정보가 공유된다.
- Stack
- 지역변수, 메소드의 매개변수와 같이 잠시 사용되고 필요가 없어지는 데이터가 저장되는 공간
- Last In First Out, 나중에 들어온 데이터가 먼저 나간다
- 만약, 지역변수 이지만 Reference Type일 경우에는 Heap 에 저장된 데이터의 주소값을 Stack 에 저장해서 사용하게 된다.
- 스레드마다 하나씩 존재한다.
- PC Register
- 스레드가 생성되면서 생기는 공간
- 스레드가 어느 명령어를 처리하고 있는지 그 주소를 등록한다.
- JVM이 실행하고 있는 현재 위치를 저장하는 역할
- Native Method Stack
- Java 가 아닌 다른 언어 (C, C++) 로 구성된 메소드를 실행이 필요할 때 사용되는 공간
'java' 카테고리의 다른 글
Java8 (0) | 2023.12.07 |
---|---|
Java8 VS Java11 (0) | 2023.12.07 |
함수형 인터페이스 (0) | 2023.04.06 |
Java Stream (0) | 2023.03.28 |
블로킹(Blocking)? 논블로킹(Non-Blocking)? (1) | 2023.03.07 |