728x90
자바 프로그램이 실행될 때, 어떤 방식으로 메모리를 사용하며 각 영역이 어떤 역할을 하는지 이해하는 것은 매우 중요하다.자바는 메모리를 자동으로 관리하는 기능을 제공하지만, 이를 제대로 이해하면 프로그램의 성능 최적화와 디버깅에 큰 도움이 된다.
이 강의에서는 JVM(Java Virtual Machine)의 메모리 구조와 실행 흐름을 분석하고, 코드와 함께 설명한다.
자바 프로그램이 실행되는 과정
자바 코드가 실행되기까지의 과정은 다음과 같다.
- 자바 소스 코드 (.java) 작성
- 자바 컴파일러(javac)로 바이트코드(.class) 변환
- JVM(Java Virtual Machine)이 바이트코드를 실행
자바 프로그램은 운영 체제에서 직접 실행되는 것이 아니라 JVM을 통해 실행된다.
JVM은 운영 체제에 맞게 코드를 해석하고 실행하는 역할을 한다.
JVM 메모리 구조 이해
자바 프로그램이 실행될 때 JVM은 다음과 같은 메모리 영역을 사용한다.
메모리영역 | 역활 |
메서드 영역 | 클래스 정보, static 변수, 상수 저장 |
힙 영역 | 객체(instance)와 인스턴스 변수 저장 |
스택 영역 | 메서드 호출 시 생성되는 지역 변수 저장 |
PC 레지스터 | 현재 실행 중인 JVM 명령어의 주소 저장 |
네이티브 메서드 스택 | C/C++ 등 네이티브 코드 실행 시 사용 |
메모리 영역별 상세 설명
메서드 영역
- 클래스의 구조 정보(메서드, 변수)와 static 변수가 저장된다.
- 프로그램 실행 중 한 번만 로드되며, 모든 객체가 공유할 수 있다.
class Example {
static int count = 0; // 메서드 영역에 저장됨
}
힙 영역
- new 키워드를 사용해 생성된 객체가 저장되는 공간이다.
- 모든 객체는 힙 영역에 저장되며, 가비지 컬렉터(GC)에 의해 자동으로 관리된다.
class Person {
String name; // 힙 영역에 저장됨
}
Person p1 = new Person(); // p1 객체는 힙에 생성됨
스택 영역
- 메서드가 실행될 때마다 호출 스택에 프레임이 생성되며, 지역 변수가 저장된다.
- 메서드 실행이 끝나면 스택 프레임이 제거된다
public class StackExample {
public static void main(String[] args) {
int x = 10; // 스택에 저장됨
printNumber(x);
}
public static void printNumber(int num) {
System.out.println(num);
}
}
프로그램 카운터
- JVM이 현재 실행 중인 명령어의 위치를 저장하는 공간이다.
- 메서드 실행 중 어느 부분을 실행하고 있는지 추적하는 역할을 한다.
네이티브 메서드 스택
- C, C++ 등의 네이티브 코드와 연동할 때 사용되는 영역이다.
- 일반적인 자바 개발에서는 직접 다룰 일이 거의 없다.
가비지 컬렉션
- JVM은 힙 영역에서 사용하지 않는 객체를 자동으로 정리하는 가비지 컬렉션(GC)을 수행한다.
- System.gc()를 호출하면 GC를 직접 요청할 수 있지만, 실행 여부는 JVM이 결정한다
class Test {
int value;
}
public class GarbageCollectionExample {
public static void main(String[] args) {
Test t1 = new Test(); // 객체 생성 (힙 영역에 저장)
t1 = null; // 참조 제거 → 가비지 컬렉션 대상
System.gc(); // GC 요청 (실제 실행 여부는 JVM이 결정)
}
}
실전 문제: 메모리 활용 이해하기
- 힙과 스택의 차이를 설명하시오.
- static 변수는 어디에 저장되는가?
- 가비지 컬렉션이 동작하는 방식은?
- CPU(요리사) → 코드를 실행하는 역할
- 코드(레시피) → 프로그램이 실행될 명령어
- Heap(냉장고) → 프로그램이 사용하는 데이터 저장
- Stack(조리대) → 실행 중인 변수 및 메서드 저장
- Garbage Collector(쓰레기통) → 필요 없는 데이터를 자동으로 정리
728x90
반응형
'☕Java > ☕입문편' 카테고리의 다른 글
Java 상속이란? + 문제풀이 (1) | 2024.12.15 |
---|---|
자바 초보자를 위한 Constructor (생성자) 활용법 – 주소록 프로그램 만들기 (0) | 2024.12.11 |
[Java 9강] 클래스와 객체 개념 (1) | 2024.12.10 |
[Java 8강] 메서드 완벽 가이드(함수) (1) | 2024.12.09 |
[Java 7강] 배열과 ArrayList 완벽 가이드 (1) | 2024.12.09 |