자바를 이용하고 쓰고 있는데도, 아직 자바 가상머신에 대한 제대로된 이해가 없었다.
이번에 한 번 알아보려고 한다.
JVM - Java Virtual Machine
자바 가상 머신의 위키백과 정의를 먼저 보자.
자바 가상 머신(영어: Java Virtual Machine, JVM)은 자바 바이트코드를 실행할 수 있는 주체이다.
자바 바이트코드는 플랫폼에 독립적이며 모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다. 따라서 표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서는 이론적으로 모든 자바 프로그램은 CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.
자바 가상 머신은 CPU와 운영체제에 상관 없이 같게 동작하도록 하는 주체라고 한다.
자바 파일들은 자바 컴파일러를 통해 자바 클래스 확장자를 가진 바이트 코드로 변환된다.
이러한 바이트 코드는 JVM에서 실행 될 수 있는데, 이러한 JVM 머신들은 운영체제나 CPU 구조와 맞게 작동하도록 되어 있다.
결국은 같은 코드를 실행하는데에 있어, 동일성을 가지게 되는 것이다.
JVM 메모리
자바 메모리 영역은 크게 메소드 영역, 힙 영역, 호출 스택 등이 있다.
메소드 영역(Method Area) : JVM이 클래스를 로딩하고 최초의 메모리 영역에 올리게 되는데 이 곳이 메소드 영역(Method Area)이다. 이 곳에서는 static으로 선언 했던 변수들의 정보들도 저장된다.
힙(Heap) 영역 : new 키워드로 생성되는 객체들이 저장되는 공간이다. new 키워드는 힙 영역의 해당 인스턴스를 생성하고, 그 인스턴스에 대한 주소값을 대응되는 변수에 넣게 된다. 힙 영역에 객체가 너무 많은 경우, OutOfMemory 오류를 띄운다.
호출 스택(Call Stack) : 호출 스택은 함수 안에서 작업 하기 위한 메모리 영역에 쓰인다. 어떤 함수가 호출되면, 호출 스택에 함수에 필요한 지역 변수와 계산 과정에 필요한 메모리를 할당시킨다. 같은 함수를 실행 시키더라도 호출 스택은 공유하지 않으며, 가장 나중에 실행된 함수가 가장 먼저 나오는 선입후출(FILO - First In Last Out)의 구조를 가지고 있다.
재귀 함수에서 탈출 조건을 제대로 걸지 않는다면, StackOverFlowError가 날 수 있다.
이외에도 PC Register, Native Method Stack 영역이 있다.
PC Register : 현재 쓰레드가 실행되는 주소와 명령을 저장하고 있는 영역.
Native Method Stack : 자바가 아닌 언어로 쓰여진 네이티브 언어를 위한 영역.
Garbage Collector : 주로 Heap영역에서 작동하며, 더 이상 쓰이지 않는 객체나 스택을 제거한다.
'프로그래밍과 자료구조' 카테고리의 다른 글
[프로그래밍] JVM의 Garbage Collection (0) | 2020.10.23 |
---|---|
[프로그래밍] TDD - Test Driven Development (0) | 2020.09.18 |