JVM의 구조와 자바의 실행

gojung·2021년 11월 15일
0

CS

목록 보기
2/4

JVM(Java Virtual Machine)

  1. 자바와 운영체제 사이에서 중개자 역할을 수행함으로써 자바가 OS에 의존적이지 않고 독립적으로 프로그램을 실행할 수 있도록 한다.
  2. 가비지컬렉터메모리 관리를 자동으로 수행
  3. ARM 같은 다른 하드웨어와는 다르게 레지스터 기반이 아닌 스택 기반

자바의 실행

  1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받는다.
    JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
  2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트코드(.class)로 변환시킨다.
  3. Class Loader를 통해 class파일들을 JVM으로 로딩한다.
  4. 로딩된 class파일들은 Execution engine을 통해 해석된다.
  5. 해석된 바이트코드는 Runtime Data Areas 에 배치되어 실질적인 수행이 이루어지게 된다.
    이러한 실행과정 속에서 JVM은 필요에 따라 Thread Synchronization과 GC같은 관리작업을 수행한다.

Class Loader

  • JVM 내의 Runtime area에 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
  • 런타임 시에 동적으로 클래스를 로드

Execution Engine

  • 클래스 로더를 통해 JVM 내부로 넘어와 Runtime Data Area에 배치된 바이트 코드들을 명렁어 단위로 읽어서 실행

최초 JVM이 나왔을 당시에는 인터프리터 방식이었기때문에 속도가 느리다는 단점이 있었지만 JIT 컴파일러 방식을 통해 이 점을 보완하였습니다. JIT는 바이트 코드를 어셈블러 같은 네이티브 코드로 바꿈으로써 실행이 빠르지만 역시 변환하는데 비용이 발생하였습니다. 이 같은 이유로 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행합니다.

Garbage Collector

  • 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않거나 null인 객체들을 탐색 후 제거해서 메모리 반납
  • GC가 언제 실행되는지는 알 수 없음

Runtime Data Area

  • 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 JVM의 메모리 영역
  • 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있음

1.Method Area(=Class Area = Static Area)

  • 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간
  • 모든 쓰레드가 공유하는 메모리 영역
  • 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관
  • 이 공간에는 Runtime Constant Pool이라는 별도의 관리 영역이 존재하는데, 이 공간은 상수 자료형을 저장해 참조하고 중복을 막는 역할을 한다.
  1. PC Register
  • 쓰레드가 시작될 때 생성되며, 쓰레드마다 하나씩 존재
  • 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분
  • 현재 수행중인 JVM 명령의 주소를 가짐
  1. Stack Area
  • 메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)을 생성
  • 메서드 안에서 사용되는 값들과 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장
  • 메서드 수행이 끝나면 프레임별로 삭제
  1. Heap area
  • 모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역
  • method area에 로드된 클래스만 생성이 가능
  • Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역

Heap Area

인스턴스의 소멸방법과 소멸시점은 지역 변수와는 다르기 때문에 힙이라는 별도의 영역에 할당된다. JVM에서는 더 이상 인스턴스의 존재 이유가 없을 때 해당 인스턴스를 소멸시킨다.

Permanent Generation

생성된 객체들의 정보의 주소값이 저장된 공간이다. Class loader에 의해 load되는 Class, Method 등에 대한 Meta 정보가 저장되는 영역이고 JVM에 의해 사용된다. Reflection을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다. 내부적으로 Reflection 기능을 자주 사용하는 Spring Framework를 이용할 경우 이영역에 대한 고려가 필요하다.

New/Young 영역

  • Eden : 객체들이 최초로 생성되는 공간
  • Survivor 0 / 1 : Eden에서 참조되는 객체들이 저장되는 공간

Old 영역

New area에서 일정 시간 참조되고 있는, 살아남은 객체들이 저장되는 공간 Eden영역에 객체가 가득차게 되면 첫번째 GC(minor GC)가 발생한다. Eden영역에 있는 값들을 Survivor 1 영역에 복사하고 이 영역을 제외한 나머지 영역의 객체를 삭제한다.

0개의 댓글