1. JVM 이란?
JVM은 JAVA Virtual Machine, 자바 가상 머신의 약자이며, JAVA는 하드웨어가 아닌 JVM을 통해 동작하며, JVM은 OS와 JAVA 애플리케이션 사이의 중개자 역할을 한다. JVM은 자바 바이트코드를 실행할 수 있는 환경을 제공해준다. 이를 통해 JAVA는 애플리케이션은 OS에 관계없이, 플랫폼에 독립적으로 실행할 수 있게 된다. 또한 JVM은 메모리를 관리하고 Garbage Collection실행을 통해 메모리를 최적화한다.
2. JVM 구조
2 - 1. 자바 메모리 구조 (Runtime Data Area)
JAVA 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간으로, 힙(Heap)과 메서드(Method)는 전체 공유자원으로 분류되고 스택(Stack), PC, 네이티브 메서드 스택(Native Method Stack)은 스레드 단위의 자원으로 분류된다.
- PC (PC Register) : 스레드(Thread)가 시작될 때 생성되고 생성되는 공간으로, 스레드 마다 하나씩 존재하며, 스레드가 어떤 부분을 어떤 명령으로 실행 해야할 지에 대한 기록하는 부분이다.
- 스택 (Stack) : 프로그램 실행 시, 임시로 할당되어 있다가 메서드를 빠져나가면 즉, 할 일을 끝냈을 때, 소멸되는 특성의 데이터 주로 저장하는 영역으로 에러가 발생했을 때, 에러 메세지를 보면 런타임 스택에 메시지가 쌓여있는 것을 볼 수 있다.
- 네이티브 메소드 스택 (Native Method Stack) : 자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 기계어로 작성된 프로그램을 실행시키는 별도의 스택영역으로 Java Native Interface를 통해 바이트 코드로 전환하여 저장한다.
- 메소드 영역(Method Area) : 프로그램 시작 전에 클래스 수준의 정보 즉, 클래스 이름, 부모 클래스 이름, 메서드, 스택 변수, 일반 변수 등을 저장하여 프로그램이 종료할 때까지 해당 데이터를 가지고 가는 영역이다. 자바는 Main 메서드의 호출에서부터 계속된 메서드의 호츨로 흐름을 이어가기 때문에, 메서드의 바이트 코드는 프로그램의 흐름을 구성하는 바이트 코드로 볼 수 있다.
- 힙 (Heap) : 객체를 저장하는 가상 메모리 공간으로 프로그램 시작 후 데이터가 들어오고 나가는 구역이다.
2 - 2. 클래스 로더(Class Loader)
JVM내로 클래스 파일(.class)를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다.
Runtime 시점에 클래스를 로딩하게 해주며, 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리에 로드하게 된다.
- 로딩 (Loding) : .class를 읽어옴
- 링크 (Linking) : 코드 내부의 레퍼런스를 연결함
- 초기화(Initialization) : 클래스에 있는 static값들을 초기화함
2 - 3. 실행 엔진(Execution Engine)
로드된 클래스의 바이트코드를 실행하는 런타임 모듈이다.
클래스 로더를 통해 JVM내의 Runtime Data Areas에 배치된 바이트코드는 실행 엔진에 의해 실행되며, 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행하는데, 이 때 인터프리터 (Interpreter) 방식과 JIT Compiler (Just Time Compiler) 방식이 있다.
- 인터프리터 (Interpreter) : 원시 코드를 기계어로 번역하는 컴파일러와 달리 JAVA는 인터프리터 방식을 이용하여 자바 바이트 코드를 명령어 단위로 읽어서 실행한다. 하지만 코드를 한 줄씩 실행하기 때문에 속도가 느리다는 단점이 있다.
- JIT Compiler (Just Time Compiler) : 바이트 코드를 컴파일하여 네이티브 코드(native code)를 변환하여 사용함으로써 인터프리터의 단점을 보완한 방식이다. 즉, 한 번 컴파일된 코드는 빠르게 수행하게 되어 속도가 빠르다.
한 번만 수행할 코드라면 컴파일을 하지 않고 인터프리팅 하는 것이 유리하다. 따라서 JVM은 인터프리터 방식을 사용하다가 일정 기준이 넘어가면 JIT 컴파일러를 사용하는 혼합 방식을 사용한다.
2 - 4. 가비지 컬렉터 (Garbage Collector)
유효하지 않는 메모리인 가비지(Garbage)를 정리해 주는 역할을 한다.
'Java' 카테고리의 다른 글
[Java] 문자열 연결 방식 비교: String vs StringBuilder vs StringBuffer (4) | 2024.02.05 |
---|---|
[Java] 예외 처리 printStackTrace()의 취약점과 대안 (2) | 2024.02.01 |
[Java] 문자열 연결에 대한 StringBuilder와 StringBuffer 비교 (2) | 2024.01.31 |
[JAVA] 자바(JAVA)란? (12) | 2023.01.22 |