
개요
자바 프로그램이 실행이 되면, OS는 JVM에게 일정 메모리 공간을 할당해주게 되고
JVM은 그 공간을 여러 영역으로 나누어서 관리를 하게 된다.
그 영역은 크게 다음 세 가지로 분류된다.
1. Method(Static) 영역
2. Stack 영역
3. Heap 영역

메모리는 한정되어 있기 때문에, 할당된 메모리에 어떻게 할당하느냐에 따라서 프로그램 성능의 차이가 발생할 수 있다.
우리가 개발을 하다보면 발생하는 StackOverflow나 OutofMemoreError와 같은 것이 이 메모리 영역에서 발생하는 에러라고 할 수 있다.
어떻게 하면 메모리를 효율적으로 사용할 수 있을 지, 메모리의 구조를 공부하며 알아보자.
변수의 종류

메모리에 올라가는 것들을 알기 전에, 변수의 종류에 대해 알고 시작하자.
변수는 크게 클래스변수, 인스턴스변수, 지역변수, 매개변수 4가지로 나뉜다.

각 변수의 생성시기는 아래와 같다.
- 클래스변수 : 클래스가 메모리에 올라갈 때
- 인스턴스변수 : 인스턴스가 생성되었을 때
- 지역변수 / 매개변수 : 위치하고 있는 메서드가 수행되었을 때
Method(Static) 영역
- JVM이 동작해서 클래스가 로딩될 때 생성.
- JVM이 읽어들인 클래스와 인터페이스 대한 인스턴스 변수(멤버 변수), 클래스 변수(Static 변수), 상수(final), 생성자(constructor)와 메소드(method) 등을 저장하는 공간.
- Method(Static) 영역에 있는 것은 어느곳에서나 접근 가능
- Method(Static) 영역의 데이터는 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있다.
그래서 static 메모리에 있는 데이터들은 프로그램이 종료될 때까지 어디서든 사용이 가능하다.
그러나 static 데이터를 무분별하게 많이 사용할 경우 메모리 부족 현상이 일어날수 있게 된다.

Stack 영역
- 메소드 내에서 정의하는 기본 자료형에 해당되는 지역변수의 데이터 값이 저장되는 공간
- 메소드가 호출될때 스택 영역에 스택 프레임이 생기고 그안에 메소드를 호출
- primitive 타입의 데이터(int, double, byte, long, boolean 등) 에 해당되는 지역변수, 매개 변수 데이터 값이 저장
- 메소드가 호출 될 때 메모리에 할당되고 종료되면 메모리에서 사라짐
- Stack 은 후입선출 LIFO(Last-In-First-Out) 의 특성을 가지며, 스코프(Scope) 의 범위를 벗어나면 스택 메모리에서 사라진다.

Heap 영역
- JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역
- 참조형(Reference Type) 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장 되는 공간
- 단, Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수는 stack에 적재
- Heap 영역은 Stack 영역과 다르게 보관되는 메모리가 호출이 끝나더라도 삭제되지 않고 유지된다.
그러다 어떤 참조 변수도 Heap 영역에 있는 인스턴스를 참조하지 않게 된다면, GC(가비지 컬렉터)에 의해 메모리에서 청소된다. - stack은 스레드 갯수마다 각각 생성되지만, heap은 몇개의 스레드가 존재하든 상관없이 단 하나의 heap 영역만 존재
1. 생성자 new Counter() 를 호출한다.
- 생성자를 호출하면 heap 영역에 Counter 클래스 인스턴스 변수들이 저장되게 되고, stack 영역의 지역변수 sub 에 주소값으로 연결되게 된다.

2. twice(sub) 메소드를 실행한다.
- 새로운 메소드를 실행하는 것이니, stack 영역에 새로운 스택 프레임이 생기게 된다.
- 그리고 매개변수로 클래스를 전달하였기 때문에 twice() 의 매개변수 c 는 주소값으로 같은 힙 영역을 가리키게 된다.

6. 가비지 컬렉터(GC)가 힙 영역을 청소한다.
- 가비지 컬렉터는 힙 영역에 참조되지 않고 남아버린 고아 객체들을 식별해 힙 영역을 청소 해주는 역할을 한다.
- 추가로 코드 실행이 모두 끝나면 Method(Static) 영역도 비워지게 된다.

'운영체제' 카테고리의 다른 글
| 프로그램들은 어떻게 동시에(?) 실행될까? (0) | 2024.03.04 |
|---|---|
| Process 와 Thread의 자원 공유 (0) | 2024.02.26 |
| Process의 구조는 어떻게 되어있을까 (0) | 2024.02.23 |
| Process와 Thread란 무엇일까? (0) | 2024.01.31 |