본문 바로가기
자바과정/Java

JVM과 JDK와 JRE

by Parkej 2021. 9. 23.


Java를 공부하면서 무언가를 깊숙하게 알아보는것이 재밌길래 한 번 알아보았다.
나는 자바를 하면 IDE를 다운받고 환경변수를 등록하고 코드쓰고 실행해보고... 이런 행동들을 자바를 하려면 필요한 설정이니까 해야한다라고만 알고있었지 정작 안에서 실행되는 부가적인 것들이 무엇인지, 어떤 것인지는 정확하게 알지 못했다.
그래서 알아보고자 한다.

자바의 철학

"한 번 쓰고 모든 곳에서 실행한다. (Write Once, Run Anywhere) "

강의영상의 그림을 본떠 만든것

- JDK(Java Development Kit) 이라고 하며 Development Tools(개발 툴)과 JRE(Java Runtime Environment)를 포함한다.
- JRE(Java Runtime Environment)는 JVM(Java Virtual Machine)과 Library를 포함한다.
- JDK 9 이후부터는 JRE를 따로 다운받지 않아도 된다.
- JDK 8 이하 버전은 JDK와 JRE를 다운받아야했다.

자바 가상 머신( JVM ; Java Virtual Machine)

1. 자바 애플리케이션을 어느 기기나 운영체제(OS)에서도 실행될 수 있게 만들어 준다. (자바의 철학)
2. 자바 애플리케이션의 메모리를 효율적으로 관리 그리고 최적화해준다.


과거의 모든 프로그램은 운영체제에 맞게 작성되었다고 한다. 같은 프로그램도 윈도우, 맥, 리눅스 등 사용하는 운영체제에 맞게 작성되어야 했다. 또한 메모리 관리도 개발자가 일일이 작업을 해야한다.
그렇지만 JVM이 등장하고 나서 앞의 작업들을 해주지 않아도 되었다.

자바 프로그래밍으로 보자면 .java 파일을 자바 컴파일러를 통해 .class(바이트 코드)로 바꾸고 이것을 인터프리터랑 JIT 컴파일러를 사용해 네이티브 OS에 맞춰 JVM이 이해할 수 있는 코드로 변경 후 실행한다.

그리고 JVM에는 메모리 관리를 알아서 처리해주는 프로세스가 있다. 이것은 엄청난것이다.
바로 GC (Garbage Collection; 가비지 컬렉션) 이다.
자바 애플리케이션 상에서 사용하지 않은 메모리를 자동으로 찾아 제거해 효율적인 메모리 관리를 하게된다.


자바 런타임 환경 (JRE; Java Runtime Environment)

JVM과 Library 그리고 자바 클래스 로더(Java Class loader)를 포함하고 있다.

- 자바 클래스 로더(Java Class loader) : 클래스 라이브러리를 통해 작성한 자바 코드를 라이브러리와 결합한 후 JVM에 넘겨 실행 시킨다. 이것은 JVM이 원활하게 구동될 수 있게 환경을 맞춰준다.

- JRE는 자바 애플리케이션을 실행할 수 있도록 구성된 배포판이다. 그러니까 자바 애플리케이션을 실행하는데에 필요한 것만 가지고 있다. 그리고 바이트코드를 실행해야하기 때문에 JVM도 들어있다.

- 하지만 자바를 개발하는 툴은 제공되지 않는다. (이건 JDK에서 제공하는것이다.)
- JRE에는 java가 있지만 javac(자바 컴파일러)는 가지고 있지 않다.

jre만 있어도 실행 가능

- 결국 java (.class) 실행은 가능하지만 컴파일은 불가능하단 소리다.
- java를 컴파일하려면 JDK가 필요하다.


자바 개발 키트(JDK; Java Development Kit)

개발자들이 JVM과 JRE에 의해 실행되고 구동될 수 있는 자바 프로그램을 생성할 수 있게 해준다. (개발)

자바 기초 공부를 위해 다운받는 것이 이것이다. 그리고 자바 9버전 이후 JRE를 따로 설치하지 않고 JDK만 설치해도 JRE는 자동으로 설치된다. 결국 JDK는 JRE를 포함하고 JRE는 JVM을 포함하는 구조이다.
대신 8버전 이하로 쓸거면 JDK와 JRE 둘 다 다운받아야 한다.

나는 그냥 자바로 만든 애플리케이션만 실행하고 싶으면 JRE만 설치하면 된다. 하지만 자바 개발자로서 무언가 개발하려면 JDK를 설치해야한다.


위에 JRE에서 설명했던 바와 같이 JDK에는 자바 컴파일러(javac)를 가지고 있다.

* 컴파일러 : 자바 언어로 작성한 자바 문법을 컴퓨터가 이해할 수 있게 바꿔주는 해석기 같은 것.


- 간단하게 보자면 text.java 파일을 만들고 그 안에 소스를 입력한다.

text.java


- 그리고 해당 명령어를 통해 컴파일 한다. (.class 파일 생성)


- 아래와 같은 파일 2개가 있는것을 확인할 수 있다.

.class 파일(바이트 코드)와 JVM을 포함해 JRE라고 보면 되겠다.



결론적으로 우리가 이해할 수 있는 Java 문법으로 소스를 작성한것이 .java 파일이다.
이것은 컴퓨터가 이해를 할 수 없다.

그래서 우리는 .java 확장자를 가진 파일을 기계가 이해할 수 있게 전환작업을 해야한다. (컴파일)

CMD 즉 콘솔창에서는 javac라는 명령어를 통해 자바 컴파일을 하지만 이클립스같은 IDE환경에서는 소스를 작성하고 저장을 누르면 .class 파일이 자동으로 생성된다 그래서 우리는 편하게 저장하고 실행하면 결과를 볼 수 있는 것이다.
이클립스에서 Run as를 통해 Application을 실행하면 이클립스가 JVM한테 시키는 것


컴파일을 하고 나면 .class 파일이 생기는데 이를 컴퓨터가 이해할 수 있는 바이트 코드라고 한다.
( 자바의 기술을 응용해서 만든다. Java Application.class )

이 바이트 코드를 실행하면 JVM으로 넘어가 컴퓨터에 자바 애플리케이션이 실행되는 것처럼 보이는 것이다.


요약

JDK : 자바 기반 소프트웨어를 위한 도구들로 이루어진 패키지
JRE : 자바 코드를 실행하기 위한 도구들로 구성된 패키지
JVM : JRE 포함 요소, 자바 애플리케이션을 어디서든 실행 가능하게 함
- 단지 자바 프로그램을 구동하기 위한 독립형 구성요소로 사용가능 하지만 JDK의 일부이기도 하다. 자바 프로그램을 구동하는 것이 자바 프로그램 개발의 일환이기 때문에 JDK는 JRE를 필요로 한다.

반응형

댓글