JVM이 무엇인지 글로 정리한 적이 없어
JVM이 무엇인지와 JVM이 메모리 영역을 어떻게 구분하는지에 작성하고자 한다.
JVM(Java Virtual Machine)
- 자바 가상 기계라고도 불리며, 자바의 바이트 코드를 읽고 해석한 뒤, 실행한다.
- 서로 다른 플랫폼 즉, 운영체제(Window, Linux)에서도 동일하게 실행할 수 있게 해준다.
- JVM 자체는 플랫폼(자바개발사인 오라클, 마이크로소프트 등)마다 다르게 작성되어 배포되며 플랫폼 종속적이다.
- 자바 프로그램은 어떤 회사의 JVM인지 여부와 관계없이 정상적으로 실행된다.
* Java는 플랫폼에 종속적이지 않지만 JVM은 플랫폼에 종속적이다.
JVM(Java Virtual Machine) 실행과정
- JVM이 구동되면 JVM은 운영체제로 부터 메모리를 할당 받는다.
- 자바 소스코드(.Java)를 컴파일하면(javac 명령어) 확장명이 .class인 바이트 코드로 파일로 변환된다.
- .class 파일을 JVM의 클래스 로더에게 보낸다.
- 클래스 로더는 JVM 런타임 데이터 영역(Runtime Data Area)에 로딩한다.
- 메모리에 로딩된 .class 파일을 Execute Engine에서 기계어로 번역하고 실행한다.
JVM의 구성은 크게 Class Loader, Execute Engine, Garbage Collector, Runtime Data Area가 있으며
아래와 같이 그려볼 수 있다.
Class Loader
- .class 파일을 런타임 데이터 영역(Runtime Data Area)에 로딩한다.(=메모리에 올린다.)
Execute Engine
- .class 파일을 JVM에서 실행할 수 있도록 기계어로 번역하고 실행한다.
Garbage Collector
- 힙 영역에서 더 이상 사용하지 않는 메모리를 제거한다
- 보통 자동적으로 실행된다.
Runtime Data Area(JVM 메모리 영역)
- JVM 메모리 영역은 5가지로 구성되어 있다.
- JVM은 할당 받은 메모리 영역을 메소드 영역, 힙 영역, 스택 영역으로 구분해서 사용한다.
1. 메소드 영역(Method Area) - 공유자원
- 바이트 코드 파일을 읽은 내용을 저장하며, 클래스별로 상수, 메소드, 생성자, static 변수, interface등이 저장된다.
- static 영역으로 여기 있는 데이터는 프로그램이 종료될 때까지 존재한다.
- static 데이터를 많이 사용한다면 메모리 부족이 생길 수 있다.
2. 힙 영역(Heap Area) - 공유자원
- 객체와 배열이 생성되는 영역이다. 객체의 메모리 번지는 메소드나 스택에 있는 상수와 변수에서 참조할 수 있다.
- 호출이 끝나도 삭제되지 않는다. 아무도 참조하지 않는 객체가 생기면 가비 컬렉터에 의해 제거된다.
- 런 타임시 할당된다. (런 타임: 컴파일 이후 프로그램이 실행될 때)
3. 스택영역(Stack Area) - 공유자원x(스레드 별로 생성)
- 메소드를 호출할 때마다 생성되는 프레임이 저장되는 영역으로 호출이 종료되면 프레임도 제거된다. 지역변수, 파라미터, 리턴 값등이 이에 해당한다. (메소드내에서만 사용하고 메소드가 종료되면 지역변수는 사용되지 않는다는 것을 생각하면 쉽게 이해할 수 있다.)
- 기본타입변수와 참조타입변수가 생성되고 제거되는 곳이다.
- LIFO(Last-In-First-Out)의 특성을 가져 나중에 들어온 데이터부터 제거된다.
- 쓰레드별로 1개씩 생성된다.
- 컴파일 타임시 할당된다. (.class파일(소스코드)가 기계어로 변환되는 과정)
4. PC 레지스터(PC Register) - 공유자원x
- 스레드가 생성될 때마다 생성된다.
- 현재 스레드가 부분을 무슨 명령으로 실행할 지 기록하는 부분으로 현재 실행 중인 JVM 명령 주소를 저장한다.
5. 네이티브 메서드 스택 (Native Method Stack) - 공유자원x
- 자바이외의 언어로 작성된 네이티브 코드를 실행 시, 사용되는 메모리 영역이다.
- Java Native Interface를 통해 호출되는 C/C++등의 코드를 수행하기 위한 스택이다.
-> 멀티 스레드 시 공유되는 메모리 영역은 메소드 영역과 힙 영역이다. 나머지는 스레드마다 생성되며 공유되지 않는다.
'JAVA' 카테고리의 다른 글
[JAVA(자바)] 문자열 자르기, 분리, 찾기, 추출 (substring, Split, indexOf, charAt) (0) | 2023.01.04 |
---|---|
[JAVA(자바)] 문자열(String) 타입이란? (feat. 비교, 길이) (0) | 2023.01.04 |
[JAVA(자바)] 참조 타입(reference type) null과 NullPointerException (0) | 2023.01.03 |
[JAVA(자바)] 기본타입과 참조타입 그리고 ==, != 연산 (0) | 2023.01.03 |
[JAVA(자바)] int, Integer차이와 Integer 비교시 == 아닌 equals() 사용하는 이유 (0) | 2022.12.31 |
댓글