JDK, JRE, JVM 그게 뭔데
오늘은 JDK, JRE, JVM에 대해 정리해봤다
자바 공부하다 보면 맨날 헷갈리는 단골 질문
"JDK, JRE, JVM 이게 뭔데?"
오늘은 이 셋의 관계랑, 바이트코드가 뭔지도 같이 정리해봤다.
JDK (Java Development Kit)
-> 범위가 가장 큰 놈이다.
- 말 그대로 자바 개발 도구 모음 세트
- 개발자가 작성한 소스코드를 .java로 만들고, .class로 컴파일하고, 디버깅하고 실행까지 다 해볼 수 있다.
- 실제로 개발할 땐 이걸 설치해야 하고 JDK에 JRE, JVM 다 포함됨
예) javac(컴파일러), jdb(디버거), jar(압축 툴) 등등 개발자 도구가 다 들어있음
JRE (Java Runtime Environment)
- 개발 도구는 빠진 대신, 자바 프로그램을 실행할 수 있는 환경
- JRE는 실행 환경으로, 진짜 코드를 실행하는데 어려움이 있음
- 이미 바이트코드로 컴파일된 .class 파일이 있으면 실행 가능하나,
.java 파일을 .class 파일로 컴파일하는 컴파일러가 없기때문
기본적으로 사용하는 Scanner, ArrayList, System.out 같은 클래스들은
여기 들어있는 라이브러리(JAR 파일) 덕분에 쓸 수 있는 것.
JVM (Java Virtual Machine)
- 진짜로 자바를 실행시키는 것
- .class 파일(바이트코드)을 읽고, 컴퓨터가 실행할 수 있도록 기계어로 바꿔준다
내부 로직은
- 클래스 로더가 .class 파일을 읽어서 보안 검사
- 메모리(힙, 스택, 메서드영역 등)에 올리고
- Execution Engine이 기계어로 바꿔서 실행시킨다
조금 더 풀어서 설명하자면
1. 개발자가 작성한 소스코드 .java 파일을 JDK의 컴파일러 javac가 바이트코드인 .class 파일로 변환
2. 바이트 코드를 기계어로 변환하기 위해 클래스로더가 바이트코드 보안 검사 후 내부 데이터를 각 메모리에 올림
3. 메모리에 담긴 데이터를 Execution Engine이 기계어로 변환시키는데 방법은 두 가지
- 데이터를 한 줄씩 해석, 실행하는 인터프리터
- 데이터를 한번에 해석, 실행하는 jit 컴파일러(자주 쓰이는 코드는 미리 기계어로 변환) -> 이 부분은 조금 더 알아볼 필요가 있음
바이트코드?
개발자가 작성한 소스코드인 .java 파일을 컴파일하면 나오는 게 .class 파일인데,
이 안에 들어있는 코드가 바로 바이트코드다.
- 사람이 직접 읽진 않지만 JVM이 읽을 수 있는 중간 언어
- 기계어(0101...)는 아니고, 그 전에 JVM이 보는 언어
바로 실행 못 하니까, JVM의 인터프리터나
JIT 컴파일러로 해석, 진짜 기계어로 바꿔서 실행시킴.
JRE의 라이브러리?
코드를 작성할 때 바로 사용할 수 있는 String, System, Scanner, List, Map 같은 자바 기본 기능들.
전부 라이브러리 파일에 들어 있는 클래스들임.
간단히 정리하자면
자바는 .java -> 컴파일 -> .class(바이트코드) -> JVM -> 기계어 흐름으로 실행됨
- JDK = JRE + 개발도구 (코딩, 컴파일, 디버깅 가능)
- JRE = JVM + 실행용 라이브러리 (실행만 가능)
- JVM = .class 파일을 기계어로 변환해서 실행시켜주는 애
- 바이트코드 = JVM이 읽는 중간 언어
- 기계어 = 진짜 0101... CPU가 실행하는 코드