그냥 JVM 메모리 구조에 대해 공부하는데 생긴게 딱~ OS에서 공부한 가상 메모리 공간과 비슷해보였다. JVM이 클래스, 메소드, 인스턴스 변수, 지역 변수 등을 어떻게 관리하는지, 그리고 이것이 OS가 프로세스를 관리하는 방식과 어떻게 유사한지 궁금해졌다. 두 시스템 모두 메모리 격리와 효율성을 고려하여 설계되었기에, 서로 다른 수준에서 작동하면서도 유사한 목적을 공유한다는 점에서 구조와 관리 측면에서 유사한 점이 있지않을까?
영역 | 저장되는 데이터 | 관리 방식 |
---|---|---|
스택 영역(Stack) | Java 메소드의 호출과 관련된 데이터(지역 변수, 매개변수, 연산 중간 결과 등) | 스택 영역은 메소드 호출 시 각 스레드별로 스택 프레임을 생성하여 LIFO(Last In, First Out) 원칙에 따라 작동 |
힙 영역(Heap) | 모든 Java 객체와 배열(new 키워드를 통해 생성된 인스턴스와 배열)이 동적 할당됨. | 가비지 컬렉터에 의해 관리, 할당된 객체들 중 더 이상 참조되지 않는 객체들은 가비지 컬렉터에 의해 자동으로 제거 |
메소드 영역(Method Area) | 클래스 수준의 정보(클래스명, 부모 클래스명, 메소드, 변수)와 상수, 정적 변수 등, 즉, 모든 클래스와 인터페이스에 대한 메타데이터 | JVM 시작 시 생성되며, 프로그램 실행 동안 수정될 수 있지만, 주로 정적인 데이터를 저장 |
PC 레지스터 영역(Program Counter Register) | 현재 실행 중인 JVM 명령어의 주소 = 현재 실행 중인 스레드가 다음에 어떤 명령어를 실행할지를 가리키는 포인터 | 현재 실행 중인 스레드마다 별도로 존재, 각 스레드가 실행 중인 명령어의 주소 정보를 독립적으로 가짐 |
네이티브 메소드 스택 영역(Native Method Stack) | Java가 아닌 다른 언어로 작성된 네이티브 코드를 위한 메소드 호출과 관련된 데이터 | 각 스레드별로 별도로 관리, Java 메소드 스택과 유사하게, 네이티브 메소드 호출 시 스택 프레임이 생성되고, 메소드가 종료되면 해당 프레임이 제거 |
가상 메모리는 운영체제(OS)에서 물리적 메모리보다 더 큰 메모리 영역을 프로세스에 제공하기 위해 사용하는 기술이다. 이를 통해 프로세스는 실제 물리적 메모리의 크기를 초과하는 데이터와 프로그램을 실행할 수 있다. 가상 메모리 시스템은 다음과 같은 요소로 구성된다.
영역 | 저장되는 데이터 | 관리 방식 |
---|---|---|
스택(Stack) 영역 | 함수의 호출과 관련된 데이터(함수의 매개변수, 반환 주소, 지역 변수 등) | 후입선출(LIFO; Last In, First Out) 원칙에 따라 데이터를 관리 |
힙(Heap) 영역 | 동적으로 할당된 데이터 | 프로그래머가 직접 관리(할당 및 해제) |
데이터(Data) 영역 | 초기화된 전역 변수와 정적 변수(static 변수) | 프로그램의 실행이 시작될 때 생성되고, 프로그램이 종료될 때 해제 |
코드(Code) 영역 | 프로그램의 실행 코드, 즉 기계어로 변환된 명령어들(함수, 루프, 변수 등 프로그램을 구성하는 모든 명령어) | 프로그램이 실행되는 동안 변경될 수 없는 '읽기 전용' 영역, 프로그램 실행 시 자동으로 할당되며, 프로그램 종료 시 해제 |
스택 영역 | JVM 메모리 구조 | OS 가상 메모리 |
---|---|---|
스레드별 할당 | 자바 애플리케이션을 실행할 때 각 스레드별로 독립된 스택 영역을 할당받음 | 프로세스의 각 스레드는 자신만의 스택 영역을 할당받음 |
스레드간 데이터 공유 | 힙(heap) 영역, 메소드(method) 영역 | 힙(heap) 영역, 데이터 섹션 |
구분 | JVM (Java Virtual Machine) | OS (Operating System) |
---|---|---|
역할 | 자바 애플리케이션을 실행하기 위한 가상 실행 환경 제공 | 컴퓨터 하드웨어를 관리하고 애플리케이션들이 하드웨어 자원을 효율적으로 사용할 수 있도록 하는 시스템 소프트웨어 |
가상 메모리 관리 | 자바 애플리케이션에 대한 가상 메모리를 관리. 가비지 컬렉션을 통한 메모리 관리 제공 | 시스템 전체의 메모리 관리를 담당. 프로세스별 가상 메모리 공간 할당 및 관리 |
스레드 관리 | 자바 스레드를 관리. 자바 애플리케이션 내에서 멀티스레드 프로그래밍 지원 | 시스템 스레드 관리. 프로세스 내에서의 스레드 생성, 스케줄링, 동기화 등을 관리 |
동시성 프로그래밍 지원 | 자바 언어 수준에서 동시성 프로그래밍 구현을 위한 API 제공 (예: synchronized, volatile, Concurrent 패키지 등) | 프로세스 및 스레드 간 동시성 제어를 위한 메커니즘 제공 (예: 뮤텍스, 세마포어, 모니터 등) |
유사성 | - 동시성 프로그래밍 지원 - 스레드 관리 기능 | - 동시성 프로그래밍 지원 - 스레드 관리 기능 |
차이점 | - OS위에서 자바 애플리케이션 한정의 가상 메모리 및 스레드 관리 - 가비지 컬렉션을 통한 메모리 관리 방식 | - 시스템 전체의 메모리 및 모든 프로세스의 스레드 관리 - 프로세스별 가상 메모리 관리 및 다양한 메모리 관리 기법 사용 |