|
| 1 | +# 자바 메모리 구조와 static |
| 2 | + |
| 3 | +## 자바 메모리 구조 |
| 4 | +자바의 메모리 구조는 크게 메서드 영역, 스택 영역, 힙 영역 3개로 나눌 수 있다. |
| 5 | +#### 메모리 구조 - 비유 |
| 6 | + |
| 7 | +* **메서드 영역** : 클래스 정보를 보관한다. 이 클래스 정보가 붕어빵 틀이다. |
| 8 | +* **스택 영역** : 실제 프로그램이 실행되는 영역이다. 메서드를 실핼할 떄 마다 하나씩 쌓인다. |
| 9 | +* **힙 영역** : 객체(인스턴스)가 생성되는 영역이다. new 명령어를 사용하면 이 영역을 사용한다. |
| 10 | +쉽게 이야기해서 붕어빵 틀로부터 생성된 부어빵이 존재하는 공간이다. |
| 11 | +참고로 배열도 이 영역에 생성된다. |
| 12 | + |
| 13 | +#### 메모리 구조 - 실제 |
| 14 | +* **메서드 영역(Method Area)** : 메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 이 영역은 프로그램의 모든 영역에서 공유한다. |
| 15 | + * 클래스 정보 : 클래스의 실행 코드(바이트 코드), 필드, 메서드와 생성자 코드등 모든 실행 코드가 존재한다. |
| 16 | + * static 영역 : static 변수들을 보관한다. |
| 17 | + * 런타임 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다. 예를 들어서 프로그램에 "hello"라는 리터럴 문자가 있으면 |
| 18 | + 이런 문자를 공통으로 묶어서 관리한다. 이 외에도 프로그램을 효율적으로 관리하기 위한 상수들을 관리한다. |
| 19 | +* **스택 영역(Stack Area)** : 자바 실행 시, 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다. |
| 20 | + * 스택 프레임 : 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임이다. 메서드를 호출할 떄마다 하나의 스택 프레임이 쌓이고, 메서드가 종료되면 해당 스택 프레임이 제거된다. |
| 21 | +* **힙 영역(Heap Area)** : 객체(인스턴스)와 배열이 생성되는 영역이다. 가비지 컬렉션(GC)이 이루어지는 주요 영역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거된다. |
| 22 | + |
| 23 | +>> **참고** : 스택 영역은 더 정확히는 각 쓰레드별로 하나의 실행 스택이 생성된다. 따라서 쓰레드 수 만 큼 스택 영역이 생성된다. 지금은 쓰레드를 1개만 사용하므로 스택영역도 하나이다. 스레드에 대한 부분은 멀티 쓰레드를 학습해야 이해할 수 있다. |
| 24 | +
|
| 25 | +#### 메서드 코드는 메서드 영역에 |
| 26 | +자바에서 특정 클래스로 100개의 인스턴스를 생성하면, 힙 메모리에 100개의 인스턴스가 생긴다. 각각의 인스턴스는 내부에 변수와 메서드를 가진다. 같은 클래스로 부터 생성된 객체라도, 인스턴스 내부의 변수 값은 서로 다를 수 있지만, 메서드는 공통된 코드를 공유한다. |
| 27 | +따라서 객체가 생성될 때, 인스턴스 변수에는 메모리가 할당되지만, 메서드에 대한 새로운 메모리 할당은 없다. 메서드는 메서드 영역에서 공통으로 관리되고 실행된다. |
| 28 | + |
| 29 | +정리하면 인스턴스의 메서드를 호출하면 실제로는 메서드 영역에 있는 코드를 불러서 수행한다. |
| 30 | + |
| 31 | +## 스택과 큐 자료 구조 |
| 32 | +* **스택 - 후입선출(LIFO, Last In First Out)** |
| 33 | + |
| 34 | + 가장 마자믹에 넣은 값이 가장 먼저 나온다. 이렇게 나중에 넣은 것이 가장 먼저 나오는 것을 후입 선출이라고 하고, 이런 자료 구조를 스택이라 한다. |
| 35 | + |
| 36 | + |
| 37 | +* **큐 - 선입선출(FIFO, First In First Out)** |
| 38 | + |
| 39 | + 후입 선출과 반대로 가장 먼저 넣은 것이 가장 먼저 나오는 것을 선입 선출이라 한다. 이런 자료 구조를 큐(Queue)라 한다. |
| 40 | + |
| 41 | + |
| 42 | +이런 자료 구조는 각자 필요한 영역이 있다. 예를 들어서 선착순 이벤트를 하는데 고객이 대기해야 한다면 큐 자료구조를 사용해야 한다. |
| 43 | +**프로그램 실행과 메서드 호출에는 스택 구조가 적합하다.** |
0 commit comments