1. JVM이란 무엇인가
2. 바이트코드란 무엇인가
3. JIT 컴파일러란 무엇이며 어떻게 동작하는지
4. JVM 구성 요소
5. JDK와 JRE의 차이
6. 프리미티브 타입 종류와 값의 범위 그리고 기본 값
7. 프리미티브 타입과 레퍼런스 타입
8. 1차 및 2차 배열 선언시 자바에선 어떤일이 벌어지는지(영역, 포인터, 주소 등)
1. JVM
- JVM : Java Virtual Machine, 자바 가상 머신, 자바를 실행하기 위한 가상 기계
- (가상 기계 : 소프트웨어로 구현된 하드웨어)
- Java와 OS 사이에서 중개자 역할로, Java가 OS에 구애 받지 않고 독립적으로 작동할 수 있도록 한다.
- 자바 바이트 코드를 실행할 수 있는 환경을 제공한다.
- C/C++ 언어에서는 컴파일 플랫폼과 타겟 플랫폼이 다를 경우 프로그램이 동작하지 않는다.
- test.c 파일을 윈도우 컴파일러로 컴파일 하면 윈도우에서만 실행되는 test.exe 파일이 생성된다.
- Java의 경우 test.class 파일이 생성된다.
- 이렇게 생성된 바이트 코드는 각 플랫폼에 설치되어 있는 JVM이 운영체제에 맞는 실행파일로 변환한다.
2. Byte Code
- JVM이 이해할 수 있는 언어로 변환된 자바 소스 코드다.
- 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불린다.
- 자바 바이트 코드의 확장자는 .class다.
- C/C++ 과는 다르게 Java는 JVM이 다른 모듈을 통해서 생성하고 실행한다. 이 부분에서 조금 느린 성능을 낸다.
자바 파일(.java)을 컴파일 하여 바이트코드 파일(.class)을 생성한다.JVM의 내에 있는 자바 인터프리터를 통해 바이트코드를 특정 환경의 기계어로 번역하고 실행한다.
3. JIT 컴파일러
- Just-In-Time
- 자바 코드를 실행하기 위해 바이트 코드로 컴파일 하는 과정과 바이트코드를 인터프리트하는 과정을 거치며 생기는 성능 문제를 개선하기 위해 사용되는 컴파일러다.
- 실행 중에 컴파일을 하는 동적 컴파일러다.
- 기계어로 변환된 코드를 캐시에 저장시켜 재사용 시 컴파일을 다시 하지 않아 좋은 성능을 낸다.
- 모든 코드들을 캐시하는 것은 아니고, JVM 내에서 자주 수행되는 코드들을 선별하여 캐시 공간에 넣어둔다.
4. JVM 구성 요소
Class Loader
- 자바 파일을 컴파일 하여 생성된 바이트 코드 파일을 엮어, JVM이 운영체제로부터 할당받은 메모리(Runtime Data Area)에 Loarder 한다.
Execution Engine
- Class Loader에 의해 메모리에 Load된 바이트코드 파일을 기계어로 변경해 명령어 단위로 실행한다.
- Interpreter 방식과 JIT 방식이 존재한다.
- 인터프리터 방식을 사용하다 일정 기준이 넘어가면 JIT 컴파일 방식을 사용한다.
Garbage Colletor
- Heap 메모리 영역에 생성된 객체들 중 참조가 끊긴 객체들을 찾아 제거한다.
Runtime Data Area
- 운영체제로부터 할당받은 메모리 공간이다.
- PC Register : 스레드가 생성될 때마다 생성되는 영역으로 현재 스레드가 실행되는 부분의 주소와 명령어를 저장한다.
- JVM stack : 지역 변수, 파라미터, 리턴 값 등 연산에 사용되는 임시 값들이 생성되는 영역이다.
- Heap : new Test() 등의 생성된 객체와 배열이 있는 영역이다. GC가 참조가 끊긴 객체를 제거한다.
- Test test = new Test();의 코드에서 test는 스택에 있지만, new Test()는 Heap에 저장된다.
- Method Area : 인스턴스 생성을 위해 필요한 정보(필드, 메서드 생성자 등)를 적재한다. Type 데이터들을 가지며, 각각의 Type 데이터는 Runtime Constant Pool을 가진다. 상수 풀에는 해당 Type의 메소드, 필드, 문자열 상수 등의 레퍼런스를 가진다. 실제 물리 메모리 위치를 참조한다.
- Native Method Stack : JVM은 네이티브 방식을 지원한다. 일반적인 메소드 실행 시 JVM 스택에 쌓이다가 해당 메소드 내부에 네이티브 방식을 사용하는 메소드(C언어로 작성된 메소드)가 있다면 해당 메소드는 네이티브 스택에 쌓인다.
5. JDK와 JRE의 차이
- JRE : Java Runtime Environment 자바 실행 환경 : 자바로 만들어진 프로그램을 실행시키는데 필요한 라이브러리들과 각종 API, JVM이 포함되어 있다. "JRE로 개발은 불가능하고, 실행만 가능하다.
- JDK : Java Development Kit 자바 개발 키트 : 자바로 개발하는 데 사용된다. 개발에 필요한 라이브러리들과 개발 도구들을 포함하고 실행을 위한 JRE도 포함하고 있다.
Java로 프로그램을 개발하려면 JDK가 필요하고, Java로 만들어진 프로그램을 실행시키기 위해 JRE가 필요하다.
1주차의 6~8 내용은 이후 블로그에 존재한다.
'Programming > JAVA' 카테고리의 다른 글
Te JAVA (2) - JUnit5 (0) | 2023.10.02 |
---|---|
Te JAVA (2) - Java 13. switch 연산자 (0) | 2023.10.01 |
Te JAVA (2) - 삼항 연산자 (0) | 2023.10.01 |
Te JAVA (2) - 람다 (lambda) (0) | 2023.10.01 |
Te JAVA (1) - Primitive Type (0) | 2023.10.01 |