목표
자바 소스 파일(. java)을 JVM으로 실행하는 과정 이해하기.
학습할 것
- JVM이란 무엇인가
- 컴파일 하는 방법
- 실행하는 방법
- 바이트코드란 무엇인가
- JIT 컴파일러란 무엇이며 어떻게 동작하는지
- JVM 구성 요소
- JDK와 JRE의 차이
JVM이란 무엇인가
Java Virtual Machine
자바는 완전한 기계어가 아닌 바이트코드이므로 이를 해석하여 OS에서 운영될 수 있게 해주는 가상 머신이다.
JVM은 OS에 종속적이지만 JVM만 OS에 맞게 설치해주면 자바는 OS에 종속되지 않고 사용할 수 있다.
컴파일하는 방법
javac <filename>.java
컴파일하려는 파일이 위치한 곳에서 해당 명령어를 실행해주면 .class 파일이 생성된다.
실행하는 방법
java <packagename>.<classname>
컴파일된 파일 명을 java 명령어로 입력해주면 코드가 실행된다. Hello~~
바이트코드란 무엇인가
특정 하드웨어가 아닌 가상 머신 즉, 소프트웨어에서 돌아가는 프로그램을 위해 만들어진 이진 표현법이다.
높은 이식성이 장점이며 기계어보다 느린 실행 속도가 단점이지만 이는 JIT로 보완할 수 있다.
JIT 컴파일러란 무엇이며 어떻게 동작하는지
Just In Time 컴파일러
프로그램을 실행하는 시점에 필요한 부분을 컴파일하는 방식이다.
자바의 실행 엔진은 자바 바이트코드를 명령어 단위로 읽어서 실행하는 인터프리터 방식을 사용하는데, 이를 보완하기 위해 도입된 것이다.
자주 쓰이는 코드를 캐싱한 뒤 캐싱 데이터를 사용하는 방식으로 기존 인터프리터 방식으로 인한 느린 속도를 극복할 수 있게 했다.
JVM 구성 요소
Class Loader
자바는 런타임 때 클래스를 로딩하고 링크하는데, 이 역할을 클래스 로더가 한다. 이때 사용하지 않는 클래스는 삭제하고 효율적으로 로딩하기 위해 지연 로딩이나 캐싱을 사용한다.
RunTime Data Area
프로그램을 수행하기 위해 OS에게 할당받은 메모리 공간으로 크게 5가지로 나눌 수 있다.
PC Register, JVM 스택 영역, Native Method Stack, Method Area, Heap
PC Register - 스레드 별로 하나씩 존재하며 실행 중인 JVM Instruction 주소를 가지고 있다.
JVM 스택 영역 - 각 스레드가 시작될 때 생성된다. Method가 실행되는 동안 사용되는 변수, 결과 값 등의 임시 데이터, 메서드 정보 등을 스택에 저장했다가 메소드 실행이 끝나면 삭제한다.
Native Method Stack - Java 외의 네이티브 언어로 작성된 코드들을 실행하기 위한 공간이다. Java Native Interface를 통해 바이트코드로 변환하여 스택에 저장하며 이덕분에 JVM 내부에 영향을 주지 않을 수 있다.
Method Area(= Class Area = Static Area) - 초기화되는 대상을 저장하는 메모리 공간이다. 프로그램의 흐름을 저장하는 바이트 코드들이 올라가 있다. 이 영역은 모든 스레드가 공유한다.
Heap - 런타임 시 동적으로 할당하여 사용하는 영역이다. new 연산자로 생성된 객체와 배열을 저장한다.
Execution Engine
클래스 로더가 런타임 영역에 배치시킨 바이트코드를 실행하는 역할을 한다.
인터프리터, JIT 두 가지 방식을 사용한다.
JDK와 JRE의 차이
JDK - Java Development Kit
자바 개발을 위한 키트로 컴파일러와 JRE가 포함되어있다.
JRE - Java Runtime Environment
자바 실행 환경. JVM과 라이브러리가 포함되어있다.
Reference)
https://m.blog.naver.com/10hsb04/221613745124
https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2
https://asfirstalways.tistory.com/158
https://velog.io/@gkscodus11/JVM-%EC%9D%B4%EB%9E%80
'IT > JAVA' 카테고리의 다른 글
자바 상속 - 백기선님 스터디 6주차 과제 (0) | 2021.02.19 |
---|---|
자바 클래스 - 백기선님 스터디 5주차 과제 (0) | 2021.02.13 |
자바 제어문 - 백기선님 스터디 4주차 과제 (0) | 2021.02.10 |
자바 연산자 - 백기선님 스터디 3주차 과제 (0) | 2021.02.05 |
자바 데이터 타입, 변수 그리고 배열 - 백기선님 스터디 2주차 과제 (0) | 2021.02.02 |