메모리 구조(Method, Stack, Heap)
- 자바 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라서 여러 영역으로 나누어 관리를 한다.
- JVM의 메모리 공간(Runtime Data Area)은 크게 Method(Static)영역, Stack영역, Heap영역으로 구분되고 데이터 타입(자료형)에 따라 각 영역에 나눠서 할당 되게 된다.
1. 변수의 종류
Ex
public class Variable {
public static int age = 20;
int height = 60;
public static void main(String[] args) {
int size = 50;
}
}
생성시기
- 클래스변수: 클래스가 메모리에 올라갈 때
- 인스턴스변수: 인스턴스가 생성되었을 때
- 지역변수 / 매개변수: 위치하고 있는 메서드가 수행되었을 때
2. Method(Static) 영역
- JVM이 동작해서 클래스가 로딩될 때 생성
- JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 상수(final), 생성자(constructor)와 메소드(method) 등을 저장하는 공간
- Method(Static) 영역에 있는 것은 어느곳에서나 접근 가능
- Method(Static) 영역의 데이터는 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있다. 그래서 static 메모리에 있는 데이터들은 프로그램이 종료될 때까지 어디서든 사용이 가능하다.
3. Stack 영역
- 기본 자료형(원시 자료형, Primitive type), 지역변수, 매개변수가 저장되는 메모리.(int, double, boolean, byte)
- 메서드 내부의 기본자료형에 해당하는 변수 적재.
- Heap 영역에 생성된 데이터의 참조값이 할당됨
- 메소드가 호출될 때 메모리에 할당, 메서드 종료시 메모리에서 삭제됨.
- 자료구조 Stack의 구조이다, LIFO(Last In First Out)
- 각 Thread 마다 자신만의 Stack 을 가진다. (1:1) - (Thread : Stack)
- Thread는 내부적으로 Static, Heap, Stack 영역을 가진다.
- Thread는 다른 Thread에 접근 할 수 없지만, static, Heap 영역을 공유하여 사용 가능.
매개변수 args
와 지역변수 number
, age
가 Stack 영역에 담아진다.
4. Heap 영역
- JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역 참조형(Reference Type) 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장 되는 공간
- 단, Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수는 stack에 적재
- Heap 영역은 Stack 영역과 다르게 보관되는 메모리가 호출이 끝나더라도 삭제되지 않고 유지된다.그러다 어떤 참조 변수도 Heap 영역에 있는 인스턴스를 참조하지 않게 된다면, GC(가비지 컬렉터)에 의해 메모리에서 청소된다.
- stack은 스레드 갯수마다 각각 생성되지만, heap은 몇개의 스레드가 존재하든 상관없이 단 하나의 heap 영역만 존재
- 생성자 new Account() 를 호출 시
생성자를 호출하면 heap 영역에 Account
클래스 인스턴스 변수들이 저장되게 되고, stack 영역의 지역변수 account
에 주소값으로 연결되게 된다.
- 마지막 코드가 실행되면 main 스택 프레임은 스택 영역에서 제거된다.
스택 영역은 메서드의 끝을 알리는 닫는 중괄호 }
를 만나면 자동으로 메모리에서 제거된다.
그러나 힙 영역에는 여전히 객체 데이터가 메모리에 상주되게 된다.
- 가비지 컬렉터(GC)가 힙 영역을 청소한다.
- 가비지 컬렉터는 힙 영역에 참조되지 않고 남아버린 고아 객체들을 식별해 힙 영역을 청소 해주는 역할을 한다.
- 추가로 코드 실행이 모두 끝나면 Method(Static) 영역도 비워지게 된다.
- 힙 메모리는 애플리케이션의 모든 부분에서 사용되며, 반면에 스택 메모리는 하나의 스레드가 실행될 때 사용.그래서 힙 과 메서드 공간에 저장된 객체는 어디서든지 접근이 가능하지만, 스택 메모리는 다른 스레드가 접근할 수 없다.
- 언제든지 객체가 생성되면 항상 힙 공간에 저장되며, 스택 메모리는 힙 공간에 있는 객체를 참조만 한다.즉, 스택 메모리는 primitive 타입의 지역변수와 힙 공간에 있는 객체 참조 변수만 갖고 있다.
- 스택메모리의 생명주기는 매우 짧으며, 힙 메모리는 애플리케이션의 시작부터 끝까지 살아남는다.
참고