스택/힙/메서드 영역
붕어빵과 붕어빵틀에 비유
자바의 메모리 구조는 크게 스택 영역, 메서드 영역, 힙 영역 3개로 나눌 수 있다.
메서드 영역
- 클래스 정보를 보관하는 영역. 이때,
클래스 정보
==붕어빵 틀
- 클래스 정보를 보관하는 영역. 이때,
스택 영역
- 실제 프로그램이 실행되는 영역
- 메서드를 실행할 때마다 하나씩 쌓인다.
힙 영역
- 객체(인스턴스)가 생성되는 영역
- new 명령어를 사용하면 이 영역이 이용됨
- 붕어빵 틀로부터 생성된 붕어빵이 존재하는 공간!
- 배열도 이 영역에 생성됨
메서드 영역
- 프로그램을 실행하는데 필요한 공통 데이터를 관리
- 클래스 정보, static 영역, 상수 풀이 있음
- 프로그램의 모든 영역에서 메서드 영역이 공유된다.클래스 정보
- 모든 실행 코드가 존재 (클래스의 실행 코드(byte 코드), 필드, 메서드와 생성자 코드 등)static 영역
- static 변수들을 보관상수 풀
- 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관
- ex) 프로그램에 "hello"라는 리터럴 문자가 있으면, 이런 문자들을 공통으로 묶어서 관리
- 프로그램을 효율적으로 관리하기 위한 상수들을 관리
메서드 코드
- 자바에서 특정 클래스로 100개의 인스턴스를 생성하면, 힙 메모리에 100개의 인스턴스가 생김.
- 각각의 인스턴스는 내부에 변수 & 메서드를 가짐.
- 같은 클래스로부터 생성된 객체더라도 인스턴스 내부의 변수 값은 서로 다를 수 있다. 그래도, 메서드는 공통된 코드를 공유한다.
-> 객체가 생성될 때, 인스턴스 변수에는 메모리가 할당되지만, 메서드에 대한 새로운 메모리 할당은 없다.
=> 인스턴스의 메서드를 호출하면, 실제로는 메서드 영역에 있는 코드를 불러서 수행하는 것!
스택 영역
- 자바를 실행하면, 하나의
실행 스택
이 생성된다. - 각
스택 프레임
은지역 변수
,중간 연산 결과
,메서드 호출 정보
등을 포함한다.스택 프레임
- 스택 영역에 쌓이는 하나의 네모 박스
- 메서드를 호출할 때마다 하나의 스택 프레임이 쌓인다.
- 메서드가 종료되면 해당 스택 프레임이 제거된다.
- 더 정확히는, 스택 영역은 각 스레드별로 하나의 실행 스택이 생성된다.
따라서, 스레드 수 만큼 스택 영역이 생성된다.
- 더 정확히는, 스택 영역은 각 스레드별로 하나의 실행 스택이 생성된다.
스택영역과 자바 코드
package memory;
public class JavaMemoryMain1 {
public static void main(String[] args) {
System.out.println("main start");
method1(10);
System.out.println("main end");
}
static void method1(int m1) {
System.out.println("method1 start");
int cal = m1 * 2;
method2(cal);
System.out.println("method1 end");
}
static void method2(int m2) {
System.out.println("method2 start");
System.out.println("method2 end");
}
}
main start
method1 start
method2 start
method2 end
method1 end
main end
- 자바는 스택 영역을 사용해서
메서드 호출
과지역 변수(매개변수 포함)
를 관리한다. - 메서드를 계속 호출하면
스택 프레임
이 계속 쌓인다. - 스택 프레임이 종료되면 지역 변수도 함께 제거된다.
- 스택 프레임이 모두 제거되면 프로그램도 종료된다.
힙 영역
- 객체와 배열이 생성되는 영역
- 가비지 컬렉션(GC)이 이루어지는 주요 영역
- 더이상 참조되지 않는 객체는 GC에 의해 제거됨
Garbage Collection(GC)
- 자바의 메모리 관리 방법 중의 하나
- JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중에서, 필요 없게 된 메모리 객체(garbage)를 모아서 주기적으로 제거하는 프로세스
💡 PC Register
스레드가 생성될 때마다 생기는 공간. 스레드가 실행하게 될 명령에 대한 부분을 기록한다.
💡 Native Method Stack
자바 프로그래밍 언어 이외의 언어로 작성된 메서드(Native Method)를 지원하기 위한 스택
스택 영역과 힙 영역이 같이 쓰일 때
Data
package memory;
public class Data {
private int value;
public Data(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
JavaMemoryMain2
package memory;
public class JavaMemoryMain2 {
public static void main(String[] args) {
System.out.println("main start");
method1();
System.out.println("main end");
}
static void method1() {
System.out.println("method1 start");
Data data1 = new Data(10);
method2(data1);
System.out.println("method1 end");
}
static void method2(Data data2) {
System.out.println("method2 start");
System.out.println("data.value=" + data2.getValue());
System.out.println("method2 end");
}
}
// method1() 에서 Data 클래스의 인스턴스를 생성한다.
// method1() 에서 method2() 를 호출할 때 매개변수에 Data 인스턴스의 참조값을 전달한다
main start
method1 start
method2 start
data.value=10
method2 end
method1 end
main end
1. main()
실행
2. method1()
실행
3. method2()
실행
4. method2()
종료
5. method1()
종료
6. method1()
종료 직후
'Java > 문법' 카테고리의 다른 글
[JAVA 중급 스터디 - 6회차] final (0) | 2024.03.20 |
---|---|
[JAVA 중급 스터디 - 4~5회차] static (0) | 2024.03.20 |
[JAVA 중급 스터디 - 2회차] 접근 제한자와 캡슐화 (0) | 2024.03.08 |
[JAVA 중급 스터디 - 1회차] 기본형/참조형, Wrapper Class생성자, 패키지 (0) | 2024.03.08 |
[Java] 배열의 공통 원소 집합 구하기 (0) | 2024.03.02 |