Java, Kotlin, Spring

JVM 메모리 구조

7772 2022. 5. 20. 09:47

JVM 구조


Java 애플리케이션이 JVM 위에서 어떻게 동작하는지 알아보자.

 

 

첫번째 과정은 컴파일

Java 소스코드는 먼저 컴파일되어야 한다. 만약 기본적인 Java 애플리케이션을 구현했다면 코드를 실행하기 위해서 먼저 컴파일 과정을 거쳐야 한다.

 

$ javac application.java

 

컴파일이 완료되면 application.class 라는 파일이 생성된다.

.class 확장자를 가진 파일은 Byte Code 파일로 컴퓨터가 해석할 수 있는 기계어에서 조금 더 추상화된 언어 파일이라고 생각하면 된다. 바이트코드 위키

 

 

클래스 로더가 하는 일

컴파일이 완료된 .class 파일은 JVM 위에 존재하는 클래스 로더로 전달된다.

클래스 로더는 .class 파일을 해석하여 프로그램 내 선언된 자료구조들을 메모리에 저장하는 역할을 한다. 메모리에 저장한다는 것은 곧 일할 준비를 한다는 의미로 받아드리면 될 것 같다.

 

 

Execution Engine 은 실행을 담당

클래스 로더가 바이트 코드를 해석하여 메모리에 올리는 일을 했다면, Execution Engine 은 실행하는 역할을 수행한다.

클래스 로더에 저장된 바이트 코드를 명령어 단위로 분류하여 하나씩 실행한다.

 

 

Garbage Collector 는 청소 담당

모든 자료구조가 프로그램의 수행 동안 유지되어야 하는 것은 아니다. Garbage Collector 는 더 이상 사용하지 않는 자료구조들을 메모리에서 소멸시키는 역할을 수행한다.

 

 

Runtime Data Area (Memory Area) 는 저장 담당

JVM 이 프로그램을 수행하기 위해서 운영체제로부터 할당받은 메모리 공간이며, 클래스 로더가 읽어온 바이트 코드 내에 자료구조들이 저장된다. Runtime Data Area 내에는 다양한 영역들이 존재하고 각각의 성격이 다르다. 또 그에따라 중요한 이슈인 동시성 관리 기법이 달라지기 때문에 좀 더 자세히 살펴보자.

 

 

Runtime Data Area (Memory Area) 구조


 

1) Method Area

  • JVM 이 실행되면서 생기는 공간이다.
  • Class 정보, 전역 변수 정보, Static 변수 정보가 저장된다.
  • Runtime Constant pool 에는 상수 정보가 저장된다.
  • 모든 스레드에서 정보가 공유된다.

 

2) Heap

  • 객체의 인스턴스 메모리, Array 와 같은 동적으로 생성된 데이터가 저장되는 공간
  • Heap 에 저장된 데이터는 GC 가 처리하지 않는 한 소멸되지 않는다.
  • Reference Type 의 데이터가 저장된다.
  • 모든 스레드에서 정보가 공유된다.

 

3) Stack

  • 지역 변수, 메소드의 매개변수와 같이 잠시 사용되고 필요 없어지는 데이터가 저장되는 공간
  • Last In First Out, 나중에 들어온 데이터가 먼저 나간다.
  • 만약 지역변수 이지만 Reference Type 일 경우에는 Heap 에 저장된 데이터의 주소값을 Stack 에 저장해서 사용하게 된다.
  • 스레드에서 정보가 공유되지 않는다. 스레드 마다 하나씩 존재한다.

 

4) PC Register

  • 스레드가 생성되면서 생기는 공간
  • 스레드가 어느 명령어를 처리하고 있는지 그 주소를 등록한다.
  • JVM 이 실행되고 있는 현재 위치를 저장하는 역할

 

5) Native Method Stack

  • Java 가 아닌 다른 언어로 구성된 메소드를 실행할 필요가 있을 때 사용되는 공간

 

 

 

 

반응형