본문 바로가기

개발지/Today I learn

[0913] 자바 가상머신 (JVM)

#JVM(Java Virtual Machine)

- JVM란?

  ▪ JVM은 자바로 작성한 소스 코드를 해석해 실행하는 별도의 프로그램이다.

  ▪ JVM은 프로그램 실행에 필요한 컴퓨터 자원을 할당받기 위하여 운영체제와 소통한다.

  ▪ JVM은 각 운영체제에 맞는 버전이 따로 존재한다.

  ▪ 각 운영체제에 따라 자바 소스 코드를 변환해 실행시키기 때문에 자바는 운영체제와 독립적으로 실행될 수 있다.

 

- JVM 구조

  ▪ 자바 코드 실행 시 컴파일러가 자바 소스 코드를 바이트 코드 파일로 변환시킨다.

  ▪ JVM은 운영 체제로부터 실행에 필요한 메모리를 할당받는다. (런타임 데이터 영역)

  ▪ 클래스 로더가 바이트 코드 파일을 JVM 내부로 불러들여 메모리 영역으로 로드시킨다.

  ▪ 로드된 바이트 코드를 실행 엔진이 인터프리터와 JIT 컴파일러를 통해 코드를 기계어로 번역하여 실행시킨다.

 

- JVM 메모리 구조 (Stack & Heap)

  ▪ JVM은 데이터 영역을 5가지 영역으로 구분하여 코드를 로드시킨다.

  ▪ 그 구조는 다음과 같다.

  ▪ Stack 메모리 영역LIFO(Last In First Out) 즉, 맨 마지막에 들어온 데이터가 가장 먼저 나가는 구조이다.

    Stack 메모리 영역에는 메서드 내부에서 사용하는 값들(참조변수, 매개변수, 지역변수 등)이 임시로 저장된다.

 

  ▪ JVM이 작동되면 Heap 영역은 자동 생성된다. Heap 영역에는 객체, 인스턴스 변수, 배열의 실제값이 저장된다.

 

  ▪ 객체를 다룰 때, Stack 메모리 영역에 있는 참조변수를 통해 Heap 영역에 존재하는 객체를 다룬다.

 

- Garbage Collection ?

  ▪ 가비지 컬렉션메모리를 자동으로 관리하는 프로세스이다.

  ▪ 가비지 컬렉션은 프로그램에서 더 이상 사용하지 않는 객체를 찾아 삭제&제거하여 메모리를 확보한다.

Sports sports = new Sport();
sport.setName("풋살");
sprot = null; // 가비지 발생
sprot = new Sprot();
sprot.setName("축구");

  ▪ 프로그램 실행 중 참조되고 있지 않은 객체 및 변수들의 차지하던 메모리 공간을 확보하는 것이다.

 

- Garbage Collection 동작 방식

  ▪ Heap 메모리 영역은 일회성 객체들이 저장되는 곳으로, 메모리가 할당되어 있는 시간이 짧은 영역이다.

  ▪ 객체의 메모리 할당 시간에 따라 Heap 영역에서도 Young / Old 영역으로 나뉜다.

  ▪ Young 영역은 새롭게 객체가 할당되는 곳으로 Minor GC가 활동한다.

  ▪ Old 영역은 Young 영역에서 상태가 유지된 객체들이 복사되는 곳이다.

    Young 영역보다 크기가 크고 가비지 발생은 적다. Major GC가 활동한다.

 

  가비지 컬렉션이 작동되는 단계는 다음과 같다.

    (1) Stop the World

        가비지 컬렉션을 실행시키기 위해 JVM이 애플리케이션의 실행을 멈춘다.

        가비지 컬렉션을 제외한 모든 스레드의 작업이 중단되고, 가비지 정리가 완료되면 재개된다.

    (2) Mark ans Sweep

        Mark는 사용되는 메모리와 사용하지 않는 메모리를 식별하는 작업이다.

        Sweep은 Mark 단계에서 식별된 사용되지 않는 메모리를 해체하는 작업이다.