자바 가상 머신(Java Virtual Machine)

귀찮Lee·2022년 5월 25일
0

Java

목록 보기
14/15

◎ JVM(Java Virtual Machine)

  • Java 탄생 배경

    • C++은 C언어를 기반으로 한 유명한 객체지향 프로그래밍 언어이다.
    • 하지만 C++은 운영체제로부터 독립적이지 못하다 (특정 OS에서만 작동이 가능했다.)
    • 이러한 문제를 해결하고자 만든 것이 Java이다.
      • 객체지향 프로그래밍이 가능하면서도, 운영체제로부터 독립적
  • JVM(Java Virtual Machine)

    • 자바로 작성한 소스 코드를 해석해 실행하는 별도의 프로그램 (자바 프로그램을 실행시키는 도구)
    • 프로그램 실행과정
      • 프로그램이 자신이 필요한 컴퓨터 자원을 운영체제에게 주문
      • CPU, 메모리, 각종 입출력 장치 등과 같은 컴퓨터 자원을 프로그램이 할당받음
    • 자원 요청 방식
      • 프로그램이 운영체제에게 필요한 컴퓨터 자원을 요청하는 방식이 운영체제마다 다름 (운영체제에 대해 종속성을 가짐)
      • 자바는 JVM을 매개해서 운영체제와 소통 (OS마다 버전이 다름)
        -> 자바가 운영체제로부터 독립적

◎ JVM 구조

  • JVM 구성 목적 : 극한의 효율을 위해
  • java 파일 실행시, 동작 방식 (간략 ver.)
    • 자바 소스 코드를 작성하고 빌드시, JAVA 컴파일러가 실행
    • 컴파일 완료시, 클래스 파일(.class) 생성
    • 클래스 로더가 클래스 파일을 불러들이면서 JVM이 동작
    • 이후, Runtime Data Area에 데이터가 들어가게 되며 프로그램이 실행

◎ Runtime Data Area

  • JVM 메모리 구조

    • Runtime Data Area : JVM에 Java 프로그램이 로드되어 실행될때 정보를 담는 메모리 영역
    • Method, Heap, Stack, PC register, Native Method Stack으로 구성
  • Stack 영역

    • Stack : “Last In First Out”, 마지막에 들어간 데이터가 가장 먼저 나오는 일종의 자료구조
    • 역할
      • 메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성, 메서드 안에서 사용되는 값들을 저장
      • 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장 (메서드가 종료될 때까지 저장)
    • 작동 방식
      • 메서드가 호출되면 그 메서드를 위한 공간인 Method Frame이 생성
      • 메서드 내부에서 사용하는 다양한 값들 (참조변수, 매개변수, 지역변수, 리턴값 및 연산시 일어나는 값)들을 임시로 저장
      • Method Frame이 Stack에 호출되는 순서대로 쌓고, Method의 동작이 완료되면 역순으로 제거
  • Heap 영역

    • new 키워드로 생성된 인스턴스(객체와 배열)가 생성되는 영역
    • JVM에는 단 하나의 Heap 영역이 존재, JVM이 작동되면 이 영역은 자동 생성
    • 객체는 대부분 일회성이며, 메모리에 남아 있는 기간이 대부분 짧다는 전제로 설계
    • 작동 방식
      Person person = new Person();
      • new Person()이 실행시, Heap 영역에 인스턴스가 생성
      • 인스턴스가 생성된 위치의 주소값을 Stack 영역에 선언된 person에게 할당
      • 결과적으로 객체를 다룬다는 것은 Stack 영역에 저장되어 있는 참조 변수를 통해 Heap 영역에 존재하는 객체를 다룬다는 것이다.
  • 그 외

    • Method area : 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관
    • PC Register : 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분
    • Native method Stack : 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역
    • Runtime constant pool
      • String을 리터럴로 선언할 때 해당 객체를 저장
      • 같은 것을 리터럴로 만들면, 같은 주소를 가르킴

◎ Garbage Collection (GC)

  • 프로그램에서 더이상 사용하지 않는 객체를 찾아 삭제하거나 제거하여 메모리를 확보하는 일

  • 아무한테도 참조되고 있지 않은 객체 및 변수들을 검색하여 메모리에서 점유를 해제하여 메모리 공간을 확보함으로써 효율적으로 메모리를 사용할 수 있게 해준다.

  • Garbage Collection 종류

    • Heap 영역은 객체는 대부분 일회성이며, 메모리에 남아 있는 기간이 대부분 짧다는 전제로 설계
    • Young 영역: 새롭게 생성된 객체가 할당되는 곳이고 여기에는 많은 객체가 생성되었다 사라지는 것을 반복
    • Old 영역 : Young영역에서 상태를 유지하고 살아남은 객체들이 복사되는 곳 (Young 영역보다 크게 할당되고 가비지는 적게 발생)
    • Minor GC : Young 영역에서 활동하는 가비지 컬렉터
    • Major GC : Old 영역에서 활동하는 가비지 컬렉터
  • 실행 방식

    • Young 영역과 Old 영역은 서로 다른 메모리 구조로 되어 있기 때문에, 세부적인 동작 방식은 다르지만 기본적인 것은 아래와 같음

    • step1. Stop The World

      • 가비지 컬렉션을 실행시키기 위해 JVM이 애플리케이션의 실행을 멈추는 작업
      • GC 실행시, 가비지 컬렉션을 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업은 중단되고, 가비지 정리가 완료되면 재개
    • step2. Mark and Sweep

      • Mark : 사용되는 메모리와 사용하지 않는 메모리를 식별하는 작업
      • Sweep : Mark단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글