자바 실행 시, 하나의 실행 스택이 생성되며 각 스택 프레임은 지역변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다.
스택 프레임 : 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임
메서드를 호출할 때마다 하나의 스택 프레임이 쌓이고, 메서드가 종료되면 해당 스택 프레임이 제거된다. ( 자료구조 Stack 처럼 동작한다. )
primitive 타입의 데이터(byte,short,int,long,double,boolean 등)에 해당되는 지역변수, 매개변수 데이터 값이 저장된다.
참고 : 스택 영역은 각 쓰레드 별로 하나의 실행 스택이 생성되며 쓰레드 수 만큼 스택 영역이 생성된다.
자바는 스택 영역을 사용해서 메서드 호출과 지역 변수(매개변수 포함)를 관리
메서드를 계속 호출하면 스택 프레임이 계속 쌓임
지역 변수(매개변수 포함)는 스택 영역에서 관리
스택 프레임이 종료되면 지역변수도 함께 제거되며 모든 스택 프레임이 종료되면 프로그램이 종료
힙 영역에 있는 객체의 주소값을 갖고 있는 참조 변수도 스택 영역에 있다.
객체(인스턴스)와 배열이 생성되는 영역이다.
JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임시 동적으로 할당하여 사용한다.
참조형(Reference Type) 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장된다.
객체는 힙 영역에서 관리가 된다.
힙 영역에 있는 오브젝트들을 가리키는 참조 변수는 스택에 적재
가비지 컬렉션(GC)이 이루어지는 주요 영역이며, 더이상 참조되지 않은 객체는 GC에 의해 제거된다.
힙 영역 외부가 아닌 힙 영역 안에서만 인스턴스끼리 서로 참조하는 경우에도 GC의 대상이 되어 제거된다.
프로그램을 실행하는데 필요한 공통 데이터를 관리한다.
이 영역은 프로그램의 모든 영역에서 공유된다.
클래스 정보
static 영역
런타임 상수 풀
프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다.
예를 들어서 프로그램에 "hello"라는 리터럴 문자가 있으면 이런 문자를 공통으로 묶어서 관리
프로그램을 효율적으로 관리하기 위한 상수들도 관리한다.
JVM이 동작해서 클래스가 로딩 될 때 생성된다.
메서드 영역에 있는 것은 어디서나 접근이 가능하다.
클래스 변수(static)와 메서드는 무조건 메서드 영역에 존재한다.
메서드 코드는 메서드 영역에서 관리한다
객체가 생성되더라도, 힙 영역안에서 해당 클래스의 인스턴스 값들이 필드값과 함께 저장되지만
메서드에 대한 새로운 메모리 할당에 대해서는 없다.
메서드는 메서드 영역에서 공통으로 관리되고 실행된다.
따라서, 인스턴스의 메서드를 호출하면 실제로 메서드 영역에 있는 코드를 불러서 수행한다.
클래스의 멤버 변수(필드) 종류
인스턴스 변수 : static이 붙지 않은 멤버 변수
static이 붙지 않은 멤버 변수는 인스턴스를 생성해야 사용할 수 있고, 인스턴스에 소속되어 있다.
즉, 힙 영역에 관리되어진다.
인스턴스 변수는 인스턴스를 만들때마다 새로 만들어진다.
클래스 변수 : static이 붙은 멤버 변수
클래스 변수, 정적 변수, static 변수 등으로 부른다.
static이 붙은 멤버 변수는 인스턴스와 무관하게 클래스에 바로 접근이 가능하며, 클래스에 소속되어 있다.
클래스 변수는 자바 프로그램을 시작할 때 딱 1개가 만들어진다.
메서드 영역에서 관리되어진다.
클래스의 메서드 종류
인스턴스 메서드
static 메서드
지역 변수는 스택 영역에 있는 스택 프레임에 보관
메서드가 종료되면 스택 프레임도 제거되는데 해당 스택 프레임에 포함된 지역변수도 함께 제거
생명주기 짧음
인스턴스에 있는 멤버 변수
힙 영역에 사용된다.
GC(가비지 컬렉션)가 발생하기 전까지 생존하기 때문에 지역변수보다 생명 주기가 길다.
메서드 영역의 static 영역에 보관되는 변수
메서드 영역은 프로그램 전체에 사용되는 공용 공간
클래스 변수는 해당 클래스가 JVM에 로딩 되는 순간 생성되고 JVM이 종료될 때까지 생명주기가 이어진다.
생명주기가 길다.
static 메서드만 가지고 있는 클래스인 경우에는 생성자를 제한함으로써 굳이 인스턴스를 만들 필요 없게 해야한다.