programmingu

자바 가상 머신(Java Virtual Machine) 본문

Computer Science/자바

자바 가상 머신(Java Virtual Machine)

예진잉구 2022. 1. 10. 22:58

JVM 이란?


정의

  • 기술적 정의: 코드를 실행하고 해당 코드에 해대 런타임 환경을 제공하는 소프트웨어 프로그램에 대한 사양
  • 일반적 정의: 자바를 실행하는 방법. JVM의 설정을 구성한 다음 설정 사항에 따라 실행 중에 프로그램 리소스를 관리
  • 역할: 자바 애플리케이션을 클래스 로더를 통해 읽어들여 자바 API와 함께 실행하는 것.
  • JVM은 스택 기반의 가상머신 (cf: ARM 아키텍쳐같은 하드웨어는 레지스터 기반으로 동작)
  • 만약, 자바 소스 파일은 리눅스에서 만들었고 윈도우에서 이 파일을 실행하고 싶다면, 윈도우용 JVM을 설치만 하면 된다. 여기서 JVM은 운영체제에 종속적이라는 특징을 알 수 있습니다.

기본 기능

  1. 자바 프로그램이 어느 기기나 운영체제 상에서도 실행될 수 있도록 한다. = 이식 가능한 실행 환경 = Java와 OS 사이에서 중개자 역할을 수행. Java가 OS에 구애받지 않고 재사용 가능하도록
  2. 프로그램 메모리를 관리(Garbage collection) 하고 최적화 한다.

JVM에서의 메모리 관리


JVM 실행에 있어서 가장 일반적인 상호작용은 힙(Heap)과 스택(Stack)의 메모리 사용을 확인하는 것이다. 가장 흔한 교정작업은 JVM의 메모리 설정 값들을 조율하는 것이다.

자바 프로그램의 실행 과정

  1. 프로그램이 실행되면, JVM은 OS로부터 이 프로그램이 필요로하는 메모리를 할당받음. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리함
  2. 자바 컴파일러(JAVAC)가 자바 소스코드를 읽고, 자바 바이트코드(.class)로 변환시킴
  3. 변경된 class 파일들을 클래스 로더를 통해 JVM 메모리 영역으로 로딩함
  4. 로딩된 class파일들은 Execution engine을 통해 해석됨
  5. 해석된 바이트 코드는 메모리 영역에 배치되어 실질적인 수행이 이루어짐.

이러한 실행 과정 속 JVM은 필요에 따라 스레드 동기화나 가비지 컬렉션 같은 메모리 관리 작업을 수행함

JVM의 구조


크게 4가지로 나눌 수 있다.

Class Loader(클래스 로더)

  • JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈.
  • 런타임시에 동적으로 클래스를 로드한다.
  • jar 파일 내에 저장된 클래스들을 JVM 위에 탑재하고, 사용하지 않는 클래스들은 메모리에서 삭제(컴파일러 역할)
  • 자바는 컴파일 타임이 아니라 런타임에 참조한다. 즉 클래스를 처음으로 참조할 때 해당 클래스를 로드하고 링크(동적로드)하는데, 그 역할을 클래스 로더가 수행함.

Execution Engine(실행 엔진)

  • 클래스 로더를 통해 Runtime Data Area에 배치된 바이트 코드들을 실행 엔진이 명령어 단위로 읽어서 실행함. 이때, 실행 엔진은 두가지 방식으로 변경합니다.
  1. 인터프리터 : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행합니다. 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느리다는 단점을 가집니다.
  2. JIT(Just - In - Time) 컴파일러 : 인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드(Native Code)로 변경하고 이후에는 해당 메서드를 더이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행하는 방식입니다. 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠릅니다.
  • 한번만 실행되는 코드라면 컴파일 하지않고 인터프리팅 하는 것이 유리하다. 따라서 JIT 컴파일러를 사용하는 JVM들은 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고, 일정 정도를 넘을 때에만 컴파일을 수행한다. ⇒ 중복사용코드: JIT 컴파일러, 한번 사용되는 코드: Interprter

Garbage Collector

  • Runtime Data Area의 Heap 영역의 더 이상 참조되지 않는 객체를 정리하는 프로세스.
  • GC가 언제 동작하는지는 정확히 알 수 없다.
  • Java 이전의 C/C++에서는 OS 레벨의 메모리에 직접 접근하기 때문에 free()라는 메서드를 호출해 할당받은 메모리를 명시적으로 해제해줘야 한다(메모리 누수 때문). 반면, 자바는 JVM을 통해 간접적으로 메모리 영역에 접근하기 때문이다. JVM은 오브젝트가 필요 없어진 시점에서 알아서 free()를 수행해 메모리를 확보한다.
  • ⇒ 자바 이전에는 프로그래머가 모든 프로그램 메모리를 관리했음. 자바에서는 JVM이 프로그램 메모리를 관리함!
  • 실행순서 : 참조되지 않은 객체들을 탐색 후 삭제 → 삭제된 객체의 메모리 반환 → 힙 메모리 재사용

Runtime Data Areas

  • JVM이 프로그램을 실행하기 위해 OS에서 할당받은 메모리 공간이다. 5가지 영역으로 나누어진다. Method area, Heap area, Stack area, PC register, Native Method Area

Runtime Data Area


Method Area(= Class area = Static area)

  • 모든 쓰레드가 공유하는 메모리 영역.
  • 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관한다.
  • 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 위한 메모리 공간이다.
  • GC의 관리대상에 포함된다.
  • Runttime Constant Pool이라는 별도의 관리 영역도 함께 존재 ⇒ 상수 자료형을 저장하여 참조하고 중복을 막는 역할
  • 올라가는 정보의 종류
    • Field 정보 : 멤버변수 이름, 데이터 타입, 접근 제어자에 대한 정보
    • Method 정보: 메소드 이름, 리턴타입, 매개변수, 접근제어자에 대한 정보
    • Type 정보: class인지 interface인지 여부 저장, 타입의 속성, super class의 전체 이름(interface이거나 object인 경우 제외)

Heap Area

  • 모든 쓰레드가 공유하는 메모리 영역
  • new 키워드로 생성된 객체와 배열이 생성되는 영역
  • 메소드 영역에 로드된 클래스들만 생성이 가능
  • Garage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역

⇒ Method Area는 클래스 데이터를 위한 공간, Heap Area는 객체를 위한 공간

Stack Area

  • 메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)을 생성한다.
  • 그 메서드 안에서 사용되는 값들을 저장. 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산시 일어나는 값들을 임시로 저장한다.
  • 메서드 수행이 끝나면 프레임별로 삭제한다.
  • 예) 재귀로 DFS 할 때, Stack overflow를 본 적이 있을 것이다.

PC Register

  • 쓰레드가 시작될 때 생성되는 공간으로 쓰레드마다 하나씩 존재한다.
  • 쓰레드가 어떤 부분을 무슨 명령으로 실행할 지에 대한 기록을 하는 부분
  • 현재 수행중인 JVM 명령의 주소를 갖는다

Native method stack

  • 자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌, 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
  • 자바 외 언어로 작성된 코드를 위한 메모리 영역이다. Java Native Interface를 통해 바이트 코드로 전환하여 저장한다. ⇒ 이 부분을 통해 C 코드를 실행 시켜 커널에 접근할 수 있다. 일반 프로그램처럼 커널이 스택을 잡아서 독자적으로 프로그램을 실행 

 

 

 

 

참고자료

https://www.itworld.co.kr/news/110837

 

"JVM이란 무엇인가" 자바 가상 머신 이해하기 - ITWorld Korea

자바 가상 머신(Java Virtual Machine, JVM)은 시스템 메모리를 관리하면서 자바 기반 애플리케이션을 위해 이식 가능한 실행 환경을 제공한다.Credit: JavaWorld/ IDGJVM은 다른 프로그램을 실행시키는 것이

www.itworld.co.kr

https://asfirstalways.tistory.com/158

 

#자바가상머신, JVM(Java Virtual Machine)이란 무엇인가?

#JVM이란? JVM이란 JAVA Virtual Machine, 자바 가상 머신의 약자를 따서 줄여 부르는 용어이다 (가상머신이란 프로그램의 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것이다.) JV

asfirstalways.tistory.com

https://steady-coding.tistory.com/305

 

JVM 메모리 구조란? (JAVA)

안녕하세요? 코딩 중독입니다. 오늘은 JVM 메모리 구조에 대해 알아보겠습니다. JVM이란? JVM 메모리 구조를 설명하기 전에 JVM이 무엇인지 알아야 합니다. JVM은 Java Virtual Machine의 약자로, 자바 가상

steady-coding.tistory.com