1-1 JRE, JDK, JVM & Hello,world

leocodms·2021년 1월 17일
0

Java

목록 보기
1/5

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

JVM의 2가지 기본 기능

  1. java 프로그램이 어느 기기, 어느 운영체제 상에서도 실행될 수 있게 해준다.
    -> WORA(Write Once, Run Anywhere)
  2. java 프로그램의 메모리를 효율적으로 관리 & 최적화 해줍니다.

java 이전 C, C++의 경우 강력하지만 운영체제에 맞춤으로 작성되었습니다. 따라서 같은 프로그램이지만 윈도우, 리눅스 등 os에 따라 다르게 작성되어야 했고, 작은 변화에도 작성 프로그램 전체를 변경 해야하기 때문에 비용이 많이 들었습니다. java는 이를 개선하고자 운영체제와 분리된 공간에서 프로그램을 동작시키는 방식을 택합니다. 즉, 운영체제 위의 가상 환경(JVM)에 프로그램을 동작시키는 것입니다.

JVM은 자바 소스코드로부터 만들어지는 자바 바이너리 파일(.class)을 실행할 수 있습니다. 또한 JVM은 플랫폼에 의존적입니다. 즉 리눅스의 JVM과 윈도우즈의 JVM은 다릅니다. 단, 컴파일된 바이너리 코드는 어떤 JVM에서도 동작시킬 수 있습니다.

✔︎ Garbage Collection(이후 포스팅에서 다룰 예정..)
JVM이 메모리를 관리하는 프로세스를 지칭하는 용어입니다. 프로그램 상에서 사용하지 않은 메모리를 지속적으로 찾아 제거함으로써 효율적인 메모리 관리를 가능하게 합니다.

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

JRE = 자바 클래스 라이브러리 + JVM + 자바 클래스 로더
컴파일 된 파일(.class)를 실행합니다.

자바 클래스 로더(java class loader)
https://homoefficio.github.io/2018/10/13/Java-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%A1%9C%EB%8D%94-%ED%9B%91%EC%96%B4%EB%B3%B4%EA%B8%B0/

JRE는 JVM이 원활하게 작동할 수 있도록 환경을 맞춰줍니다.
JRE는 JVM 이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있습니다. JRE는 JVM의 실행환경을 구현했다고 할 수 있습니다.

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

JDK를 설치하면 JRE가 자동으로 설치됩니다. JDK는 JRE를 포함하고 있고, JRE는 JVM을 포함하고 있습니다. 따라서 JDK를 설치하면 JRE, JVM이 자동으로 다 설치됩니다.
JDK에는 JRE에는 없는 "자바 컴파일러(javac, java compiler)"를 포함하고 있습니다. 실제로 .java 파일을 만들어서 실행(빌드)하면 컴파일 작업을 거쳐 .class 라는 파일이 자동으로 생성됩니다.

▷JDK 버전별 차이
CPU(홀수 버전)은 critical fixes만 포함
PSU(짝수 버전)은 critical fixex + non-critical fixes까지 포함
기본적으로 홀수버전을 사용하면 되지만, 버그에 민감한 작업을 한다면 짝수버전 추천!

JDK : 개발자용 | JRE : 사용자용 | JVM : 가상 머신

자바의 동작 원리

자바로 작성한 소스코드(.java)는 컴파일되면 바이트코드로 실행파일(.class)이 만들어집니다. 실행파일은 JVM안에서 각 운영체제 별로 실행히 됩니다.

자바 프로그램이 실행 될때, JVM은 일정한 처리 과정을 거칩니다.

1. 클래스 로더(class loader)
제일 먼저 클래스 로더가 작동합니다. 자바 클래스 로더는 자바 클래스를 JVM으로 동적로딩하는 JRE의 일부입니다.
클래스 로더는 실행에 필요한 모든 실행파일(*.class)을 찾아줍니다.
.
자바 클래스 로더는 3개의 계층, 3개의 원칙으로 구성되어 있습니다.
1.Bootstrap ClassLoader
부트스트랩 클래스로더는 3가지 기본 클래스로더 중 최상위 클래스로더로서, 쉽게 말하면 jre/lib/rt.jar에 담긴 JDK 클래스 파일을 로딩합니다.
2. Extension Classloader
<JAVA_HOME>/jre/lib/ext 폴더에 담긴 자바의 확장 클래스파일을 로딩합니다. Java로 구현되어있습니다. sun.misc.Launcher$ExtClassLoader 클래스에 의해 구현되어 있습니다.
3. Application Classloader
-classpath(또는 -cp)폴더에 있는 클래스를 로딩합니다. Java로 구현되어 있습니다. 개발자가 직접 작성한 클래스를 로딩합니다. sun.misc.Launcher$AppClassLoader 클래스에 의해 구현되어 있습니다.

2. 바이트 코드 검증(Byte code verifier)
클래스 로더가 모든 실행 파일을 준비하면 이 파일의 코드가 올바른지 검증합니다. 코드가 정해진 규칙에 따라 작성되었는지 등을 검증합니다.
자바 프로그램은 실행 시점에 코드의 유효성을 검증하는 과정을 거치므로 보안에 강하다는 장점이 있습니다.

3. 기계어 코드로 변환
자바 실행파일은 바이트 코드이기 때문에 실행될때 다시 한 번 기계어로 번역되어야 합니다.
JVM이 자바 실행파일을 기계어 코드로 변환하는 방식에는

  • 인터프리터
  • JIT (Just In Time) compiler

가 있습니다.

인터프리터는 명령문 단위로 기계어코드 변환을 수행해 처리속도가 느리다는 단점이 있습니다.

초기 자바에는 JVM이 인터프리터방식으로만 바이트코드를 해석했고 기계어코드로 컴파일된 프로그램처럼 빠르게 실행될 수 없었습니다. 이를 보완하기위해 JIT 컴파일러가 도입되었습니다.

JIT는 실행할 때 컴파일한다는 의미입니다. JIT compiler는 파일 전체를 한번에 기계어로 변환합니다. 미리 컴파일해놓고 실행하므로 처리 속도가 빠릅니다.


더 생각해 보기..

Q1. 클래스 로더의 포함관계(..?), 위치가 애매하다..
Q2. 자바는 왜 JIT 컴파일을 택했나?(클래스가 호출될때 컴파일 하는 것이 아니라 한번에 다 컴파일하면 오히려 손해아닐까?
Q3. JNI란? 왜 사용하고, 어떻게 동작하나.
Q4. println()내부에 왜 동기화를 사용하나?(synchronize)

0개의 댓글