백기선님의 자바 스터디 1주차 내역을 토대로 학습 및 작성합니다.
자바 가상 머신(Java Virtual Machine)
자바는 JVM이라는 가상 환경을 띄워 그 위에서 동작한다. OS에 상관 없이 동작이 가능하다는 특징은 무슨 의미일까,
JVM은 자바 언어를 특정 OS들에 맞게 변경을 해주고 자바로 작성된 프로그램은 이 JVM에서만 실행이 가능하다.
추가 내용은 내 JVM 기록 다시 참조하기
특정 OS에 맞게 변경은 어떻게 이뤄지고 JVM에서 어떻게 실행될까?
각 구성 요소 특징 -> 참조
어떤 언어의 코드 전체를 다른 언어로 바꿔주는 과정이다. 또한 이 과정을 자동으로 수행해주는 소프트웨어를 컴파일러(Compiler)
라 한다.
개발자, 코더는 Java 언어로 소스 코드를 작성한다.
Java의 모든 소스 코드는 먼저 .java
확장자로 끝나는 일반 텍스트 파일로 작성된다.
이후 이러한 파일은 javac 컴파일러
에 의해 .class
파일로 컴파일된다.
위 과정을 거쳐 컴파일이 진행된다. 여기서 중간코드란
바이트 코드(Byte Code)라 칭한다.
javac 컴파일러
는 일반 텍스트 파일을 .class 파일
로 컴파일 해준다고 했다. .class 파일
을 구성하는 데이터가 바로 바이트코드이다.
공식 오라클 레퍼런스을 찾아보면
".class 파일
에는 고유 프로세서 코드가 포함되어있지 않다.
그 대신 JVM의 기계어인바이트 코드
를 포함한다."
라고 기술되어 있다.
바이트 코드란 JVM이 이해할 수 있도록 하는 기계어로 변환된 것을 의미한다.
여기서 기계어는 하드웨어 아키텍처 상에 기계어와 다르다.
Java Bytecode는 우리가 개발하는 자바 프로그램(코드)를 배포하는 가장 작은 단위라 생각 할 수 있다.
자바라는 언어는 특징 중 컴파일 과정, 인터프리터 방식을 모두 거친다.
깊게 들어가자면 바이트코드로 컴파일하고 바이트코드를 인터프리터하는 방식으로 실행된다.
인터프리터 과정은 소스코드를 런타임 시에 한 번에 한 줄씩만 읽어들이기 때문에 속도가 느린 점이 있다.
이 부분을 개선하기 위해 도입된 것이 JIT 컴파일러
로 볼 수 있다.
JIT 컴파일러
는 처음으로 읽은 바이트코드를 컴파일한 후
저장소에 저장(캐싱) 하여 번역 중복을 방지하는 역할을 한다.
바이트코드를 읽어들일 때, 이전 바이트코드와 비교하여 다른 코드면
새롭게 컴파일하고 중복 코드일 경우 캐싱된 코드를 사용하는 방식인 것이다. 이 특징으로
자바 인터프리터는 중복, 혹은 반복되는 바이트코드는 JIT 컴파일러
가 모두 컴파일하기 때문에 컴파일 과정을 보조받는 셈이다. (속도 효율 증가)
ex) Hello.java
라는 소스 파일을 작성했다.
Hello.java
를 컴파일한다.
javac Hello.java
입력이후 Hello.java
는 javac 컴파일러
에 의해 컴파일되어 바이트 코드로 이루어진 Hello.class
로 컴파일된다.
이를 실행하기 위해 JVM은 바이트 코드 파일(Hello.class)
를 메모리에 로드하고 최적의 기계어로 변환하여 main() 메소드를 찾아 실행시킨다.
java Hello
입력JDK | JRE | JVM |
---|---|---|
JDK는 개발자 키트로, 개발에 필요한 어플리케이션 소프트웨어이다. | JRE는 자바 클래스와 라이브러리, 필수적인 컴포넌트들을 제공한다. | JVM은 바이트코드를 실행하고, 실행에 필요한 환경을 제공한다. |
JDK는 JRE를 포함하고 있고, JRE는 JVM을 포함한다.
자바 개발이 목적이라면 JDK가 반드시 필요하다. 단순히 자바 파일을 실행시키는 목적이라면 JRE만 있어도 실행이 가능하다.
JVM은 JDK와 JRE와 달리 OS에 종속적이다. 그렇기 때문에 OS마다 맞는 기계어로 실행되어야 한다.