방명록
- 변수 메모리 영역2024년 11월 24일 23시 15분 31초에 업로드 된 글입니다.작성자: 민발자728x90
변수의 종류와 저장위치
- Java에서 변수가 메모리에 저장되는 과정은 JVM의 메모리 구조와 밀접한 관련
- 자바의 메모리는 크게 메소드 영역, 힙 영역, 스택 영역, PC 레지터스, 네이티브 메소드 스택으로 구성
- 변수가 저장되는 주요 영역은 스택과 힙 영역
1. 변수의 종류와 저장 위치
- 지역 변수
- 저장 위치 : 스택 영역
- 메서드나 블록 내부에 선언된 변수
- 메서드 호출 시 스택에 생성, 호출이 끝나면 메모리에서 제거
- 기본 자료형은 값을 직접 저장
- 참조 자료형은 힙 영역에 저장된 객체 주소를 저장
- 인스턴스 변수
- 저장 위치 : 힙 영역
- 클래스 객체(instance)가 생성될 때 힙에 저장
- 객체가 소멸되면 GC(Garbage Collector)에 의해 제거
- 각 객체가 고유한 값을 가집
- 클래스 변수
- 저장 위치 : 메소드 영역
- 클래스 로드 시 메모리에 저장
- 프로그램이 종료될 때까지 메모리에 유지
- 모든 객체가 공유
2. 메모리 구조와 변수 저장 과정
- 메서드 영역
- 클래스 로드 시 메타데이터
- 클래스 변수(static 변수)
- 메서드 코드(바이트코드)
- 스택 영역
- 지역 변수와 메소드 호출 스택 프레임(call stack)
- 메서드가 호출되면 새로운 스택 프레임이 생성, 지역 변수는 스택 프레임에 저장
- 메소드가 종료되면 스택 프레임과 변수는 제거
- 힙 영역
- new 키워드로 생성된 객체와 배열
- 인스턴스 변수
- 객체가 생성되면 힙에 메모리가 할당(필요한 메모리를 계산해서 요청해 할당됨)
- 참조 변수는 힙의 객체 주소를 스택에 저장
3. 예제
public class MemoryExample { static int staticVar = 10; // 클래스 변수 (Method Area) public static void main(String[] args) { int localVar = 20; // 지역 변수 (Stack) Example obj = new Example(); // 참조 변수 (Stack)와 객체 (Heap) obj.instanceVar = 30; // 인스턴스 변수 (Heap) obj.display(); // 메소드 호출 -> 새로운 스택 프레임 생성 } } class Example { int instanceVar; // 인스턴스 변수 (Heap) void display() { int methodVar = 40; // 지역 변수 (Stack) System.out.println("methodVar: " + methodVar); } }
- 클래스 로드:
- MemoryExample 클래스 로드 시 staticVar가 메소드 영역에 저장
- main 메소드 호출:
- 스택 영역에 main 메소드의 스택 프레임이 생성
- 지역 변수 localVar = 20이 스택에 저장
- 참조 변수 obj가 생성되고, 이는 힙에 생성된 Example 객체를 참조
- 객체 생성:
- new Example()로 생성된 객체는 힙에 저장
- obj는 객체의 주소를 스택에 저장
- 객체의 인스턴스 변수 instanceVar가 힙에 저장
- display 메소드 호출:
- 스택 영역에 새로운 스택 프레임이 생성
- methodVar = 40은 스택에 저장
- 메소드 종료 시, 스택 프레임과 지역 변수는 제거
4. 정리
- 스택 영역: 메소드 호출과 지역 변수 저장
- 힙 영역: 객체와 인스턴스 변수 저장
- 메소드 영역: 클래스와 static 변수 저장
- 변수 저장 과정은 코드의 실행 흐름에 따라 스택과 힙에서 동적으로 변화
스택 프레임과 GC의 역할 차이
- 메서드 호출로 생성된 스택 프레임은 CG로 제거?
- JVM의 스택 관리 메커니즘에 의해 자동으로 처리
- 스택 프레임과 GC
- 스택 프레임 관리스택은 메모리를 자동으로 관리하는 LIFO 구조
- 메서드가 호출되면 스택에 스택 프레임 생성, 종료되면 해당 스택 프레임이 자동으로 제거
- 지역 변수, 메서드 호출 정보(매개변수, 반환 주소 등) 저장
- 힙 영역과 GCGC는 힙 영역에서 더 이상 참조되지 않는 객체를 정리하는 역할
- 스택과 달리 힙은 명시적으로 메모리를 할당, GC가 해당 메모리를 회수할 때까지 유지됨
- GC는 객체나 배열과 같은 힙 메모리에만 영향
- GC는 왜 스택 프레임을 관리하지 않을까?
- GC는 동적으로 생성된 객체를 관리
- 스택 프레임과 그 안의 변수는 메모리 구조상 짧은 생명 주기를 가지고 명확한 생성-제거 시점이 있으므로 GC로 관리하지 않음
728x90'정리 > Java' 카테고리의 다른 글
[stream] map과 forEach (0) 2024.11.29 [자바] 아스키코드 (0) 2023.11.13 [JAVA] 문자열 곱하기 repeat메서드 (0) 2023.10.16 자바의 정석 148~157강 ch13 쓰레드 (1) 2023.10.12 자바의 정석 142~147강 ch12 지네릭스, 열거형, 애너테이션(2) (0) 2023.09.16 다음글이 없습니다.이전글이 없습니다.댓글