JVM이란?
자바 가상머신(Java Virtual Machine)이라고 부르고 우리가 작성한 자바프로그램이 수행되는 프로세스를 의미한다.
자바는 플랫폼(OS)에 종속되지 않지만 JVM은 플랫폼에 종속이 된다.
예를 들어 JVM은 윈도우용 JVM과 리눅스용 JVM이 있기 때문에 플랫폼에 종속이 된다.
위처럼 자바 프로그램 실행 과정에서 컴파일된 바이트코드가 JVM으로 넘어왔을 때 컴퓨터가 프로그램을 실행할 때마다 JVM의 구성 요소중 하나인 인터프리터에 의해 계속해서 기계어로 해석해주면서 프로그램이 실행되게 된다.
자바 사용자가 코드를 작성하여 실행하면 자바 컴파일러(javac)에 의해서 1차적으로 컴파일이 되는데 이때 javac에 의해서
사용자가 작성한 코드가 바이트코드가 되는데
바이트코드란?
어떠한 프로그램이 어떤 OS에도 적용될 수 있도록 해주는 코드이다.
쉽게 말해서 자바 소스 코드를 자바 가상 머신(JVM)이 이해할 수 있는 코드를 의미한다.
그렇다면 변환된 바이트코드를 컴퓨터가 인식을 할 수 있을까? 그렇지 않다.
그래서 이때 사용되는 컴파일러가 바로 JIT컴파일러이다.
JIT컴파일러란?
JIT컴파일러는 런타임시에 바이트코드를 컴퓨터가 알아들을 수 있는 기계어로 변환작업을 해주는 컴파일러이다.
컴퓨터 프로그램실행방식에는 두가지가 존재한다.
인터프리트 방식
인터프리트 방식은 프로그램이 실행될 때마다 변환작업을 해주는 방식인데 이는 성능을 저하시킨다는 단점이 있다.
정적 컴파일 방식
정적 컴파일 방식은 프로그램이 실행되기 전, 한번만 변환작업을 해주는 방식이다.
JIT컴파일러는 위 두가지 방식의 성격을 지닌 컴파일러이다.
JIT컴파일러의 변환작업은 인터프리터에 의해서 지속적으로 수행되지만, 필요한 코드의 정보는 메모리에 올려두었다가
재사용하게 되는 방식이다.
JVM의 구성요소
JVM은 총 4가지로 구성되어있다.
우선 바이트코드를 기계코드로 변환해주는 인터프리터, JIT컴파일러, 클래스로더, GC(가비지컬렉터)등이 있다.
클래스 로더란?
자바 프로그램의 런타임중에 JVM메소드 영역에 동적으로 자바 클래스를 로드해주는 역할을 한다.
클래스 로더는 크게 3가지 순으로 수행하게 된다.
로딩
클래스 파일(.class)을 읽을 때 JVM스펙에 맞는지 확인하고 적절하다면 메소드영역에 저장한다.
링킹
링킹단계에서는 총 3가지의 일을 수행하게 된다.
1. 검증
검증단계에서는 클래스파일의 바이너리 데이터 파일이 유효한지 확인하고, 만약 유효하다면 다음 단계인 "준비"단계로
넘어간다.
2. 준비
준비단계에서는 실행에 필요한 메모리공간을 준비한다.
3. 분석
분석단계에서는 심볼릭메모리 래퍼런스를 실제 래퍼런스로 교체한다.
※ 심볼릭 메모리 래퍼런스는 참고하는 클래스의 메모리 주소를 참조관계로 구성한 것이 아니라 참조하는 대상의 이름만
지칭하는 래퍼런스이다.
초기화
초기화 단계에서는 변수들을 적절한 값으로 초기화 해주는 단계이다.
GC(가비지 컬렉터)란?
유효하지 않은 메모리를 알아서 정리해주는 것이다.
사용자가 객체를 생성하면 JVM의 힙이라는 공간에 객체가 저장되는데 힙에는 young영역과 perm이라는 영역이 있다.
perm영역
perm영역은 오랫동안 살아있는 객체가 저장되는 공간이다.
young영역
young영역에는 Eden과 Survivor영역이 존재하는데
Eden -> 객체가 생성되자마자 저장되는 장소
Survivor -> Eden객체 꽉 차면 Eden영역의 살아있는 객체만 이동하는 영역
만약 여기서 두 Survivor영역이 다 차게 되면 이때부터 GC(가비지 컬렉터)가 발생하게 된다.
JRE와 JDK차이
JRE
자바를 실행할 수 있는 환경의 집합, 라이브러리와 API, JVM도 포함한다.
※ 개발은 안되고, 실행만 가능
JDK
자바를 개발하기 위해 사용하고 개발을 하고 실행도 시켜야 하니 JDK안에 JRE도 포함된다.
'JAVA' 카테고리의 다른 글
[JAVA] 리터럴변수&변수의스코프와 라이프타임 (0) | 2023.03.21 |
---|---|
[JAVA] Primitive Type vs Reference Type (0) | 2023.03.21 |
Spring framework 핵심기술 - IoC 컨테이너 (0) | 2023.01.05 |
자바 I/O 와 NIO 차이 (0) | 2022.06.14 |
I/O란? (0) | 2022.06.14 |