1. OS 메모리 구조와 JVM 메모리 구조

[OS 메모리 구조]
: 윈도우나 리눅스에서 프로그램을 실행하면(프로세스가 생성되면) OS는 프로세스 하나를 위해 메모리를 아래와 같이 할당해준다.
- Code 영역(Text 영역): 실행할 프로그램 코드가 들어있다. (0, 1로된 기계어)
- Data 영역: 전역변수, static 변수을 저장한다.
- 프로그램이 시작될 때 할당되고, 프로그램이 종료될 때까지 유지된다.
- 어디서든 접근할 수 있는 변수들이 모여있는 곳
- Initialized Data 영역: 명시적으로 초기화한 전역변수, static변수가 저장되는 곳
- BSS 영역: 초기화되지 않은 전역변수, static 변수가 저장되는 곳
- Heap 영역: 사용자가 직접 관리하는 메모리 영역 (동적할당)
- Stack 영역: 지역변수, 매개변수, 리턴주소가 저장되는 메모리 영역 (자동으로 생성되고 삭제된다)
[JVM 메모리 구조]
: JVM도 OS 입장에서는 하나의 프로세스이다. heap 영역을 거대하게 때어주고 그 메모리를 JVM이 다시 쪼개서 관리하다.
| 저장 데이터 | 생명 주기(Life Cycle) | 특징 | |
| Static (Method) | 클래스 정보, static 변수 | 프로그램 시작 ~ 종료 | 모든 곳에서 공유됨. |
| Stack | 지역변수, 매개변수 | 메소드 호출 ~ 리턴(종료) | 자동 초기화 X, LIFO 구조. |
| Heap | 객체(new로 생성된 인스턴스) | 객체 생성 ~ GC 수거 | 자동 초기화 O, GC가 관리. |
* Stack 영역은 자동 초기화가 안되지만, Heap 영역은 자동 초기화가 된다. (Stack과 Heap의 가장 큰 차이)
2. static, final 키워드
| static (클래스 변수) | final (변경 금지) | |
| 클래스 (Class) | 상속 금지 | |
| 필드 (Variable) | 모든 객체가 값을 공유 (클래스 변수) | 값 변경 금지 (한 번 초기화하면 끝) |
| 메소드 (Method) | 객체 생성 없이 호출 가능 (ClassName.run()) | 오버라이딩 금지 (부모의 기능을 못 바꿈) |
* 상수 정의 방법
: 변하지 않으면서 (final) + 어디서나 공유해서 쓸 수 있는 (static)으로 정의한다.
// 접근제어자 static final 데이터타입 상수명 = 값;
public static final double PI = 3.14159;
'프로젝트 > Java' 카테고리의 다른 글
| [Java] 6. 예외처리 (0) | 2026.02.06 |
|---|---|
| [Java] 5. 문자열 (String, StringBuilder, StringBuffer), 자바 표준 입출력 (0) | 2026.01.29 |
| [Java] 4. 추상 클래스, 인터페이스 (0) | 2026.01.28 |
| [Java] 3. Object 클래스 (toString, equals, hashCode, clone) (0) | 2026.01.28 |
| [Java] 2. this, super / 다형성 (Up-casting, Down-casting) (0) | 2026.01.14 |