1. Static Memory
- 정의:
static
메모리는 프로그램이 실행되는 동안 고정된 메모리 영역에 할당됩니다. 이 영역의 메모리는 프로그램이 시작될 때 할당되고, 프로그램이 종료될 때까지 유지됩니다.
- 특징:
- 정적 데이터: 전역 변수, 정적 변수, 상수 등이 여기에 저장됩니다.
- 전역적 접근: 메모리 주소가 변하지 않으므로, 프로그램의 전체 실행 동안 동일한 값을 유지합니다.
- 메모리 할당: 컴파일 타임에 메모리가 할당되며, 실행 중에 변경되지 않습니다.
- 예:
int global_var;
또는static int static_var;
같은 변수.
- 장점:
- 빠른 접근: 메모리 주소가 일정하므로 접근이 빠릅니다.
- 상태 유지: 프로그램 전체에서 변수를 지속적으로 사용할 수 있습니다.
- 단점:
- 유연성 부족: 메모리 크기나 변수의 수를 실행 중에 조정할 수 없습니다.
2. Heap Memory
- 정의:
heap
메모리는 동적 메모리 할당을 위해 사용됩니다. 프로그램 실행 중에 필요에 따라 메모리를 할당하고 해제할 수 있습니다.
- 특징:
- 동적 데이터:
malloc
,new
,free
,delete
와 같은 함수를 사용하여 메모리를 동적으로 할당하고 해제합니다. - 메모리 관리: 프로그래머가 명시적으로 메모리를 할당하고 해제해야 합니다.
- 메모리 할당: 실행 중에 메모리를 동적으로 할당하고 해제할 수 있습니다.
- 장점:
- 유연성: 필요한 만큼의 메모리를 동적으로 할당할 수 있습니다.
- 크기 조정: 프로그램의 요구에 따라 메모리 크기를 조정할 수 있습니다.
- 단점:
- 메모리 누수: 할당한 메모리를 해제하지 않으면 메모리 누수가 발생할 수 있습니다.
- 속도: 메모리 할당과 해제가 비교적 느릴 수 있습니다.
3. Stack Memory
- 정의:
stack
메모리는 함수 호출과 관련된 지역 변수와 매개변수를 저장하는 데 사용됩니다. LIFO(Last In, First Out) 구조로 작동합니다.
- 특징:
- 지역 데이터: 함수의 지역 변수, 매개변수, 함수 호출의 반환 주소 등을 저장합니다.
- 자동 관리: 함수 호출 시 자동으로 메모리가 할당되고, 함수 종료 시 자동으로 해제됩니다.
- 메모리 할당: 함수 호출 시 스택 프레임이 생성되며, 함수가 끝나면 스택 프레임이 제거됩니다.
- 장점:
- 빠른 접근: 스택 메모리는 할당과 해제가 매우 빠릅니다.
- 자동 관리: 메모리 관리가 자동으로 이루어지므로 프로그래머가 별도로 해제할 필요가 없습니다.
- 단점:
- 제한된 크기: 스택 크기는 제한적이며, 깊은 재귀 호출로 인해 스택 오버플로우가 발생할 수 있습니다.
- 유연성 부족: 메모리 크기를 동적으로 조정할 수 없습니다.
요약
- Static Memory: 프로그램 실행 동안 고정된 메모리 영역. 전역 변수, 정적 변수 등을 저장합니다.
- Heap Memory: 동적으로 메모리를 할당하고 해제할 수 있는 영역. 프로그램 실행 중 메모리 요구에 따라 유연하게 관리됩니다.
- Stack Memory: 함수 호출과 관련된 지역 변수와 매개변수를 저장하는 LIFO 구조의 메모리 영역. 자동으로 메모리가 관리됩니다.
이 각각의 메모리 영역은 프로그램의 성능과 메모리 관리를 최적화하는 데 중요한 역할을 합니다.
- JVM (Java Virtual Machine): 자바 가상 머신으로, 자바 프로그램을 실행하기 위한 환경을 제공합니다. 자바 바이트코드(
.class
파일)를 하드웨어에서 직접 실행 가능한 기계어로 변환합니다.
- 기계어와 하드웨어: 기계어는 이진수로 표현되며, 하드웨어가 이해할 수 있는 언어입니다. 예를 들어,
0101000
과 같은 이진수로 명령어를 처리합니다. 하드웨어는 입력(예: 키보드, 마우스)과 출력(예: 모니터, 스피커)을 처리합니다.
- 기호화: 이진수를 기호화하여 인간이 이해할 수 있는 형태로 변환합니다. 예를 들어,
1010
을 기호화하여 10진수로 표현합니다.
- 쉘과 OS: 쉘(Shell)은 사용자와 운영체제 간의 인터페이스를 제공하며, 명령어를 입력하여 OS의 기능을 제어합니다. 예를 들어,
cd music
명령어로 디렉토리를 변경합니다.
- C언어와 플랫폼 종속성: C언어는 플랫폼에 종속적입니다. 즉, 특정 운영체제와 하드웨어에서만 실행됩니다.
- 자바와 JVM: 자바는 플랫폼 독립적이며, JVM을 통해 다양한 운영체제에서 실행됩니다. 자바 코드(
.java
)는 바이트코드(.class
)로 컴파일되고, JVM이 이를 실행합니다. JVM은 OS에 구애받지 않고, 프로그램을 실행할 수 있도록 중간 다리 역할을 합니다.
- 메모리 구조:
- Static: 프로그램이 실행되는 동안 고정된 메모리 영역으로, 전역 변수와 정적 변수를 저장합니다. 예를 들어,
static
으로 선언된 변수는 프로그램 전체에서 동일한 메모리 주소를 가집니다. - Heap: 동적 메모리 할당을 위한 영역으로,
new
키워드로 메모리를 할당하고 해제합니다. 객체 생성 시 사용하는 메모리입니다. - Stack: 함수 호출과 관련된 지역 변수 및 매개변수를 저장하는 메모리 영역입니다. 함수 호출 시 메모리가 할당되고, 함수가 끝나면 자동으로 해제됩니다.
- 자바 실행 과정:
- 코딩:
.java
파일을 작성합니다. - 컴파일:
javac
컴파일러를 사용하여.class
파일로 변환합니다. - 실행:
java
명령어로.class
파일을 실행합니다. JVM이 클래스를 로드하고static
메소드(예:main
)를 찾습니다. - 메모리 할당:
main
메소드 실행 시Stack
메모리에서 임시 저장공간이 생깁니다. - 종료:
main
메소드가 종료되면Stack
메모리가 소멸하며 프로그램이 종료됩니다.
비유
- Static: 태양처럼 단 한 번 생성되며, 프로그램 전체에서 동일하게 유지되는 메모리 영역.
- Heap: 지구처럼 동적으로 변화하고 확장할 수 있는 메모리 영역.
- Stack: 책상 위의 메모리처럼, 함수 호출 시 임시로 사용하는 메모리 공간.
Share article