JVM이란 무엇인가
사람들이 사용하는 운영체재는 여러 가지가 존재합니다. 대표적으로 윈도우, 맥OS, 리눅스 등이 있죠. JAVA로 간단한 프로그램을 작성했다고 생각해봅시다. 운영체재마다 똑같은 결과물로 실행이 될 수 있을까요? 아닙니다. 운영체재마다 실행되는 방식이 다르기에 하나의 프로그램이라도 각각 코드를 작성해야 합니다. 이런 문제 때문에 나온 게 JVM (Java Virtual Marchine) 입니다. JVM 는 운영체재와 Java 의 중계역할을 해주니, 각각의 운영체재에서 같은 결과물을 얻게 됩니다(자바의 독립성). 대신 JVM 는 각 운영체재마다 다르게 존재하는 것만 염두해주시면 됩니다.
컴파일하는 방법
- JAVA 프로그램을 작성합니다.
- 저장된 JAVA 경로로 이동합니다 HelloWorld.java 파일만 존재합니다.
- 터미널로 해당 경로로 찾아가서 javac HelloWorld.java 명령합니다
실행하는 방법
1. 상위 src 폴더로 이동합니다
2. java 패키지명.파일명 명령을 실행합니다
*백기선 선생님의 Tip
- java 상위버전으로 컴파일한 경우 하위 버전에서는 실행할 수가 없습니다. 반대로 하위 버전에서 컴파일하면 상위 버전에서 실행이 가능합니다. (추후에 시도해보겠습니다)
바이트코드란 무엇인가
.java 파일을 컴파일되어 나온 .class 파일이 바이트코드입니다.
.class 파일은 JVM 가 읽을 수 있도록 0과 1로 이뤄진 2진법으로 1byte 라 바이트코드라 부릅니다.
JIT 컴파일러란 무엇이며 어떻게 동작하는지
Just-In-Time 컴파일러란 JVM 에 포함되어있으며, 바이트코드를 기계어로 번역하여 전달해주는 역할을 합니다.
위에서 컴파일된 .class 파일을 실행하면 JIT 컴파일러는 실시간으로 바이트코드를 해당 운영체재에 맞는 기계어로 번역하여 전달해줍니다. 운영체재는 번역된 기계어로 프로그램을 실행하게 됩니다.
JVM 구성 요소
- 클래스 로더 시스템
: .class 에서 바이트코드를 읽고 메모리에 저장함
1) 로딩 : 말그대로 클래스를 읽어오는 과정
2) 링크 : 레퍼런스를 연결하는 과정 (import 경로)
3) 초기화 : static 값들 초기화 및 변수에 할당
- 메모리
[전역 공유]
1) 메소드 : 클래스 수준의 정보 (이름, 부모 이름, 메소드, 변수) 저장, 공유
2) 힙 : 객체(인스턴스 혹은 .class)를 저장, 공유
[쓰레드 공유]
3) 스택 : 쓰레드마다 런타임 스택을 생성하고 그 안에 메소드 호출을 블럭으로 쌓는다. 쓰레드 종료 시 쌓인 스택도 사라진다. (디버깅, error 발생 시 보이는 메소드 실행내역)
4) PC 레지스터 : 쓰레드 마다 쓰레드 내 현재 실행할 instruction의 위치를 가리키는 포인터가 생성된다.
5) 네이티브 메소드 스택 : native 키워드가 붙은 메서드가 저장되는 영역
* 스택, PC레지스터, 네이티브 메소드 스택은 특정 쓰레드에만 국한되어 있다.
- 실행엔진
1) 인터프리터 : 바이트코드를 한 줄씩 실행
2) JIT 컴파일러 : 인터프리터의 효율을 높이기 위해, 인터프리터로 반복되는 코드가 발견되면 JIT 컴파일러로 반복되는 코드를 모두 해당 운영체재에 맞는 기계어(네이티브 코드)로 변환시켜준다. 기계어로 변환된 코드는 인터프리터가 곧바로 사용한다.
3) GC(Garbage Collector) : 더 이상 참조되지 않는 객체를 모아서 정리한다.
- JIN(Java Native Interface) & 네이티브 메서드 라이브러리
1) Java 가 아닌 C, C++ 로 작성된 native 메서드
7. JDK와 JRE의 차이
- JDK (Java Development Kit ) : 프로그램 개발에 필요한 자바 가상 기계 (JVM), 라이브러리 API, 컴파일러 등이 포함,
- JRE (Java Runtime Environment) : 프로그램 실행에 필요한 자바 가상 기계 (JVM), 라이브러리 API 만 포함으로 개발된 프로그램 실행에 사용됩니다.
참고
- 기초부터 실무 응용까지 자바 마스터북, 제이펍
- 이것이 자바다 신용권의 Java 프로그래밍 정복1, 한빛미디어
- 더 자바, 코드를 조작하는 다양한 방법 www.inflearn.com/course/the-java-code-manipulation/dashboard
'개발 & 방법론 > Java' 카테고리의 다른 글
5주차 : 클래스(Class) (0) | 2020.12.21 |
---|---|
4주차 : 제어문 (0) | 2020.12.12 |
3주차 과제 : 연산자 (0) | 2020.11.27 |
2주차 과제: 자바 데이터 타입, 변수 그리고 배열 (0) | 2020.11.19 |
자바 스터디 같이 할래? (0) | 2020.11.17 |