JDK
- Java Development kit
- JDK = JRE + 개발을 위한 도구
- 컴파일러, 디버그 도구 등이 포함
JRE
- Java Runtime Environment
- JRE = JVM + 자바 프로그램 실행에 필요한 라이브러리 파일 등
- JVM의 실행환경 구현
JVM
: 자바 프로그램을 구동해주는 프로세서(엔진)
OS마다 다른 컴파일러가 필요하지만 JAVA는 JVM이 똑같은 바이트 코드를 OS마다 다르게 번역해준다. (⇒ 해당 OS가 이해할 수 있도록 번역해준다) 그렇기 때문에 플랫폼에 독립적인 개발이 가능하다.
동작 과정
- 자바 실행 파일을 실행하면 JVM은 OS로부터 메모리를 할당한다.
- .java(자바 소스코드)를 컴파일러가 .class(바이트 코드)로 컴파일해준다.
- 컴파일된 바이트 코드는 Java Runtime Environment 안에 있는 JVM에서 실행된다.
- JVM Runtime Data Area로 로딩 => Execution Engine을 통해 해석된다.
- 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 수행하며 이 과정에서 Execution Engine에 의해 Gabage Collector의 작동과 Thread 동기화가 이루어진다.
용어 설명
컴파일 : 인간이 이해하기 쉬운 언어를 기계어로 번역하는 과정
자바 컴파일러 : 자바 소스코드(.java)를 바이트 코드(.class)로 변환시켜준다.
바이트 코드(바이너리 코드) : 0과 1로 이루어진 코드(컴퓨터가 이해하는 코드)
자바 바이트코드는 플랫폼에 독립적이며 모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다. 따라서 표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서 이론적으로 모든 자바 프로그램은 CPU나 OS의 종류와 무관하게 동일하게 동작할 것을 보장한다.
클래스 로더 : JVM은 런타임시 처음으로 클래스를 참조할 때 해당 클래스를 로드하고 메모리 영역에 배치시킨다. 이 동적 로드를 담당하는 부분이 클래스 로더이다.
런타임 데이터 영역(Runtime Data Area) : JVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역
많은 Area가 있지만 그 중에서도 스택 영역과 힙 영역에서의 지역 변수와 객체가 생성되고 삭제되는 과정을 간단히 알아본다. 아래와 코드를 살펴보면 정수형 변수 a에는 50이 저장되고, 1차원 배열 arr1는 길이가 3인 객체가 생성되고, arr2에는 arr1을 저장하는 것을 볼 수 있다.
int a = 50;
int[] arr1 = new int[3];
int[] arr2 = arr1;
자바에서는 기본타입(원시타입)인 char, byte, short, int, long, float, double, boolean과 같은 8가지 자료형을 제외하고 모두(String, int[], char[] .... ) 참조타입이다. a에 저장된 50은 기본타입이기 때문에 스택 영역에 값이 고스란히 저장된다. 그렇다면 객체타입인 즉, 참조형 변수인 arr1과 arr2는 어떻게 저장되는 것일까?
아래 그림을 살펴보면, 스택영역에 a와 arr1, arr2가 모두 저장된 것을 볼 수 있다. 그렇다면 arr1에 값을 저장하면 스택 영역에 저장되는 것일까? 답은 NO 이다. 일반적으로 new(); new int[3]; 과 같이 선언된 구문은 "객체를 생성한다" 라는 의미이다.
5가지 영역 : PC Register, JVM Stack, Native Method Stack, Heap, Method Area (이 중에서 힙과 메서드 영역은 모든 스레드가 공유해서 사용한다.)
1. PC Register : 스레드가 어떤 명령어로 실행되어야 할 지 기록하는 부분(JVM 명령의 주소를 가진다.)
2. Stack Area : 지역변수, 매개변수, 메서드 정보, 임시 데이터 등을 저장
3. Native Method Stack : 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
4. Heap : 런타임에 동적으로 할당되는 데이터가 저장되는 영역(객체나 배열 생성이 여기에 해당함. 또한, 힙에 할당된 데이터들은 GC의 대상이 된다. -> JVM 성능 이슈에서 가장 많이 언급되는 공간임)
가비지 컬렉션(Garbage Collection) : 더 공부해보기
출처 :
https://www.youtube.com/watch?v=f0cAmTYo4tQ
https://ko.wikipedia.org/wiki/자바_가상_머신
https://github.com/gyoogle/tech-interview-for-developer/blob/master/Language/[java] 자바 가상 머신(Java Virtual Machine).md