JVM은 무엇인가? JAVA 코드는 어떻게 실행하는가?

infoqoch·2021년 2월 3일
0

JAVA

목록 보기
4/9
post-thumbnail

목표 : 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.

  1. JVM이란 무엇인가?
    JVM은 Java Virtual Machine의 준말로 자바의 코드를 컴퓨터가 이해할 수 있는 언어로 바꿔주는 가상 컴퓨터(해외에서 Machine은 한국에서의 컴퓨터와 같은 의미)이다. 자바가 현재 C와 더불어 가장 많이 활용된 이유는 JVM에 의해서다. JVM이 강점이자 특징은 어떤 OS에서도 자바의 코드를 작동시킨다는 점이다.
    자바가 처음 등장한 1995년은 윈도우가 대세였다. 그러나 1999년 인터넷이 활성화 되며 어떤 서버의 OS에서도 작동하는 자바가 대세가 되었다. 자바의 이식성은 자바의 최고의 장점이다.
    JVM의 이러한 장점으로 인해, (혹시라도) 개발 언어로서 자바가 힘을 잃는다 하더라도, JVM 기반의 언어는 계속 유지될 것으로 전망한다. 실제로 코틀린과 스칼라는 JVM을 기반으로 작동한다. 안드로이드는 JVM과 유사한 구조의 안드로이드 컴파일 아래에 작동한다.
  2. JVM의 이전의 과정
자바소스파일(.java)
컴파일(javac.exe)
바이트 코드 파일(.class)
JVM 구동
2.1 컴파일과 바이트 코드 자바소스파일(.java)은 사람이 이해할 수 있는 언어로서 우리가 직접 작성하는 코드이다. 자바파일은 컴파일러를 통해 바이트코드 파일로 변환한다. 바이트 코드는 JVM이 이해할 수 있는 언어(기계어)이다. 자바와 코틀린이 동일해지는 부분은 바로 바이트코드로 변환한 결과물로서 컴파일 데이타(바이트코드)이다.

2.2 컴파일 에러
컴파일과 아래의 JVM의 런타임은 다르다. 컴파일오류는 일종의 문법 오류로서, java파일이 class파일 자체로의 변환 자체가 불가능하다. 그러므로 컴파일 오류는 다른 오류와 대비하여 문제 해결이 직관적이다. 그러나 jvm에서 발생하는 런타임 오류는 그 발생의 원인을 개발자가 오류 메시지를 기반으로 역추적 해야 한다.

2.2 컴파일과 런타임의 호환성
JVM의 런타임은 낮은 버전에 대해서는 작동을 하지만, 높은 버전에 대해서는 작동하지 않는다(UnsupportedClassVersionError). 그러니까 .class 바이트코드 파일의 버전이, JVM의 버전보다 낮으면 작동하지 않는다. 컴파일러는 이러한 문제에 대응하여 낮은 버전에 대해서도 작동할 수 있도록 하는 옵션을 제공한다.

  1. JVM의 작동


<출처 : https://en.wikipedia.org/wiki/Java_virtual_machine>

3.1 JRE / JDK
자바를 설치 할 때 JRE와 JDK 둘 중 하나를 선택하여 설치할 수 있다. JRE는 Java Runtime Enviroment로, JVM을 작동시키기 위한 다양한 조건들의 모음으로 볼 수 있다. JDK는 JRE를 포함하는 개념으로, 자바 언어와 그것을 위한 다양한 라이브러리, 서버 기능 등을 가지고 있다. 그러므로 자바를 단순하게 사용하는 사람은 JRE를 설치하면 되고, 자바를 개발하는 사람은 JDK를 설치해야 한다.
JDK는 다양한 회사에서 개발하고 배포하고 있다. 자바의 저작권을 가지고 있는 오라클은 두 가지의 JDK를 제공한다. Oracle JDK와 OpenJDK. 일단, JAVA언어 자체는 무료이며, 오라클에서 제공하는 OpenJDK 역시 무료이고, 오라클 이외의 회사에서 개발한 JDK 역시도 무료이다. 다만 Oracle JDK가 유로 버전인데, Non-General Purpose Computing에 대해서만 라이센스 구독비를 받는다. 물론 일반적이지 않은 목적이 무엇이냐에 따라 쟁점이 갈리겠지만, 자바가 유료화 되어 나와 같은 웹 개발자가 사용하지 못하는 일은 당장 없을 것 같다.
출처 : https://www.lpcinc.co.kr/blog/java-%EC%9C%A0%EB%A3%8C-%EB%85%BC%EC%9F%81-oracle-jdk%EC%99%80-openjdk%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EC%A0%95%EB%A6%AC

3.2 Class Loader
런타임에 필요로 하는 클래스 파일과 jar 파일을 Runtime Data Area에 로드한다.

3.3 Runtime Data Area
이전에 작성한 글 참고 :
https://velog.io/@infoqoch/JAVA-Runtime-Data-Area%EC%9D%98-%EC%84%B8%EB%B6%80-%EC%98%81%EC%97%AD

3.4 Execution Engine
3.4.1 Garbage Collector
자바언어에서 메모리 관리가 필요하지 않은 (할 수 없는) 이유는 가비지 컬렉터 덕분이다. 메모리의 관리를 자바가 직접하기 때문에 (개발자가 조작 할 수 없기 때문에) 편의성이 증대된다.

3.4.2 Jit Complier
jit 은 Just In Time, 실시간이란 의미이다. jit은 바이트코드를 바이너리코드로 실시간으로 번역하는 업무를 한다. 자바는 컴파일 언어이자 인터프리터 언어라고 하는데 여기서 인터프리터 언어의 특징이 나타난다. 바이트코드는 컴파일이 되지만, 바이트코드가 바이너리 코드가 될 때는 jit의 동작으로 인해 실시간으로 컴퓨터에 입력된다.
자바 언어의 성능 증대는 jit의 발전과 함께 한다고 한다. 바이너리 코드로 변경에 있어서 jit은 중복되는 내용을 캐싱을 통해 빠르게 처리하는 등 작업의 효율성을 증대시키기 위한 여러 기능을 내장하고 있다.

백기선 개발자님의 라이브 스터디를 진행 중입니다! 자바를 공부했고 자바를 기반으로 하는 프레임워크를 다루며 자바의 학습의 필요성을 계속 느꼈습니다. 이번 기회에 새롭게 자바를 학습하며 이해가 훨씬 높아지는 것을 느낍니다! 함께 합시다!
https://github.com/whiteship/live-study

profile
JAVA web developer

0개의 댓글