본문 바로가기

# 02/Java

[Java] 자바 메모리 구조

반응형

Method Area (Static Area), Stack, Heap






Method Area (Static Area)


JVM이 구동될 때 생성되며 모든 스레드가 공유하는 영역.


JVM 구동 중 사용될 클래스 파일을 읽고 클래스 별로 runtime constant pool(런타임 상수 풀), file data(필드 데이터), method data(메서드 데이터), constructor(생성자) 등을 저장


1. 필드 정보 : 멤버변수 이름, 데이터 타입, 접근 제어자 등의 정보

2. 메서드 정보 : 메서드 이름, 리턴타입, 매개변수, 접근제어자 등의 정보

3. 상수 풀(String Constant Pool)

- Type에서 사용된 상수를 저장하는 곳(중복이 있을 시 기존의 상수 사용)

- 문자 상수, 타입, 필드, Method reference도 상수 풀에 저장

- final class 변수의 경우에도 상수 풀에 값 복사

4. Static 변수

- 모든 객체가 공유 할 수 있고, 객체 생성없이 접근 가능

5. 프로그램 종료까지 메모리에 상주

6. Static 영역 데이터는 프로그램 시작 ~ 종료 시까지 메모리에 남아있다.

- 장점 : 즉 프로그램이 종료될 까지 어디서든 사용 가능

- 단점 : 무분별하게 많이 사용하다 보면 메모리가 부족






Stack


스택은 각 쓰레드마다 자신만의 stack을 가진다.

즉, 스레드 하나가 새롭게 생성되는 순간 해당 스레드를 위한 stack도 함께 생성되며, 각 스레드에서 다른 스레드의 stack영역에는 접근할 수 없다.


Heap 영역에 생성된 Object 타입의 데이터의 참조값이 할당된다.


원시타입의 데이터가 값과 함께 할당 된다. 원시타입의 데이터들에 대해서는 참조값이 아닌 실제 값을 저장한다.


지역변수들은 scope에 따른 visibility를 가진다.

전역변수가 아닌 지역변수가 어떤 함수내에서 Stack에 할당 된 경우, 해당 지역변수는 다른 함수에서 접근할 수 없다.

함수가 종료 된 경우 stack에서 pop 되어 사라진다. 


메서드를 호출 시 프레임을 추가(push)하고 메서드가 종료 되면 해당 프레임을 제거(pop)


실행 순서에 따라 생성되고 소멸된다.(Last In First Out(LIFO))






Heap


Heap 영역에는 주로 긴 생명주기를 가지는 데이터들이 저장된다.

대부분의 오브젝트는 크기가 크고, 서로 다른 코드 블럭에서 공유되는 경우가 많다.


애플리케이션의 모든 메모리 중 stack 에 있는 데이터를 제외한 부분이라고 보면 된다.


모든 Object 타입은 heap 영역에 생성된다. 객체 배열이 생성되는 영역.


몇개의 스레드가 존재하든 상관없이 단 하나의 heap 영역만 존재한다.


heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수가 stack 에 올라가게 된다.

해당 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다.


만약 참조하는 변수, 필드가 없으면 JVM이 Garbage Collector를 실행하여 해당 객체를 제거한다.


1. 객체(인스턴스 - new 연산자로 생성된 객체)가 저장되는 영역

2. 프로그램 실행 중 생성되는 모든 객체는 Heap 영역에 동적으로 할당

- Garbage Collector 를 통해 메모리 반환

3. 참조형(Reference Type)의 데이터 타입을 갖는 객체(인스턴스), 배열 등은 Heap 영역에 데이터가 저장된다.

- 실제 데이터가 저장된 Heap 영역의 참조값(reference value, 해시코드/메모리에 저장된 주소를 연결해주는 값)을 저장








출처 - https://goddaehee.tistory.com/149

출처 - https://yaboong.github.io/java/2018/05/26/java-memory-management/

반응형