JVM의 특징, 구조, 실행과정

Kim Sung Kyu·2021년 5월 26일
0

Java☕

목록 보기
1/1
post-thumbnail

JVM이란?

Write Once, Run Anywhere

JVM은 Java 가상머신으로서 Java 애플리케이션을 클래스 로더를 통해 읽어들여 Java API와 함께 실행시키는 역할을 한다. JVM의 두가지 중요한 특징이자 역할은 다음과 같다.

  1. Java와 OS 사이에서 중재자 역할을 수행하며 CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.

  2. 프로그램 메모리를 관리하고 최적화한다.

가상머신이란?
가상 머신(Virtual Machine, VM)은 물리적 하드웨어 시스템에 구축되어 자체 CPU, 메모리, 네트워크 인터페이스 및 스토리지를 갖추고 작동하는 가상 컴퓨터 시스템이다.


Java 프로그램 실행과정

  1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받는다. (JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.)

  2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트코드(.class)로 변환시킨다.

  3. Class Loader를 통해 class파일들을 JVM으로 로딩한다.

  4. 로딩된 class파일들은 Execution engine을 통해 해석된다.

  5. 해석된 바이트코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어지게 된다.

  6. 실행과정 속에서 JVM은 필요에 따라 Thread Synchronization과 GC같은 관리작업을 수행한다.

JVM 구조


1) 클래스 로더 시스템
바이트 코드를 읽어오며 메모리에 적절히 배치하는 역할

  • 로딩
    • .class 를 읽어옴
  • 링크
    • 코드 내부의 레퍼런스를 연결함
  • 초기화
    • 클래스에 있는 static 값들을 초기화 함

2) 메모리
(힙, 메소드)는 전체 공유자원으로 분류되고, (스택, PC, 네이티브 메소드 스택)은 쓰레드 단위의 자원으로 분류된다

  • 메소드
    • 클래스 수준의 정보를 저장
    • 클래스 이름, 부모 클래스 이름, 메소드, 변수 등
    • static 변수, 일반 변수 등
    • 객체(인스턴스) 수준의 정보를 저장
  • 스택
    • 인스턴스 및 지역 변수의 참조 주소 들을 저장.
    • 쓰레드마다 런타임 스택을 만들고, 스택 프레임(메소드 call)을 쌓음
    • 에러 났을 때, 에러 메시지보면, 런타임 스택에 메시지 쌓여있는걸 확인할 수 있음
  • PC
    • 쓰레드마다 가지고 있는 Program Counter
    • 현재 실행할 부분을 가르키고 있다
  • 네이티브 메소드 스택
    • 네이티브(native) 메소드 호출할 때 사용하는 별도의 스택
    • 네이티브 메소드는 java 가 아닌 c와 같은 언어(low-level) 로 구현된 메소드

3) 실행 엔진

  • 인터프리터
    • 바이트 코드를 한줄씩 읽어 네이티브 코드로 변환
  • JIT (Just In Time) 컴파일러
    • 바이트 코드에서 반복되는 코드 부분은 JIT 컴파일러가 미리 네이티브 코드로 변환 시켜놓음
    • 반복되는 코드가 읽힐 순서가 왔을 때, 인터프리터로 읽지 않고 바로 네이티브 코드를 바로 사용
    • 인터프리터 읽을 때의 속도 효율성을 JIT 컴파일러가 보완하는 형태
  • GC (Garbage Collector)
    - 더 이상 참조되지 않는 객체를 모아서 메모리 정리
    - 경우에 따라 성능 효율을 위해 커스터마이징을 해야함




참고

profile
꿈꾸던 내가 될꺼야😃

0개의 댓글