프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받고
그 메모리를 목적에 따라서 여러 영역으로 나누어 관리한다.
1. Static 영역
(Method Area, Class Area, Code Area라고도 불린다.)
Java 파일은 크게 필드(field), 생성자(constructor), 메서드(method)로 구성되어 있는데
Static 영역은 그 중 필드 부분에서 선언된 전역변수와 정적 맴버 변수(static 으로 선언되는 것)들의 데이터를 메모리에 상주시킨다.
● 정적 맴버 변수 = Static 변수와 Static 메서드가 합쳐진 것 (=클래스 멤버)
● 객체에 소속된 맴버가 아닌 클래스에 고정된 맴버다.
● 클래스 정보(맴버변수의 이름), static변수, 변수 정보(데이터타입, 접근제어자정보), 메서드 정보 등을 저장한다.
● static (전역)변수는 어디서든 접근이 가능하기 때문에 가능한 무분별한 사용을 하지 않는 것이 좋다.
● JVM이 동작해서 클래스가 로딩될 때 생성된다.
● 프로그램이 종료될 때까지 메모리에 남아있다.
2. Stack 영역
스택 영역은 기본 자료형을 생성할 때 저장하는 공간으로, 임시적으로 사용되는 변수나 정보들이 저장되는 영역이다.
참조 자료형은 참조값만 저장한다. 이 참조값은 heap 영역에 존재하는 인스턴스(객체)를 가르킨다.
● 메서드를 호출할 때마다 개별적으로 스택이 생성되며 종료시 영역에서 해제된다.
● 컴파일 타임 시 할당 된다.
3. Heap 영역
참조형(Reference Type)의 데이터 타입을 갖는 객체, 배열 등은 Heap 영역에 저장된다.
new 키워드로 생성된 객체와 배열이 Heap 영역에 저장된다.
인스턴스의 실제 데이터는 Heap 영역에 올라간다. 저장된 메모리 위치가 다르기 때문에 static 메서드에서 외부 인스턴스 멤버에 접근할 수 없다.
● Heap은 참조형의 데이터 객체에 실제 데이터들이 담기는 공간이고, 실제 데이터를 가지고 있는 Heap 영역의 참조값을 Stack 영역의 객체가 가지고 있는 것이다.
● new를 통해 인스턴스 객체를 생성했을 때, heap 영역에는 생성된 객체가 올라가고, Stack 영역에는 해당 객체에 대한 주소 값(Reference)이 저장
●어떤 참조 변수도 Heap 영역에 있는 인스턴스를 참조하지 않게 된다면, GC(가비지 컬렉터)에 의해 메모리에서 사라지게 된다.
참고 문헌 : Do it! 자바 완전정복
'Java > 자바 이론' 카테고리의 다른 글
[Java] 자바 super 키워드 & super() 메서드 (0) | 2022.06.30 |
---|---|
[Java] 자바 클래스 상속의 장점과 특징 (2) | 2022.06.30 |
[Java] 클래스 관계 HAS-A (포함) / IS-A (상속) 정리 (2) | 2022.06.29 |
[Java] 클래스 내부 구성 요소 3가지 (필드, 생성자, 메서드 + This) (0) | 2022.06.27 |
[Java] String 객체 특징 ( ==와 equals의 차이점 ) (1) | 2022.06.23 |