[JAVA] JVM

하이초·2023년 12월 12일

JAVA

목록 보기
5/7
post-thumbnail

1️⃣ JVM?

Java Virtual Machine 자바 가상 머신으로, Java와 OS 사이에서 기능하며 Java가 OS 종속적이지 않도록 해준다.

특징

  1. 컴파일된 바이트 코드(.class)를 기계가 이해할 수 있는 기계어로 변환
  2. 스택 기반의 가상 머신
  3. 메모리 관리와 GC를 수행
  4. 네트워크 바이트 오더 - 빅 엔디안 방식을 사용

구조

Class Loader

클래스 파일을 Runtime Data Area의 메서드 영역으로 불러오는 역할

  1. Loading: 클래스 파일 JVM의 메모리에 로드
  2. Linking: 클래스 파일 검증
  3. Initialization: 클래스 변수들 적절한 값으로 초기화

jar 파일 내 저장된 클래스들을 JVM 위에 탑재한다.
클래스를 처음 참조할 때 해당 클래스를 로드하고 링크하는 역할을 한다.

Link

  • veryfying(검증): 읽어들인 클래스가 JVM 명세에 명시된 대로 구성되어 있는지 검사
  • preparing(준비): 클래스가 필요로 하는 메모리 할당
  • Resolviong(분석): 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경

Execution Engine

바이트 코드를 실행 가능하도록 해석

Interpreter, JIT Compiler, Garbage Collector

Runtime Data Area

클래스 데이터와 같은 메타 데이터와 실제 데이터가 저장되는 곳

메서드영역 참고

2️⃣ JIT Compiler

Just In Time, JIT Compiler는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일러로 동적 번역이라고도 한다. 인터프리터 방식의 단점을 보완하기 위해 도입되었다. 인터프리터는 바이트 코드를 한 줄 한 줄 해석하여 실행하지만, JIT 컴파일러는 전체를 바이너리 코드로 직접 실행한다. 따라서 JIT 컴파일러가 컴파일하는 과정은 인터프리팅하는 것보다 오래걸리므로 한 번만 실행되는 코드라면 컴파일 하지 않고 인터프리팅 하는 것이 유리하다. 따라서 수행 빈도를 체크 후 일정 수치를 넘으면 컴파일을 실행한다. 컴파일된 기계어 코드는 캐시에 보관되기 때문에 한 번 컴파일된 코드는 빠르게 수행될 수 있다.

3️⃣ Garbage Collector

42에서 c만 공부하다가 처음 java를 공부하며 가장 놀라웠고 쩌는 기능이라 생각했던 GC!

Minor GC, Major GC

대명제 객체는 대부분 일회성이며, 메모리에 오랫동안 남아있는 경우는 드물다

=> Young, Old 영역으로 나누자

Young 영역

  • 새롭게 생성된 객체가 할당되는 영역
  • 많은 객체가 다시 재참조 되는 일이 드물어 Young 영역에서 생성되었다가 사라짐
  • Young 영역에 대한 GC를 Minor GC라 한다

Old 영역

  • Young 영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
  • Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생
  • Old 영역에 대한 GC를 Major GC라 한다

수명이 짧은 객체들은 대체로 큰 공간을 필요로 하지 않으며, 큰 객체들은 Young 영역이 아니라 바로 Old 영역에 할당 된다

Card Table

  • Old 영역에 있는 객체가 Young 여역의 객체를 참조할 때 정보가 표시되는 영역
  • Young 영역에서 Minor GC가 실행될 때 모든 Old 영역에 존재하는 객체를 검사하여 참조되지 않은 객체를 식별하는 것이 아니라, 카드 테이블을 조회하여 GC의 대상인지 식별할 수 있도록 함

동작 방식

1. Stop The World

  • GC 수행을 위해서 JVM이 어플리케이션의 실행을 멈춤
  • GC가 실행될 때 GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업이 중단되었다가 GC가 끝나면 작업이 재개됨
  • GC의 성능 개선을 위해 튜닝을 하는 경우 보통 이 시간을 줄이기 위한 작업을 하는 것

2. Mark and Sweep

  • Mark: 사용되는 메모리와 사용되지 않는 메모리 식별
  • Sweep: Mark 단계에서 사용되지 않음으로 식별된 메모리 해제

Minor GC

  • Eden 영역: 새로 생성된 객체가 할당되는 영역
  • Survivor 영역: 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역

1개의 Eden 영역과 2개의 Survivor 영역으로 이루어짐

  1. 새로 생성된 객체가 Eden 영역에 할당
  2. Eden 영역이 꽉차게 되면 Minor GC가 실행
  3. Eden 영역에서 사용되지 않는 객체의 메모리 해제
  4. Eden 영역에서 살아남은 객체는 1개의 Survivor 영역으로 이동

A. Survivor 영역이 꽉차게 되면 Survivor 영역에서 살아남은 객체를 다른 Survivor 영역으로 이동 (1개의 Survivor 영역은 무조건 빈 상태)
B. 계속해서 살아남은 객체는 Old 영역으로 Promotion 됨

객체의 생존 횟수를 카운트 한 age를 Object Head에 기록

Major GC

객체들이 계속 Promotion 되어 Old 영역 메모리가 부족해지면 발생

두 영역을 모두 처리하는 GC는 Full GC라 한다.

4️⃣ JDK, JRE

JDK: Java Development Kit

  • Java를 사용하기 위해 필요한 기능을 갖춘 Java용 SDK(Software Develoment Kit)
  • JRE를 포함하고 있음
  • 컴파일러(javac: .java -> .class), jdb, javadoc 등 포함
  • 프로그램 생성, 실행, 컴파일 가능

JRE: Java Runtime Environment

  • JVM + Java Class Library 등으로 구성
  • 컴파일 된 Java 프로그램을 실행하는데 필요한 패키지
profile
개발국대가 되는 그 날까지. 지금은 개발 응애.

0개의 댓글