본문 바로가기

📘 Computer Science/운영체제

[운영체제] 프로세스의 메모리 구조 (JVM 메모리 구조)

운영체제는 프로세스가 실행될 때 해당 프로세스가 필요로 하는 적절한 메모리를 할당하게 됩니다. 프로세스에게 할당되는 메모리 구조에 대해서 알아보고자 합니다.

 

 

1. 프로세스의 메모리 구조


프로세스의 메모리 구조

그림에서 보면 바로 알 수 있듯이 스택 영역과 힙 영역은 크기가 동적으로 변하는(화살표가 존재) 구조를 가지고 있고, 데이터 영역과 코드 영역은 정적인 구조라고 볼 수 있습니다. 하나씩 어떤 역할을 하는지 알아봅시다.

 

 

(1) 스택 영역 (Stack Area)

  • 스택 영역은 함수(메서드), 함수에 인자로 들어가는 매개변수(Parameter), 함수 안에 있는 지역변수(Local Variable)가 저장되는 영역입니다.
  • 컴파일 시에 크기가 결정되고, 동적인 구조를 가지고 있습니다.
  • 위 그림에서 볼 수 있듯이 위쪽에 있는 주소부터 할당됩니다.
  • 스택 영역은 함수를 재귀적으로 호출할 때 크기가 동적으로 늘어날 수 있습니다.
  • 함수가 호출되면 Stack Frame이 스택 영역에 생성되고, 해당 Stack Frame 내부에 함수의 매개변수, 지역변수들이 쌓이게 됩니다.
  • Java 코드에서 무한적인 재귀 호출이 발생되도록 코드를 잘못 작성하면 볼 수 있는 예외인 StackOverFlow는 제한되어 있는 스택 영역으로 인해 발생하는 예외입니다. 

 

(2) 힙 영역 (Heap Area)

  • 힙 영역은 동적으로 할당되는 변수가 저장되는 영역입니다. Java에서는 객체가 Heap 영역에 저장됩니다.
  • 런타임 시에 크기가 결정되고, 동적인 구조를 가지고 있습니다.
  • 위 그림에서 볼 수 있듯이 아래쪽에 있는 주소부터 할당됩니다.

 

(3) 데이터 영역

  • 데이터 영역은 전역변수, 정적변수가 저장되는 영역입니다.
  • 정적인 구조를 가지고 있고, 프로그램이 종료되면 사라지는 변수들이 들어가 있는 영역입니다.
  • 데이터 영역은 BSS(Block Started by Symbol) 영역Data 영역으로 나뉘게 됩니다.
  • BSS 영역에는 초기화 되지 않은 변수가 저장되는 영역입니다.
  • Data 영역에는 다른 값으로 초기화된 변수가 저장되는 영역입니다.

 

(4) 코드 영역

  • 코드 영역은 실제 소스 코드가 기계어의 형태로 저장되는 영역입니다.
  • 정적인 구조를 가지고 있고, 수정이 불가능한 기계어로 저장되어 있기 때문에 Read Only의 특징을 가지고 있습니다. (수정 불가)

 

 

 

2. JVM(Java Virtual Machine)의 메모리 구조


  • Java를 학습하는 사람으로서 빼먹고 넘어갈 수 없는 내용이라고 생각되어 추가적으로 기록해보고자 합니다.
  • JVM은 운영체제(OS)로 부터 별도의 메모리 공간을 할당받아서 Java Application을 실행하는데 사용합니다.
  • 이런 JVM의 메모리를 Runtime Data Area라고 부릅니다.
  • Runtime Data Area는 Stack Area, Heap Area, Method Area, PC register, Native Method Stack으로 구성되어 있습니다.

 

(1) Method Area (Static Area)

  • 클래스 정보클래스 변수(static), 상수(final), 메서드 코드, 런타임 상수 풀 등의 데이터를 저장하는 영역입니다.
  • 한번 로드된 이후 메모리에 항상 상주하고 있는 영역입니다.
  • 모든 스레드가 공유할 수 있는 영역입니다.

 

(2) Stack Area

  • 함수(메서드)에서 직접 사용할 수 있는 지역변수(local variable), 매개변수(parameter), 객체의 경우에는 주소값을 저장합니다.
  • 함수가 호출되면 Stack Area에 Stack Frame이 생성되고, 해당 Stack Frame 내부에 지역변수, 매개변수 등이 쌓이게 됩니다.
  • 함수의 호출이 종료되면 pop으로 해당 Stack Frame이 제거됩니다.
  • JVM에서 Stack Area는 스레드마다 하나씩 가지고 있습니다.

 

(3) Heap Area

  • new를 통해서 생성된 객체, 배열 등이 저장되는 영역입니다.
  • JVM의 Statck Area에서 참조가 가능합니다. Heap Area에 존재하는데, 어떠한 곳에서도 참조를 하고 있지 않다면 메모리를 낭비하고 있기 때문에 GC(Garbage Collector)가 Heap Area에서 지워줍니다.

 

(4) PC(Program Counter) Register

  • 스레드가 생성될 때마다 생성되는 영역으로 현재 스레드가 실행되고 있는 부분의 주소와 해당 명령을 저장하고 있는 영역입니다.
  • 여러 스레드가 흐름을 잃지 않고 순차적으로 실행될 수 있도록 해줍니다.

 

(5) Native Method Stack

  • Java 코드 이외 다른 언어로 작성된 네이티브 코드를 실행하기 위한 영역입니다.
  • 성능 향상을 위해서 Java Application에서 다른 언어와 함께 사용되는 경우가 있습니다. 이때 다른 언어로 작성되어 제공되는 Method의 정보가 저장됩니다.

 

 

 

3. 면접에서 나올 수 있는 질문들


  • JVM의 메모리 구조와 각 영역에 대해서 설명해보세요.
  • Garbage Collector가 어떤 역할을 하는지 설명해보세요.

 

 

 

🙆🏻‍♂️ 마무리 하며


  • JVM은 프로세스인가라는 궁금점이 있었습니다. 글을 정리하고 싶었지만 정확한 근거가 되는 글을 찾을 수 없어서 따로 기록해보지 못했습니다. 
  • 운영체제 위에서 작동되고, 운영체제에 의해서 별도의 메모리 공간을 할당 받기 때문에 프로세스라고 생각은 되는데, 일반적인 프로세스의 메모리 구조와는 다른 구조를 가지고 있고, JVM의 메모리 관리 방식도 일반적인 프로세스와는 다르다고 알고 있습니다.

 

 

 

참고 자료

https://honbabzone.com/java/java-jvm/

면접을 위한 CS 전공지식 노트

'📘 Computer Science > 운영체제' 카테고리의 다른 글

[운영체제] 프로세스와 스레드  (0) 2023.06.16
[운영체제] 운영체제란?  (0) 2023.01.17