본문 바로가기
JAVA

[JAVA(자바)] JVM 구조와 메모리 영역

by 초이사 2023. 1. 3.

JVM이 무엇인지 글로 정리한 적이 없어

JVM이 무엇인지와 JVM이 메모리 영역을 어떻게 구분하는지에 작성하고자 한다.

 

 

JVM(Java Virtual Machine)

  • 자바 가상 기계라고도 불리며, 자바의 바이트 코드를 읽고 해석한 뒤, 실행한다.
  • 서로 다른 플랫폼 즉, 운영체제(Window, Linux)에서도 동일하게 실행할 수 있게 해준다.
  • JVM 자체는 플랫폼(자바개발사인 오라클, 마이크로소프트 등)마다 다르게 작성되어 배포되며 플랫폼 종속적이다.
  • 자바 프로그램은 어떤 회사의 JVM인지 여부와 관계없이 정상적으로 실행된다.

* Java는 플랫폼에 종속적이지 않지만 JVM은 플랫폼에 종속적이다.

 

 

JVM(Java Virtual Machine) 실행과정

  1. JVM이 구동되면 JVM은 운영체제로 부터 메모리를 할당 받는다.
  2.  자바 소스코드(.Java)를 컴파일하면(javac 명령어) 확장명이 .class인 바이트 코드로 파일로 변환된다.
  3. .class 파일을 JVM의 클래스 로더에게 보낸다.
  4. 클래스 로더는 JVM 런타임 데이터 영역(Runtime Data Area)에 로딩한다.
  5. 메모리에 로딩된 .class 파일을 Execute Engine에서 기계어로 번역하고 실행한다. 

 

JVM의 구성은 크게 Class Loader,  Execute Engine, Garbage Collector, Runtime Data Area가 있으며

아래와 같이 그려볼 수 있다.

 

Class Loader

  • .class 파일을 런타임 데이터 영역(Runtime Data Area)에 로딩한다.(=메모리에 올린다.)

Execute Engine

  • .class 파일을 JVM에서 실행할 수 있도록 기계어로 번역하고 실행한다.

Garbage Collector

  • 힙 영역에서 더 이상 사용하지 않는 메모리를 제거한다
  • 보통 자동적으로 실행된다.

Runtime Data Area(JVM 메모리 영역)

- JVM 메모리 영역은 5가지로 구성되어 있다.

- JVM은 할당 받은 메모리 영역을 메소드 영역, 힙 영역, 스택 영역으로 구분해서 사용한다.

 

 

1. 메소드 영역(Method Area) - 공유자원

  • 바이트 코드 파일을 읽은 내용을  저장하며, 클래스별로 상수, 메소드, 생성자, static 변수, interface등이 저장된다.
  • static 영역으로 여기 있는 데이터는 프로그램이 종료될 때까지 존재한다.
    • static 데이터를 많이 사용한다면 메모리 부족이 생길 수 있다.

 

2. 힙 영역(Heap Area) - 공유자원

  • 객체와 배열이 생성되는 영역이다. 객체의 메모리 번지는 메소드나 스택에 있는 상수와 변수에서 참조할 수 있다.
  • 호출이 끝나도 삭제되지 않는다. 아무도 참조하지 않는 객체가 생기면 가비 컬렉터에 의해 제거된다.
  • 런 타임시 할당된다. (런 타임: 컴파일 이후 프로그램이 실행될 때)

 

3. 스택영역(Stack Area) - 공유자원x(스레드 별로 생성)

  • 메소드를 호출할 때마다 생성되는 프레임이 저장되는 영역으로 호출이 종료되면 프레임도 제거된다. 지역변수, 파라미터, 리턴 값등이 이에 해당한다. (메소드내에서만 사용하고 메소드가 종료되면 지역변수는 사용되지 않는다는 것을 생각하면 쉽게 이해할 수 있다.)
  • 기본타입변수와 참조타입변수가 생성되고 제거되는 곳이다.
  • LIFO(Last-In-First-Out)의 특성을 가져 나중에 들어온 데이터부터 제거된다.
  • 쓰레드별로 1개씩 생성된다. 
  • 컴파일 타임시 할당된다. (.class파일(소스코드)가 기계어로 변환되는 과정)

 

4. PC 레지스터(PC Register) - 공유자원x

  • 스레드가 생성될 때마다 생성된다.
  • 현재 스레드가 부분을 무슨 명령으로 실행할 지 기록하는 부분으로 현재 실행 중인 JVM 명령 주소를 저장한다.

 

5. 네이티브 메서드 스택 (Native Method Stack) - 공유자원x

  • 자바이외의 언어로 작성된 네이티브 코드를 실행 시, 사용되는 메모리 영역이다.
  • Java Native Interface를 통해 호출되는 C/C++등의 코드를 수행하기 위한 스택이다.

 

-> 멀티 스레드 시 공유되는 메모리 영역은 메소드 영역과 힙 영역이다. 나머지는 스레드마다 생성되며 공유되지 않는다.

 

댓글