[JAVA] JVM 메모리 구조와 OS 가상 메모리 구조 비교

권유정·2024년 3월 18일
1

Java

목록 보기
2/2

동기

그냥 JVM 메모리 구조에 대해 공부하는데 생긴게 딱~ OS에서 공부한 가상 메모리 공간과 비슷해보였다. JVM이 클래스, 메소드, 인스턴스 변수, 지역 변수 등을 어떻게 관리하는지, 그리고 이것이 OS가 프로세스를 관리하는 방식과 어떻게 유사한지 궁금해졌다. 두 시스템 모두 메모리 격리와 효율성을 고려하여 설계되었기에, 서로 다른 수준에서 작동하면서도 유사한 목적을 공유한다는 점에서 구조와 관리 측면에서 유사한 점이 있지않을까?


JVM 메모리 구조

  • JVM은 자바 애플리케이션을 실행하기 위해 운영 체제로부터 할당받은 물리 메모리 상에 자신만의 가상 메모리 영역을 구성한다. 이렇게 구성된 가상 메모리 영역 안에서 자바 애플리케이션의 코드를 실행하고, 데이터를 저장하며, 관리한다.
  • 이 과정에서 JVM은 운영 체제의 메모리 관리 기능과 상호 작용하면서 필요한 메모리를 할당받거나 반환한다.
  • 클래스, 메소드, 인스턴스 변수, 지역변수는 JVM 메모리 구조 내에서 각각 다른 영역에 할당되며, 이는 메모리 사용의 효율성과 안정성을 높이는 데 기여된다.

영역저장되는 데이터관리 방식
스택 영역(Stack)Java 메소드의 호출과 관련된 데이터(지역 변수, 매개변수, 연산 중간 결과 등)스택 영역은 메소드 호출 시 각 스레드별로 스택 프레임을 생성하여 LIFO(Last In, First Out) 원칙에 따라 작동
힙 영역(Heap)모든 Java 객체와 배열(new 키워드를 통해 생성된 인스턴스와 배열)이 동적 할당됨.가비지 컬렉터에 의해 관리, 할당된 객체들 중 더 이상 참조되지 않는 객체들은 가비지 컬렉터에 의해 자동으로 제거
메소드 영역(Method Area)클래스 수준의 정보(클래스명, 부모 클래스명, 메소드, 변수)와 상수, 정적 변수 등, 즉, 모든 클래스와 인터페이스에 대한 메타데이터JVM 시작 시 생성되며, 프로그램 실행 동안 수정될 수 있지만, 주로 정적인 데이터를 저장
PC 레지스터 영역(Program Counter Register)현재 실행 중인 JVM 명령어의 주소 = 현재 실행 중인 스레드가 다음에 어떤 명령어를 실행할지를 가리키는 포인터현재 실행 중인 스레드마다 별도로 존재, 각 스레드가 실행 중인 명령어의 주소 정보를 독립적으로 가짐
네이티브 메소드 스택 영역(Native Method Stack)Java가 아닌 다른 언어로 작성된 네이티브 코드를 위한 메소드 호출과 관련된 데이터각 스레드별로 별도로 관리, Java 메소드 스택과 유사하게, 네이티브 메소드 호출 시 스택 프레임이 생성되고, 메소드가 종료되면 해당 프레임이 제거

JVM 메모리 구역
출처



OS의 가상 메모리 구조

가상 메모리는 운영체제(OS)에서 물리적 메모리보다 더 큰 메모리 영역을 프로세스에 제공하기 위해 사용하는 기술이다. 이를 통해 프로세스는 실제 물리적 메모리의 크기를 초과하는 데이터와 프로그램을 실행할 수 있다. 가상 메모리 시스템은 다음과 같은 요소로 구성된다.

영역저장되는 데이터관리 방식
스택(Stack) 영역함수의 호출과 관련된 데이터(함수의 매개변수, 반환 주소, 지역 변수 등)후입선출(LIFO; Last In, First Out) 원칙에 따라 데이터를 관리
힙(Heap) 영역동적으로 할당된 데이터프로그래머가 직접 관리(할당 및 해제)
데이터(Data) 영역초기화된 전역 변수와 정적 변수(static 변수)프로그램의 실행이 시작될 때 생성되고, 프로그램이 종료될 때 해제
코드(Code) 영역프로그램의 실행 코드, 즉 기계어로 변환된 명령어들(함수, 루프, 변수 등 프로그램을 구성하는 모든 명령어)프로그램이 실행되는 동안 변경될 수 없는 '읽기 전용' 영역, 프로그램 실행 시 자동으로 할당되며, 프로그램 종료 시 해제

가상 메모리 공간 구성

JVM과 OS 가상 메모리의 스택 영역 관리 구조

  • 둘 다 모두 스레드별로 독립적인 스택을 할당받아 실행하는 구조를 가짐
  • 둘 다 스레드별로 독립된 스택을 사용하면서도 특정 영역을 공유함으로써, 효율적인 데이터 관리와 스레드 간의 원활한 데이터 교환을 가능하게 함.
  • 둘 다 스레드별로 독립된 스택 영역을 가지면서도, 공유 메모리 영역을 통해 데이터를 주고받을 수 있게 되므로, 다양한 작업을 효율적으로 병렬로 처리할 수 있도록 함. -> 성능 향상

스택 영역JVM 메모리 구조OS 가상 메모리
스레드별 할당자바 애플리케이션을 실행할 때 각 스레드별로 독립된 스택 영역을 할당받음프로세스의 각 스레드는 자신만의 스택 영역을 할당받음
스레드간 데이터 공유힙(heap) 영역, 메소드(method) 영역힙(heap) 영역, 데이터 섹션

+) JVM vs OS

구분JVM (Java Virtual Machine)OS (Operating System)
역할자바 애플리케이션을 실행하기 위한 가상 실행 환경 제공컴퓨터 하드웨어를 관리하고 애플리케이션들이 하드웨어 자원을 효율적으로 사용할 수 있도록 하는 시스템 소프트웨어
가상 메모리 관리자바 애플리케이션에 대한 가상 메모리를 관리. 가비지 컬렉션을 통한 메모리 관리 제공시스템 전체의 메모리 관리를 담당. 프로세스별 가상 메모리 공간 할당 및 관리
스레드 관리자바 스레드를 관리. 자바 애플리케이션 내에서 멀티스레드 프로그래밍 지원시스템 스레드 관리. 프로세스 내에서의 스레드 생성, 스케줄링, 동기화 등을 관리
동시성 프로그래밍 지원자바 언어 수준에서 동시성 프로그래밍 구현을 위한 API 제공 (예: synchronized, volatile, Concurrent 패키지 등)프로세스 및 스레드 간 동시성 제어를 위한 메커니즘 제공 (예: 뮤텍스, 세마포어, 모니터 등)
유사성- 동시성 프로그래밍 지원
- 스레드 관리 기능
- 동시성 프로그래밍 지원
- 스레드 관리 기능
차이점- OS위에서 자바 애플리케이션 한정의 가상 메모리 및 스레드 관리
- 가비지 컬렉션을 통한 메모리 관리 방식
- 시스템 전체의 메모리 및 모든 프로세스의 스레드 관리
- 프로세스별 가상 메모리 관리 및 다양한 메모리 관리 기법 사용

결론 및 생각

  • 두 시스템 모두 메모리를 효율적으로 관리하고, 프로그램의 안정적인 실행을 지원하기 위한 다양한 메모리 영역을 구성하고 있다는 점에서 상당한 유사성을 가지고 있었다. (함수(메서드)호출시 생기는 데이터, 동적 할당 데이터, 전역(상수)데이터를 다루는 영역들이 각각 따로 존재한다는 것)
  • 하지만, JVM은 자바 애플리케이션 실행에 특화된 독립적인 가상 머신으로서의 역할을 수행하는 반면, OS의 가상 메모리 시스템은 보다 광범위한 프로세스 관리와 시스템 자원의 효율적 분배에 초점을 맞추고 있다는 점에서 구조적으로 약간의 차이점을 가지는 특징을 보였다.
  • 이러한 차이점에도 불구하고, 두 시스템이 메모리 격리와 효율성을 위해 비슷한 논리적 메모리 구조를 가지고 있다는 사실은 매우 흥미로웠다.
  • 실제 각 영역에 대한 구현적 세부사항은 오라클에서 개발자들의 넓은 사고를 위해 보여주지 않았지만 아무래도 나보다 더 똑똑한 사람들의 구현이 궁금한 것은 어쩔 수 없는 호기심인 것 같다.
profile
인생 살자. (@yujeongkwon)

0개의 댓글