[Java] JVM이란

JVM (Java Virtual Machine)

자바 가상머신으로 자바 바이트 코드를 OS에 맞게 특화된 코드로 변환하여 실행해 준다.
JVM의 구성 요소

  • 클래스 로더
  • 메모리 영역
  • 실행 엔진
  • JNI(Java Native method Interface) + JNL (Java Native method Library)

 

클래스 로더

  • 로딩 : 클래스 파일에서 바이트 코드를 읽어오는 과정
  • 링크 : 레퍼런스 연결 과정
  • 초기화 : 클래스에 있는 static 값들 초기화

 
클래스 로더의 종류

  • 부트스트랩 클래스로더 : JAVA_HOME/lib에 있는 코어 자바 API를 제공, 최상위 클래스 로더 
  • 플랫폼 클래스로더 : JAVA_HOME/lib/ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다.
  • 애플리케이션 클래스로더 : 애플리케이션 클래스패스(애플리케이션 실행할 때 주는 -classpath 옵션 또는 java.class.path 환경 변수 값에 해당하는 위치)에서 클래스를 읽는다. (개발자가 작성한 코드들은 대부분 애플리케이션 클래스 로더가 읽는다.)

 

로딩

.class 파일을 읽어서 적절한 바이너리 데이터를 만들어서 메서드 영역에 클래스 정보(풀패키지 경로가 포함된 클래스 이름, 인터페이스, ENUM, 메서드, 변수들)를 저장하고, 로딩이 끝나면 해당 클래스 타입의 클래스 객체를 생성하여 힙 영역에 저장한다.
 

링크

Verify -> Prepare -> Resolve(optional) 순서로 진행된다.

  • Verify : .class 파일의 형식이 유효한지 체크한다.
  • Prepare : 메모리 준비 과정, 클래스에 있는 스태틱한 값과 기본값에 필요한 메모리를 준비하는 과정이다.
  • Resolve(optional) : 심볼릭 레퍼런스를 실제 레퍼런스로 교체하는 과정, 링크 과정에서 나타날 수도 있고, 실제 레퍼런스를 사용할 때 나타날 수도 있다.

 

초기화

준비한 메모리 영역에 값을 할당한다. (static한 변수의 값들을 할당)
 

메모리 영역

메모리 영역은 스택, 네이티브 메서드 스택, PC 레지스터, 메서드 영역, 힙영역으로 구성되어 있다.

  • 메서드 영역 : 클래스 수준의 정보, 클래스 이름(풀패키지 경로포함), 부모 클래스 이름(상속받을 클래스가 있다면, Object), 스태틱 변수, 메서드들이 저장되는 메모리 영역이다. 공유가 가능하다.
  • 힙 영역 : 실제 인스턴스(객체)들을 저장, 클래스 객체는 로딩만 해도 저장된다. 명시적으로 생성된 객체들이 저장되는 공간, 공유가 가능하다.
  • 스택 : 스레드마다 런타임 스택 생성하고 안에다가 스택 프레임(메서드콜)을 쌓는다.
  • PC(Program Counter) 레지스터 : 스레드마다 스레드 내 현재 실행할 스택 프레임을 가리키는 포인터
  • 네이티브 메서드 스택 : 네이티브 메서드를 호출할 때 쌓이는 스택
네이티브 메서드란 : 자바로 구현한 것이 아닌 C나 C++로 구현된 메서드, native 키워드가 붙어 있다.

 
스택, PC (PC registers) , 네이티브 메서드 스택 등은 각각의 스레드 안에 국한된다. 각 스레드 안에서만 공유자원, 힙과 메서드처럼 다른 모든 영역에 공유하는 자원이 아니다.
 

실행 엔진 

인터프리터와 JIT 컴파일러 그리고 GC(Garbage Collector)로 구성되어 있다.

  • 인터프리터 : 자바 바이트 코드를 한 줄씩 기계가 이해할 수 있게끔 네이티브 코드로 변환 후 실행한다.
  • JIT 컴파일러 : 반복적인 바이트 코드를 찾아서 모두 네이티브 코드로 변경해 준다. 인터프리터가 비효율적으로 실행되지 않기 위함
  • GC : 메모리의 최적화를 위해 더 이상 참조되지 않고 있는 객체를 찾아서 정리한다.

 
GC는 상황에 따라 커스터마이징(옵션 조정)을 하기도 해야 해서 좀 더 깊게 알 필요가 있다.
 
더 자바, 코드를 조작하는 다양한 방법

더 자바, 코드를 조작하는 다양한 방법 - 인프런 | 강의

여러분이 사용하고 있는 많은 자바 라이브러리와 프레임워크가 "어떻게" 이런 기능을 제공할 지 궁금한적 있으신가요? 이번 강좌를 통해 자바가 제공하는 다양한 코드 또는 객체를 조작하는 방

www.inflearn.com