참고 - https://www.youtube.com/watch?v=zta7kVTVkuk&list=PLlTylS8uB2fA5PevGI6ARN6v-VQWmqaix&index=15
자바 메모리 구조를 알려면 JVM부터 알아야 한다.
1.JVM이란?
Java Virtual Machine의 줄임말이다.
자바 어플리케이션을 어느 CPU에나 OS에서도 실행할 수 있게 지원하는 역할을 수행한다.
자바 코드를 컴파일하여 바이트 코드로 변환하여 해당 운영체제가 이해할 수 있는 기계어로 실행
자바 언어는 JVM에 의해 운영체제에 독립적이라는 장점을 가짐
2. JVM 구조
2.1 자바 어플리케이션 실행 과정
1) 어플리케이션이 실행되면 JVM이 OS로 부터 메모리를 할당받는다. -> 할당받은 메모리를 용도에 따라 구분하여 관리
2) 자바 소스코드(.java)를 CPU가 인식하지 못하므로 자바 컴파일러(java.exe)가 자바 소스코드를 읽어 바이트코드(.class)로 변환시켜준다.
※ 자바컴파일러는 JDK를 설치하면 bin에 존재하는 javac.exe이다. (JDK에 컴파일러가 포함되어 있음)
3. Class Loader를 통해 바이트 코드를 JVM으로 로딩 -> 객체들이 메모리에 올라오는 작업이라고 보면 됨
4. 로딩된 바이트 코드는 Execution Engine을 통해 해석됨
2.2JVM구성
JVM은 크게 4가지로 구성되어있다.
1. Class Loader
2. Execution Engine
3. Garbage Collector
4. Runtime Data Area
2.2.1 Class Loader
- JVM으로 바이트 코드(.class)를 로드하고, 링크를 통하여 메모리 영역인 Runtime Data Area에 배치하는 작업을 수 행하는 모듈
- 로드된 바이트 코드들을 엮어서 JVM의 메모리 영역인 Runtime Data Areas에 배치함
- 클래스를 메모리에 올리는 로딩 기능은 한번에 메모리에 올리지 않고, 어플리케이션에서 필요한 경우 동적으로 메모리에 적재하게 됨
- 런 타임시 동적으로 클래스를 로드하고 jar 파일 내 저장된 클래스들을 JVM 위에 탑재합니다.
- 클래스 파일의 로딩 3단계 : Loading -> Linking -> Initialization
2.2.2 Execution engine
Runtime Data Area에 할당된 바이트 코드를 실행시키는 주체이다.
즉, 링크된 클래스파일을 실행시키는 역할을 한다.
1) Interpreter
바이트 코드를 해석하여 실행하는 역할을 수행한다.
같은 메소드라도 여러번 호출될 때 매번 새로 수행되어야한다.
2) JIT(Just In Time) Compiler
인터프리터의 단점을 해소
반복되는 코드를 발견하여 전체 바이트 코드를 컴파일 하고 그것을 Native Code로 변경하여 사용한다.
※Navtive Code - 자바에서 부모가 되는 C/C++, 어셈블리언어 의미
3) Garbage Collector(GC)
-더 이상 사용되지 않는 인스턴스를 모아 제거하는 역할을 수행한다.
2.2.3 Runtime Data Area
어플리케이션이 동작하기 위해 OS에서 할당받은 메모리 공간을 의미
5가지로 구성되어있다.
1)Method Area
- Static으로 선언된 변수들을 포함하여 Class 레벨의 모든 데이터가 이곳에 저장된다.
- JVM마다 단 하나의 Method area가 존재한다.
- Runtime Constant Pool 이라는 별도의 영역이 존재하는데
-> 상수 자료형을 저장하고 참조하는 역할을 한다.
2)Heap Area
- 객체를 저장하기 위한 메모리 영역이다.
- new 연산자로 생성된 모든 객체와 인스턴스변수, 그리고 배열을 저장한다.
- Heap 영역은 두 영역으로 구분가능하다.(Young,Old)
- Young Generation: 생명주기가 짧은 객체를 GC대상으로 하는 영역
Eden 에 할당 후 S0 과 S1을 거쳐 오래 사용되는 객체를 Old로 이동시킨다. 오래사용되었다고 판단되는 객체들이 Old로 이동한다.
- Old Generation: 생명주기가 긴 객체를 GC 대상으로 하는 영역이다.
- GC 생명주기에 의해 지속적으로 메모리가 정리된다.
- Method Area와 Heap Area는 여러 스레드들 간에 공유되는 메모리이다.
-> JVM에 하나만 존재하기 때문에 멀티 스레딩이 가능하다.
3) Stack Area
- 각 스레드를 위한 분리된 Runtime Stack영역
- 메소드를 호출할 때마다 Stack Frame으로 불리는 Entry가 Stack Area에 생성
- 스레드의 역할이 종료되면 바로 소멸되는 특성의 데이터를 저장
- 각종 형태의 변수나 임시 데이터, 스레드 또는 메소드의 정보를 저장
4) PC Register(Program Counter)
- 각 Thread가 시작될 때 생성되며, 현재 실행중인 상태 정보를 저장하는 영역
- Thread가 로직을 처리하면서 지속적으로 갱신됨
- Thread가 생성될 때마다 하나씩 존재함
- 어떤 명령을 실행해야 할지에 대한 기록(현재 수행중인 부분의 주소)
5) Native Method Stack
- 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
- Java가 아닌 다른 언어로 작성된 코드를 위한 영역
- Java Native Interface를 통해 바이트 코드로 전환하여 저장
- 각 스레드별로 생성
※JNI란?
자바가 다른 언어로 만들어진 어플리케이션과 상호작용 할 수 있는 인터페이스를 제공하는 것
JVM이 Native Method를 적재하고 수행할 수 있도록 한다.
'자바' 카테고리의 다른 글
자바 - String 클래스 (0) | 2025.04.15 |
---|---|
[Java/자바] - ASCII(아스키코드) 문자 ↔ 숫자 (1) | 2025.02.24 |
[Java] - 예외처리(try catch 구문) (1) | 2025.01.31 |