Docs Java Spring
JVM(Java Virtual Machine) 이란?
JVM(Java Virtual Machine) 이란?
JVM이란 자바 바이트 코드를 실행시키기 위한 가상의 머신이다. 자바로 작성된 모든 프로그램은 자바 가상 머신에서만 실행될 수 있으므로, 자바 프로그램을 실행하기 위해서는 반드시 자바 가상 머신이 설치되어 있어야 한다.
JVM은 서로 다른 운영체제에서 아무런 추가 조치 없이 자바 프로그램이 실행되도록 한다. 따라서 개발자는 한 번만 프로그램을 작성하면, 모든 운영체제에서 같이 사용할 수 있는 장점이 있다.
- JVM은 운영체제에 종속적이므로 각 운영체제에 맞는 자바 가상 머신을 설치해야 한다.
JVM 역할
- Java bytecode 실행: 자바 컴파일러에 의해 변환된 byte code를 해석하고 실행하여 자바 프로그램이 여러 플랫폼에서 동작할 수 있도록 한다.
- 메모리 관리: Java 애플리케이션의 메모리를 관리한다. 이는 메모리를 용도에 따라 힙(Heap), 스택(Stack), 메소드 영역(Method Area)으로 구분하여 관리한다.
- 힙은 인스턴스 변수를 저장하는 데 사용되고, 스택은 메서드가 호출될 때 메소드의 스택 프레임이 저장되는 영역으로 메소드의 호출과 관계되는 지역 변수와 매개변수를 저장하는 데 사용
- 메서드 영역은 클래스 정보와 상수 풀 등을 저장하는 데 사용
- 클래스에 대한 정보와 함께 정적 변수(static variable)가 저장
- 가비지 컬렉터(garbage collector): 사용하지 않는 메모리를 자동으로 회수하여 개발자가 따로 메모리를 관리하지 않아도 되므로 애플리케이션의 신뢰성을 향상시킬 수 있다.
- JIT 컴파일러(Just-In-Time compiler): 자바 컴파일러가 생성한 byte code를 프로그램이 실행 중인 런타임에 바로 기계어로 변환하는 데 사용한다. 동적 번역(dynamic translation)이라고도 불리는 이 기법은 프로그램의 실행 속도를 향상시키기 위해 개발되었다. 동적 로딩: JVM의 런타임에 클래스를 로드하고 클래스의 메소드, 필드, 상속관계 등을 분석한다. 이 동적 로드를 담당하는 클래스 로더(class loader)는 클래스 참조시점에 클래스 파일을 로드하고 객체를 생성한다. 또한 런타임에 클래스 간 참조 관계를 해석하여 특정 클래스에서 사용될 메서드와 속성을 결정하는 데 사용됩니다.
GC
- Minor GC
- Young 영역에서 GC가 발생 시
- Major GC
- Old 영역이 가득차면 발생
- Full GC
- Old 영역에서 발생하는 GC
GC 삼색 마킹
삼색 마킹은 GC알고리즘의 일종으로 메모리에서 생존하고 회수해야 하는 객체 정보를 표시하는 데 사용된다. JVM은 메모리에 있는 객체를 흰색, 회색, 검정색으로 나눈다.
- 흰색(White): GC에 의해 스캔되지 않는 객체
- 검정색(Black): GC에 의해 스캔되었고 객체와 해당 객체를 참조하는 다른 객체가 모두 생존
- 회색(Grey): GC에 의해 스캔되었지만 객체가 참조된 다른 객체는 스캔되지 않았다는것을 의미
- STW(stop-the-world) GC사이클이 발생하여 가비지를 수집하는 동안 GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈춘다. 대개의 경우 GC 튜닝이란 STW 시간을 줄이는것이다.