자바의 메모리 구조는 크게 3개로 구분된다.
1. 메서드 영역 : 클래스 정보를 보관.
2. 스택 영역 : 실제 프로그램이 실행되는 영역. 메서드를 실행할 때마다 하나씩 쌓인다.
3. 힙 영역 : 객체(인스턴스)가 생성되는 영역. new를 사용하면 힙 영역에 생성된다. 배열도 힙 영역에 생성
조금 더 자세하게 살펴보자.
메서드 영역
프로그램을 실행하는데 필요한 공통 데이터를 관리한다.(클래스, 메서드)
- 클래스 정보 : 클래스에 실행 코드(바이트), 필드, 메서드와 생성자 등 모든 실행 코드가 존재.
- static 영역 : static 변수들을 보관한다.
- 런타임 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다.
스택 영역
자바를 실행하면 쓰레드별로 하나의 스택이 생성된다. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다.(쓰레드 하나당 1스택)
- 스택 프레임 : 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임이다.메서드를 호출하면 하나의 스택 프레임이 생성되고, 메서드가 종료되면 제거된다.
힙 영역
객체(인스턴스)와 배열이 생성되는 영역이다. GC가 이루어지는 주요 영역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거된다.
예를 들어 하나의 클래스로 100개의 인스턴스를 만들면 어떻게 될까?
힙 영역에는 100개의 인스턴스가 생성되지만, 메서드는 공통으로 가지고 있으므로 메서드 영역에 하나만 생성돼서 공통으로 쓴다.
staitc
static이라는 개념은 자바에서 중요하다. static 키워드를 통해 공용으로 사용하는 메서드, 변수를 만들 수 있다.
public class Data3 {
public String name;
public static int count;
public Data3(String name) {
this.name = name;
count++;
}
}
위 클래스는 count 변수를 static으로 만듦으로써 공통으로 관리할 수 있다.
인스턴스를 생성할 때마다 힙 영역에 새로운 인스턴스가 생성되지만, count는 static이므로 메서드 영역 안에 static 영역에서 관리한다.(즉 메서드 영역에서 관리한다)
그니깐 자바가 실행되면 JVM이 static 영역에 로드시킨다.
정적 변수, 메서드의 경우 인스턴스를 생성하지 말고 클래스에서 바로 접근하는 것이 옳바른 방법이다.(인스턴스를 생성해서 접근한다고 자칫 오해가 될 수 있으므로)
반응형
'JAVA 강의(인프런)' 카테고리의 다른 글
상속 (0) | 2023.12.03 |
---|---|
Final을 Static과 같이 사용해야 하는 이유 (1) | 2023.12.03 |
생성자 (0) | 2023.12.03 |
기본형 vs 참조형 (1) | 2023.11.30 |