JAVA

[JAVA] JVM 구조

집한구석 2021. 6. 3. 23:20
728x90

JVM 정의

  • 자바 가상머신, 자바 바이트 코드를 실행하는 주체, 어떠한 운영체제에서 독립적으로 실행 가능
  • 자바 바이트 코드를 인터프리터와 JIT컴파일러를 통해 변환하여 실행함

JRE 정의

  • 자바 애플리케이션을 실행할 수 있도록 구성된 배포판
  • JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스파일을 가지고 있음

JDK 정의

  • JRE + 개발에 필요한 툴
  • 오라클은 자바 11부터 JRE를 따로 제공하지 않고 JDK만 제공함 

JVM 구성

  • Class Loader
  • Execution Engine
  • Garbage Collector
  • Runtime Data Area

Class Loader

  • 자바파일을 컴파일하면 클래스파일(바이트 코드)이 생성되고, 클래스 파일들을 엮어 Runtime Data Area로 메모리에 적재함
  • 로딩 : 클래스를 읽어오는 과정
  • 링크 : 레퍼런스를 연결하는 과정
  • 초기화 : static 값들 초기화 및 변수 저장

Execution Engine 

  • 적재된 클래스 파일들을 기계어로 변경하여 명령어 단위로 실행함
  • 인터프리터 : 바이트 코드 한줄 실행
  • JIT 컴파일러 : 인터프리터의 효율을 높히기 위해 인터프리터가 반복되는 코드를 모두 네이티이브 코드로 바꿔놓으며 그다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 사용함
  • Gabarge Collector (아래 내용 참고)

Garbage Collector

정의

  • Heap 메모리 영역에서 생성된 객체들 중에서 참조되지 않는 객체(Unreachable object)들을 회수함
  • GC의 동작시간은 일정하게 정해져 있지 않기 때무에 언제 객체를 정리할지는 알 수 없음
  • GC를 수행하는 동안 GC Thread를 제외한 다른 모든 Thread는 일시정지상태가 됨 (Full GC가 일어나는 순간 수초간 모든 Thread가 정지한다면 심각한 장애로 이어질 수 있음)
  • GC과정을 Mark and Sweep 이라고함 GC가 스택의 모든 변수 또는 Reachable 객체를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾는 과정이 Mark 이 과정에서 Stop the world가 발생하며 이후 Mark 되어있지 않은 객체들을 힙에서 제거하는 과정이 Sweep

MinorGC / Major GC

  • Heap 구성은 Young, Old, Perm 세가지로 나뉘는데, Young 영역에서 발생한 GC를 Minor GC, 나머지 두 영역에서 발생한것은 Major GC (Full GC) 

Young영역 / Old영역

  • Young 영역은 3개의 영역으로 나뉨 (Eden영역, Survivor 영역 2개)
  • Eden 영역에 최초로 객체가 만들어지고, Survivor 영역을 통해서 Old 영역으로 오래 살아남은 객체가 이동
  • Old 영역은 기본적으로 데이터가 가득 차면 GC를 실행 GC 방식에 따라서 처리 절차가 달라짐 (GC 종류 글참고 :  https://tgyun615.com/29?category=908821)

Runtime Data Area

  • JVM의 메모리 영역으로 자바 애플리케이션 실행시 사용되는 데이터를 적재하는 영역
  • 크게 5가지 영역으로 구성되어 있음 (Stack, Heap, Method, PC Register, Native Method Stack)

Method

  • JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(static 변수), 생성자와 메소드를 저장하는 공간

Heap

  • JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역
  • New 연산자로 생성된 객체 또는 객체(인스턴스)와 배열을 저장
  • 힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조

Stack

  • 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시값 등을 저장
  • 메소드 호출시 개별적으로 스택이 생성 (스택 프레임이 생성되며 쓰레드 종료하면 런타임 스택이 사라짐)

PC Register

  • 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역
  • 쓰레드마다 쓰레드내 현재 실행할 스택 프레임을 가리키는 포인터를 생성

Native Method Stack 

  • 자바외 언어로 작성된 네이티브 코드를 위한 메모리 영역

 

 

'JAVA' 카테고리의 다른 글

[JAVA] 예외(Exception)  (0) 2021.06.07
[JAVA] 싱글턴 패턴  (0) 2021.06.05
[JAVA] Enum  (0) 2021.06.02
[JAVA] GC의 종류  (0) 2021.05.23
[JAVA] 상태패턴  (0) 2021.05.21