-
Chapter 3. Java Virtual MachineJava 2021. 7. 4. 22:36
1. JVM이란
자바 가상 머신으로 아래 2가지의 특징을 가능하게 한다.
- 자바 언어로 개발된 프로그램은 소스파일을 수정하지 않아도, JRE가 설치된 모든 OS에서 실행가능하다.
- JVM에 존재하는 Garbage Collector가 자동으로 메모리를 관리한다.
※ Java SE(Java Standard Edition)는 JRE와 JDK로 구성된다.
JRE (Java Runtime Environment)는 JVM, 라이브러리, API 등의 '실행 환경'을 포함한다.
JDK (Java Development Kit)는 JRE에 추가적으로 컴파일러를 포함한다.
이미 개발된 프로그램만 실행시킬목적이라면 JRE를 설치하면 되고, 프로그램을 개발할려면 JDK를 설치하면된다.
2. 이식성
- '자바 파일'을 컴파일하여 '클래스 파일'을 생성한다.
- OS에 '종속'적인 JVM에 '클래스' 파일을 각종 필요한 라이브러리를 더하여 실행시켜 OS에 맞는 기계어를 만든다.
- 즉, OS에 맞는 JVM이 설치된 환경이라면 어떠한 자바 코드더라도 크로스 컴파일 할 필요 없이 수정 없이 자바 파일을 실행시킬 수 있다. 만약 C++와 같은 코드는 윈도우에서 개발했고 MAC OS 환경에서 실행시키고 싶다면 타겟 OS에 맞는 '크로스 컴파일'을 수행해야한다.
3. Garbage Collection
자바는 개발자가 메모리에 접근하여 값을 할당/해제하지 않고 JVM에 존재하는 garbage collection이 메모리를 관리한다. 즉, 실행 중 값이 할당/해제 하는 Heap 영역에서 안쓰이는 값들을 적절히 제거한다.
여기서 값이 쓰이고/ 안쓰이고의 차이를 구별하는 방법은 다음과 같다. 멤버 변수가 할당되는 Method, 지역 변수가 할당되는 Stack 영역을 Root로 하여 DFS/BFS하여 참조되는 값들이 reachability한지 unreachability한지를 판단한다. 이후 unreachability한 값들을 해제한다.
Heap 영역은 크게 'Young Generation'과 'Old Generation'으로 구성된다. 보통 크기는 'Old Generation'이 크며 garbage collection이 일어나는 횟수는 'Young Generation'에서 더욱 빈번하게 일어난다. 왜냐하면 실험적으로 측정한 결과 대부분의 참조 객체들은 처음 생성 후 금방 값을 사용하지 않으며 오래된 변수일수록 garbage collection이 일어나도 값이 해제가 되지 않음을 확인했기 때문이다.
Young Generation에서 GC가 일어나는 것을 Minor GC이다. 반면 Old Generation에서 GC가 일어나는 것은 Major GC이다. 이때 GC는 unreachability한것들을 제거하는것을 의미한다.
아래 사진은 Heap 영역의 구조이며 아래의 순서로 GC가 일어난다.
- 먼저 eden영역부터 차곡차곡 객체가 생성될때마다 할당된다.
- eden 영역이 꽉차면 GC가 일어나며 S0에 reachability한 것들을 두고 age를 1로 설정한다.
- 다시 eden 영역부터 차곡차곡 할당하다 eden 영역이 꽉차면 S1에 reachability한 객체들을 age로 1로 설정하고 기존에 S0에 있던 값들을 '+1'하여 S1으로 이동한다.
- 이렇게 'S0', 'S1'에 번걸아 할당하며 age값이 증가하고 특정 age 값에 도달하면 해당 값들을 'Old Generation'으로 이동한다.
- 이러한 작업을 빈번하게 일어나다보면 Old Generation이 꽉차고 이때 'Major GC'가 실행된다.
'Java' 카테고리의 다른 글
Chapter 2. Java Memory & Variable Type (0) 2021.07.04 Chapter 1. Object Oriented Programming (0) 2021.07.04 기본기 (0) 2020.08.26