목표 : 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.
자바소스파일(.java) |
↓ |
컴파일(javac.exe) |
↓ |
바이트 코드 파일(.class) |
↓ |
JVM 구동 |
2.2 컴파일 에러
컴파일과 아래의 JVM의 런타임은 다르다. 컴파일오류는 일종의 문법 오류로서, java파일이 class파일 자체로의 변환 자체가 불가능하다. 그러므로 컴파일 오류는 다른 오류와 대비하여 문제 해결이 직관적이다. 그러나 jvm에서 발생하는 런타임 오류는 그 발생의 원인을 개발자가 오류 메시지를 기반으로 역추적 해야 한다.
2.2 컴파일과 런타임의 호환성
JVM의 런타임은 낮은 버전에 대해서는 작동을 하지만, 높은 버전에 대해서는 작동하지 않는다(UnsupportedClassVersionError). 그러니까 .class 바이트코드 파일의 버전이, 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