프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받고,
그 메모리를 목적에 따라서 여러 영역으로 나누어 관리한다.
📢 Method Area, Class Area, Code Area라고도 불린다.
- Java 파일은 크게
필드(field)
,생성자(constructor)
,메서드(method)
로 구성되어 있다.- Static 영역은 그 중 필드 부분에서 선언된 전역변수와 정적 멤버 변수(static 으로 선언되는 것)들의 데이터를 메모리에 상주시킨다.
- 정적 멤버 변수 = Static 변수와 Static 메서드가 합쳐진 것 (=클래스 멤버)
- 객체에 소속된 멤버가 아닌 클래스에 고정된 멤버다.
- 클래스 정보(멤버변수의 이름), static변수, 변수 정보(데이터타입, 접근제어자정보), 메서드 정보 등을 저장한다.
- static (전역)변수는 어디서든 접근이 가능하기 때문에 가능한 무분별한 사용을 하지 않는 것이 좋다.
- JVM이 동작해서 클래스가 로딩될 때 생성된다.
- 프로그램이 종료될 때까지 메모리에 남아있다.
- 스택 영역은 기본 자료형을 생성할 때 저장하는 공간으로, 임시적으로 사용되는 변수나 정보들이 저장되는 영역이다.
- 참조 자료형은 참조값만 저장한다. 이 참조값은 heap 영역에 존재하는 인스턴스(객체)를 가르킨다.
- 메서드를 호출할 때마다 개별적으로 스택이 생성되며 종료시 영역에서 해제된다.
- 컴파일 타임 시 할당 된다.
👉 기본 자료형의 지역변수 와, 매개변수의 데이터 값이 저장되며, 추가적으로 객체 생성 시 참조 주소값도 저장 !
- 참조형(Reference Type)의 데이터 타입을 갖는
객체
,배열
등은 Heap 영역에 저장된다.- new 키워드로 생성된 객체와 배열이 Heap 영역에 저장된다.
- 인스턴스의 실제 데이터는 Heap 영역에 올라간다. 저장된 메모리 위치가 다르기 때문에 static 메서드에서 외부 인스턴스 멤버에 접근할 수 없다.
- Heap은 참조형의 데이터 객체에 실제 데이터들이 담기는 공간 이고, 실제 데이터를 가지고 있는 Heap 영역의 참조값을 Stack 영역의 객체가 가지고 있는 것이다.
- new를 통해 인스턴스 객체를 생성했을 때, heap 영역에는 생성된 객체가 올라가고, Stack 영역에는 해당 객체에 대한 주소 값(Reference)이 저장
- 어떤 참조 변수도 Heap 영역에 있는 인스턴스를 참조하지 않게 된다면, GC(가비지 컬렉터)에 의해 메모리에서 사라지게 된다.
public class Student { int age = 10; int name = "현근"; } class Sample { public static void main(String[] args){ Student std1 = new Studet(); Student std2 = new Student(); } }
👉 stack영역에 저장된 참조변수가 heap영역의 데이터를 찾아서 사용한다.
new
키워드로 인스턴스가 생성되어질 때 메모리에서 가리키는 인스턴스는 서로 다름 !