[JAVA] JVM의 구조 및 행동

SJ.CHO·2024년 8월 21일

CS공부용 용어정리

목록 보기
2/5
post-thumbnail

JVM 이란?

  • Java Virtual Machine의 약자로 자바와 OS간의 중개자 역할을 하며, JAVA 언어가 OS에 구애받지않고 프로그램을 실행할수 있도록 도와줌.
  • GC를 통해 메모리관리를 개발자가 직접 하지않더라도 자동으로 수행해줌.
  • STACK 기반의 가상 머신

자바프로그램 실행과정

  1. 프로그램 실행시 JVM은 OS로 부터 프로그램이 필요한 메모리를 할당 받아 용도에 맞춰 영역을 나누어 관리한다.
  2. 자바 컴파일러(JAVAC) 가 자바 소스코드(.java)를 읽어들여 자바 바이트 코드(.class)파일로 변환시킨다
  3. class loader를 통해 class 파일들을 JVM으로 로딩한다.
  4. 로딩된 class 파일들을 Execution engine을 통해 해석한다.
  5. 해석된 바이트코드는 Runtime Data Areas 에 배치되어 실질적인 수행이 이루어진다.

JVM 구성

  • Class Loader : JVM 내로 Class 파일의 바이트코드를 읽어 런타임 데이터 영역으로 가져온다. 런타임시 동적으로 클래스를 로드한다. 사용하지않는 클래스들을 메모리에서 삭제한다.
    클래스를 처음으로 참조할때, 클래스를 로드하고 링크.

  • Execution Engine : 클래스로더가 배치한 클래스를 실행시키는 역할. 바이트코드를 기계가 실행할 수 있는 형태로 변환시킨다.

    • Interpreter : 바이트코드를 명령어단위로 읽어서 실행한다. 한줄씩 수행하기에 속도가 느리다.
    • JIT(Just - In - Time) : 인터프리터의 단점을 보완하기 위해 나온 방법. 실행중 적절한 시점에 바이트코드를 네이티브코드로 컴파일 후 직접실행하는 방식.
      네이티브코드는 캐시메모리에 보관되기에 한번 컴파일시 빠르게 수행된다. 하지만 컴파일하는 과정이 인터프리터보다 오래걸리므로 내부적 수행횟수에 따라 컴파일을 수행한다.

Runtime Data Area

  • PC Register : Thread가 시작될때마다 생성되며 스레드마다 1개씩 존재. Thread가 어느부분에서 어떤 명령을 실행해야할지에 대한 기록을 한다. 현재수행중인 JVM의 명령의 주소(위치)를 가짐.(멀티쓰레드 환경에서 다시 돌아갈위치를 가져야하기때문)

  • JVM Stack : 메서드연산에 필요한 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값을 저장한다 해당 메서드연산이 종료될시 삭제된다.

  • Native method stack : JAVA언어가 아닌 다른언어로 작성된 코드를 위한 공간

  • Method Area (= Class area = Static area) : 클래스정보를 메모리공간에 올릴때 초기화되는 대상을 저장하기 위한 메모리공간. 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관.
    Runtime Constant Pool이라는 별도의 관리 영역도 함께 존재한다. 이는 상수 자료형을 저장하여 참조하고 중복을 막는 역할을 수행한다.

  • Heap : 객체를 저장하는 가상메모리 공간. new연산자로 생성된 객체, 배열을 저장한다.
    class 영역에 있는 클래스들의 객체만 생성할수 있다.

Garbage Collection

  • Minor GC : 새로생성된 대부분의 객체는 Eden영역에 위치한다. Eden영역에서 GC가 발생후 살아남은 객체는 Survivor 영역중 한곳으로 이동된다. 해당과정을 계속 반복하며 살아남은 객체는 Old영역으로 이동된다.

하나의 Survivor 영역이 가득 차게 되면 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동한다. 그리고 가득 찬 Survivor 영역은 아무 데이터도 없는 상태로 된다.

  • Major GC : Old 영역에잇는 '모든' 객체를 검사하여 참조되지않은 객체들은 한꺼번에 삭제한다.
    시간이 오래걸리며, 실행중 프로세스가 정지된다.(Stop-the-world) GC를 실행하는 스레드 제외 모든 스레드가 작업을 멈춘다. (성능이슈 원인중 하나)

  • Permanent Generation 영역은 Method Area라고도 한다. 객체나 억류(intern)된 문자열 정보를 저장하는 곳이며, Old 영역에서 살아남은 객체가 영원히 남아 있는 곳은 절대 아니다. 이 영역에서 GC가 발생할 수도 있는데, 여기서 GC가 발생해도 Major GC의 횟수에 포함된다.

profile
70살까지 개발하고싶은 개발자

0개의 댓글