JVM이란
JVM은 Java Virtual Machine의 약자로, 자바 가상머신이라고 부릅니다.
자바가 지금처럼 대중화 될수 있도록 한 원인 중 하나가 JVM이며, 자바와 운영체제 사이에서 중개자 역할을 수행합니다.
이 JVM은 C언어나 C++과 같은 레지스터 기반으로 작동하지 않으며, 스택 기반으로 작동합니다.
JVM의 가장 큰 특징인 운영체제에 종속적이지 않은 특징은, 다음과 같은 형식으로 프로그램을 실행할 경우 잘 나타납니다.

1. 자바 컴파일러에 의해 자바 소스 파일을 바이트 코드 파일로 변환한다.
2. 변환된 바이트 코드 파일을 JVM이 읽어 각 운영체제에 맞는 실행 파일로 변환한다.
3. 변환된 실행파일을 운영체제가 읽어 이를 실행한다.
따라서 만약 리눅스위에서 Java파일을 만들고 이를 다른 운영체제에서 실행시키고 싶다면, 다른 운영체제에 맞는 JVM을 설치 한후 Java파일을 실행하면 된다.
JVM 메모리 구조

순서를 설명하면,
1. JAVA scource 파일을 JAVA컴파일러가 읽어 들여, bytecode 파일은 class 파일로 변환합니다.
이를 Class Loader가 읽어들입니다.
class Loader
JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈입니다. 런타임 시에 동적으로 클래스를 로드합니다.
2. 클래스 로더에 의해서 bytecode로 변환된 Java source파일들은 Runtime Data Area에 배치됩니다.
Execution Engine
Runtime Data Area에 배치된 bytecode들을 읽어들이고 실행합니다.
최초 JVM이 나왔을 당시에는 인터프리터 방식이었기때문에 속도가 느리다는 단점이 있었지만 JIT 컴파일러 방식을 통해 이 점을 보완하였습니다. JIT는 바이트 코드를 어셈블러 같은 네이티브 코드로 바꿈으로써 실행이 빠르지만 역시 변환하는데 비용이 발생하였습니다. 이 같은 이유로 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행합니다.
Garbage Collector
가비지 컬렉터는 일정시간 마다 힙영역에 생성된 객체들중 참조하지 않는 객체들을 탐색 한 후 삭제하는 역할을 수행합니다. 또한 자주 참조되는 객체들은 Java8이전의 버전의 경우, Permanent memory영역에 객체에 대한 값을 할당하였습니다.
Runtime Data Area
Runtime Data Area는 JVM의 메모리 영역으로써, 자바 애플리케이션을 실행할때 사용되는 데이터들을 적재하는 영역입니다.

Method Area
모든 쓰레드가 공유하는 메모리 영역입니다. 메소드 영역은 클래스, 인터페이스, 메소드, static변수 등의 바이트 코드를 보관합니다. Java8이전에서는 이 영역은 Permanent 영역이라 칭하였습니다.
Heap Area
모든 쓰레드가 공율하며, new 키워드로 생성된 객체와 배열이 생성되는 영역입니다. 또한, 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역입니다.
Stack Area
메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성합니다. 그리고 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장합니다. 마지막으로, 메서드 수행이 끝나면 프레임별로 삭제합니다.
PC Register
쓰레드가 시작될 때 생성되며, 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재합니다. 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖습니다.
Native Method Stack
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역입니다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
제네릭(Generic) (0) | 2022.06.08 |
---|---|
Java Tomcat OutOfMemoryError : PermGen space (0) | 2022.05.02 |
싱클톤 패턴(Singleton Pattern) (0) | 2022.03.17 |
static 변수와 함수 (0) | 2022.03.17 |
Char를 Int로 변환하기 (0) | 2022.02.19 |