(운영체제) 프로세스 메모리 구조
일반적으로 프로세스의 메모리 구조는 아래의 4가지 영역으로 나눠진다.
스택(stack), 힙(heap), 데이터(data), 코드(text) 영역
stack과 heap 영역은 런타임 단계에서 메모리를 할당받는 동적 영역이고,
data와 code 영역은 컴파일 단계에서 메모리를 할당받는 정적 영역이다.
- Stack : 임시 데이터 (함수 실행을 위한 지역 변수 등)가 저장된다.
- Heap : 코드에서 동적으로 만들어지는 데이터가 저장된다.(동적으로 할당된 데이터)
- data : 전역 변수, 초기화된 데이터 등
- code : 프로그램 코드
JVM(Java Virtual Machine)
Java의 특징
- 객체지향 프로그래밍 언어
- 기본 자료형(Primitive type : 원시 자료형)을 제외한 모든 것들이 객체로 표현되어 있다.
- JVM(Java Virtual Machine) 위에서 동작하기 때문에, OS에 독립적이다.
- GC(Garbage Collector)를 통한 자동 메모리 관리가 되어 메모리를 직접 해제하지 않아도 된다.
- JVM 위에서 동작하기 때문에 실행 속도가 상대적으로 느린 편이다.
JVM 때문에 Java가 OS에 독립적일 수 있고, GC가 메모리를 자동으로 해제할 수 있다.
이 JVM에 대해 알아보자.
JVM 구조와 컴파일 과정
Java 컴파일 과정 (Java 프로그램 실행 과정)
- Java 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당받는다.
- Java Compiler(javac)가 Java 소스코드(.java file)를 Java Byte Code(.class file)로 컴파일
- Class Loader를 통해 Java Byte Code를 JVM Runtime Data Area로 로딩
- Execution Engine의 Java Interpreter와 JIT Compiler를 통해 해석하여 기계어로 변환하여 실행된다.
위의 과정을 거쳐서 Java가 컴파일되어 실행된다.
Java는 컴파일 과정에서 Compiler와 Interpreter 방식을 모두 사용하는 언어이다.
Java(JVM) 메모리 구조
Java는 JVM(Java Virtual Machine)이 OS로부터 메모리를 할당받고, 그 메모리를 관리한다.
JVM 내에 Runtime Data Area가 존재하는데, 이는 JVM의 메모리 영역으로 Java Application을 실행할 때 사용되는 데이터들이 적재되는 공간이다.
Method(static) 영역, Stack 영역, Heap 영역 그리고 PC Register와 Native Method Stack이 존재한다.
이 중, Heap과 Method 영역은 모든 Thread가 공통으로 사용되는 공간이고,
Stack과 PC Register, Native Method Stack 공간은 Thread 마다 하나씩 생성된다.
Method (static) 영역
클래스를 구성하는 각종 정보들( 변수명, 데이터 타입, 접근 제어자 정보, 메서드 명 등)이 저장되는 공간이다.
- JVM이 동작해서 클래스가 로딩될 때 생성된다.
- Runtime 상수 풀, 멤버 변수(필드), 클래스 변수(static), 상수(final), 생성자(constructor), 메서드(method) 등을 저장
- Method(static) 영역의 데이터는 프로그램 시작될 때부터 종료될 때까지 메모리에 남아있다.
Heap
Runtime 중에 동적으로 생성된 데이터들이 저장된다.
Heap 영역의 데이터는 Stack 영역의 데이터와 다르게 메모리에 대한 호출이 종료되어도 삭제되지 않고 유지된다.
그래서 GC가 동작할 때, 참조되고 있지 않은 인스턴스들은 제거되게 된다.
- Refrence Type(참조형) 데이터 타입을 갖는 객체 등이 저장되는 공간이다.
- Heap 영역은 Thread에 상관없이 JVM 내에 단 하나의 Heap 영역만 존재하고, 공유한다.
💡Reference(참조형) 데이터들은 Heap 영역에 저장된다.
JVM Stack
함수(메서드) 관련 데이터(지역변수, 매개변수, 리턴 값, 연산에 사용되는 임시 값 등) 들이 저장된다.
- 메서드가 정의하는 기본 자료형(Primitive type)에 해당되는 지역변수의 데이터 값이 저장된다.
- 메서드가 호출될 때 메모리에 할당되고 종료되면 메모리에서 제거된다.
- 메서드가 호출될 때 스택 프레임이 생기고 그 안에 메서드를 호출한다.
- Stack은 LIFO의 특징을 가진다.
스택 프레임 (Stack Frame)
하나의 메서드에 필요한 메모리 덩어리를 묶어서 스택 프레임이라고 하고, 하나의 메서드 당 하나의 스택 프레임이 필요하다. 메서드를 호출하기 직전에 스택 프레임을 생성하고, 메서드가 종료되면 제거된다.
💡Primitive type(원시형) 데이터(int, double, boolean 등)는 Stack 영역에 저장된다.
PC Register
Thread가 생성될 때마다 생성되는 영역으로, 현재 수행 중인 JVM 명령어를 저장하고 있다.
PC(Program Counter)
프로그램 카운터는 마이크로프로세서 내부에 있는 레지스터 중의 하나로서,
다음에 실행될 명령어의 주소를 가지고 있어 실행할 기계어 코드의 위치를 지정한다.
Native Method Stack
일부 Java 명령어 들은 Java 이외의 외부 언어(C, C++, assembly 등)로 구성되어 있다.
이런 Java 코드 이외의 Native Code가 실행될 때 사용되는 영역이다.
Garbage Collector(GC)
가비지 컬렉터(가비지 컬렉션, GC)는 JVM에서 메모리를 관리해 주는 모듈이다.
Java의 Heap 영역에 동적으로 할당했던 데이터들 중, 아무런 참조도 일어나지 않아서 필요 없어진 데이터를 자동으로, 주기적으로 삭제하는 기능을 한다.
메모리가 가득 차게 되면 JVM의 다른 동작들을 모두 멈추고 참조되지 않고 있는 데이터를 모두 삭제한다.이 과정을 Mark And Sweep이라고 한다.
'JAVA & Spring > JAVA 이론' 카테고리의 다른 글
[Java] 깊은 복사(Deep Copy) vs 얕은 복사(Shallow Copy) (0) | 2024.03.16 |
---|---|
[Java] equals()와 hashCode() / equals와 hashCode를 둘 다 재정의 해야하는 이유 (0) | 2024.03.14 |
[JAVA] 추상 클래스 (abstract class) (0) | 2023.05.18 |
[JAVA] 상속 (0) | 2023.05.17 |
[JAVA] static과 final (0) | 2023.05.17 |