티스토리 뷰
목표
JVM은 무엇이며 JAVA 코드는 어떻게 실행하는것인가.
스터디 목차
- JVM이란 무엇인가
- 컴파일 하는 방법
- 실행하는 방법
- 바이트코드란 무엇인가
- JIT 컴파일러란 무엇이며 어떻게 동작하는지
- JVM 구성 요소
- JDK와 JRE의 차이
1. JVM이란 무엇인가
JVM이란 JAVA Virtual Machine, 자바 가상 머신의 약자를 따서 줄여 부르는 용어이다.
JVM 역할은 자바 어플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것이다.
그리고 JVM은 JAVA와 OS사이에서 중개자 역할을 수행하여 JAVA가 OS에 구애받지 않고 재사용을 가능하게 해준다.
2. 컴파일 하는 방법
java 소스코드를 작성한다.
javac 컴파일러를 사용해 바이트코드로 컴파일 한다.
class 파일 생성
3. 실행하는 방법
실행할때는 java 명령어를 사용하여 실행한다.
intellij 나 eclipse 와 같은 IDE를 사용하여 실행할수도 있다.
4. 바이트코드
자바 바이트코드란 자바 가상머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다.
자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트 라서 자바 바이트 코드라 불리고 있다.
이 바이트 코드는 실제 실행될 때 다시 한번 기계가 읽을 수 있는 형태(native code)로 interpreter를 통해 해석 되어야 한다.
이렇게 두번에 나눠서 하는 이유는 JAVA에 장점인 한번 작성하면 어떤 OS에서든 돌릴 수 있기 때문이다.
자바 바이트 코드의 확장자는 .class이다.
자바 바이트 코드는 자바 가상 머신만 설치되어 있으면, 어떤 운영체제에서라도 실행될수 있다.
5. JIT 컴파일러
JIT 컴파일러(Just-In-Time compiler)란 프로그램이 실행 중인 런타임에 실제 기계어로 변환해 주는 컴파일러를 의미한다.
성능 최적화를 위해 애플리케이션 런타임을 향상시킬 수 있다.
1) JIT 동작방식
JVM이 bytecode -> 기계어(native code)로 변환 할때 JIT 컴파일러를 사용한다.
명령어를 하나 하나 실행하는 인터프리터(Interpreter)방식 컴파일러 유형과는 달리 JIT 컴파일러의 주요 정의 특성은 프로그램이 시작되고 코드를 컴파일 한 후에 JIT 컴파일러를 실행 한다는 것이다.
전통적인 입장에서 컴퓨터 프로그램을 만드는 방법은 두가지가 있는데, 인터프리트 방식과 정적 컴파일 방식으로 나눌 수 있다. 이 중 인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하며, 반면 정적 컴파일을 실행하기 전에 프로그램 코드를 기계어로 번역한다.
JIT 컴파일러는 두가지의 방식을 혼합한 방식으로 생각할 수 있는데, 실행 시점에서 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 분 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.
JVM이 JIT 컴파일러 방식을 지원한다.
6. JVM 구성요소
JVM 구성요소는 크게 살펴보면 4가지(class Loader, Execution Engine, Garbage Collector, Runtime Data Area)로 나뉜다.
1) Class Loader
자바에서 소스를 작성하면 Person.java 처럼 .java 파일이 생성된다.
.java 소스를 자바 컴파일러가 컴파일하면 Person.class 같은 .class 파일(바이트코드)이 생성된다.
이렇게 생성된 클래스 파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리영역인 Runtime Data Area로 적재하는 역할을 class loader가 한다.
2) Execution Engine
class loader에 의해 메모리에 적재된 클래스(바이트코드)들을 기계어로 변경해 명령어 단위로 실행하는 역할을 한다.
인터프리터 방식과 JIT 방식이 있다. JIT 방식은 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식이다.
3) Garbage Collector
GC는 Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.
GC가 수행되는 동안 GC를 수행하는 쓰레드가 아닌 다른 모든 쓰레드가 일시정지된다.
4) Runtime Data Area
JVM의 메모리 영역으로 자바 어플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.
이 역역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌수 있다.
7. JDK 와 JRE 차이
1) JDK
JDK 는 자바 개발도구(java Development Kit)의 약자이다.
JDK는 JRE + 개발을 위해 필요한 도구(javac, java등)들을 포함한다.
2) JRE
JRE는 자바 실행환경(Java Runtime Environment)의 약자이다.
JRE는 JVM이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있다.
JRE는 JVM의 실행환경을 구현했다고 할 수 있다.
8. javac 옵션 (추가과제)
javac는 자바컴파일러로써, 자바코드를 작성한 소스파일(.java)을 자바 가상머신이 인식할수 있는 바이트 코드(.class) 타입으로 변환시켜주는 명령어 입니다.
옵션
-classpath
컴파일러가 컴파일 하기 위해서 필요로 하는 참조할 클래스 파일들을 찾기 위해서 컴파일시 파일 경로를 지정해주는 옵션
-directory
클래스 파일을 생성할 루트 디렉터리를 지정한다.
-encoding
소스 파일에 사용된 문자열 인코딩을 설정한다.
-g
모든 디버깅 정보를 생성한다. -g:{lines, vars, source}:
-nowarn
경고 메세지를 생성하지 않는다.
-target 자바버전
지정된 자바버전의 VM에서 작동 되어지도록 클래스 파일을 생성한다.
Reference
tcpschool.com/java/java_intro_programming
m.blog.naver.com/ki630808/221844888233
sjava.net/2008/02/javac-%EB%AA%85%EB%A0%B9%EC%96%B4%EC%9D%98-%EC%98%B5%EC%85%98-%EC%A0%95%EB%A6%AC/
'Live Study' 카테고리의 다른 글
[JAVA 스터디] 6주차 과제 : 상속 (0) | 2020.12.24 |
---|---|
[JAVA 스터디] 5주차 과제 : 클래스 (0) | 2020.12.18 |
[JAVA 스터디] 4주차 과제 : 제어문 (0) | 2020.12.05 |
[JAVA 스터디] 3주차 과제 : 자바 다양한 연산자 학습 (0) | 2020.11.28 |
[JAVA 스터디] 2주차 과제 : 자바 데이터 타입, 변수 그리고 배열 (0) | 2020.11.21 |