메서드 영역도 안에서 세부적으로 세가지 공간으로 나누어진다.
첫 번째로 Method영역의 Static저장공간이다.
Static저장공간에는 Class들과 Static키워드를 이용해 선언된 메서드 및 필드 변수들, 또 WrapperClass의 여러 메서드와 같이 자바에서 지원해주는 여러가지 Static메서드들이 있다.
JVM(Java Virtual Machine)의 시작 될 때 맨 처음에 실행되는 CL(ClassLoader)에 의해서 Static공간에 생성된다.
이렇게 Static공간에 생성된 클래스와 메서드, 변수들은 Static공간안에 고정적인 저장공간을 할당받고 클래스의 경우 언제든지 new키워드를 통해 인스턴스를 호출 할 수 있고 메서드와 필드 변수들 또한 도트 연산자를 통해 언제든지 호출해서 사용할 수 있다.
String.valueOf() // "클래스명 도트연산자 메서드명" 으로 호출되는 예시 코드
두 번째로 프로그램 실행코드가 저장 되는 영역이다.
프로그램 코드들이 저장되는 공간도 Merthod영역에 저장된다.
세 번째로 상수들이 저장되는 상수 풀 영역이다.
Static키워드만 가지고 선언된 static변수들은 Static영역에 저장되지만 우리가 흔히 상수 라고 부르는 (ex) PI = 3.14) 예시와 같은 static키워드와 final키워드 두 키워드가 함께 사용 되어 상수 형태로 선언되어있는 변수들은 상수 풀에 저장된다.
Math.PI // "클래스명 도트연산자 상수 변수명"로 호출되는 예시 코드
헷갈리지 말아야 할 부분은 static 키워드만으로 선언되어 Static공간에 저장되는 static 필드 변수와 static키워드와 final키워드 두 키워드가 함께 사용 되어 상수 형태로 선언되어 상수 풀에 저장되는 상수 변수는 다른 개념이다.
final 키워드와 함께 선언하면 객체 및 변수를 선언과 동시에 알맞은 타입의 값으로 초기화해 줘야한다.
스택 영역은 프레임이라는 단위로 저장공간이 나눠진다.
프레임이라는 단위는 일반적으로 선언된 메서드가 가지는 저장공간이다, 메서드가 호출될때 하나의 프레임을 할당받고 메서드가 종료될 때 프레임 통째로 삭제 되면서 할당이 해제된다.
메서드 안의 지역변수와 파라미터로 넘어온 매개변수들이 프레임이라는 영역안에 저장되고 메서드의 로직에 의해 사용되고 삭제되고를 반복하다가 메서드가 종료될 때 프레임 통째로 삭제된다.
Method영역에 저장되어있는 Class들을 new키워드를 통해 인스턴스로 호출헤서 변수에 저장했을 때 해당 인스턴스 객체와 각 배열들이 Heap영역에 저장되고 인스턴스 변수는 해당 객체가 저장되어있는 Heap영역의 주소값을 가지게 된다. 또 한 배열을 정의하는 변수는 배열이 저장된 Heap영역의 주소 값을 가지고 있고 실제 배열 데이터는 Heap영역에 저장된다. Heap영역은 동적으로 할당 되고 삭제되는 과정을 반복한다.