자바의 메모리 크게 3가지로 나눌 수 있고 간단하게 설명하면 아래와 같다.
- 메서드 영역: 클래스 정보를 보관한다.
- 스택 영역: 실제 프로그램이 실행되는 영역이다. 메서드를 실행할 때 마다 하나씩 쌓인다.
- 힙 영역: 객체(인스턴스)와 배열이 생성되는 영역이다. new 명령어를 사용하면 이 영역을 사용한다.
ㅇ 자바의 메모리 구조
- 메서드 영역(Method Area)
메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 프로그램의 모든 영역에서 공유한다.
클래스 정보: 클래스의 실행 코드(바이트코드), 필드, 메서드, 생성자 등 모든 실행 코드가 존재한다.
Static 영역: static 변수들을 보관한다.
런타임 상수 풀: 공통 리터럴 상수를 보관한다. 리터럴 문자가 있으면 공통으로 묶어서 관리하고, 이 외에 프로그램을 효율적으로 관리하기 위한 상수를 관리한다. - 스택 영역(Stack Area)
자바 실행 시, 하나의 실행 스택이 생성된다.(멀티 쓰레드 환경에서는 쓰레드의 수 만큼 스택영역이 생성된다.) 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 등의 정보를 포함한다. 후입선출 (LIFO, Last In First Out) 구조다.
스택 프레임: 스택 영역에 하나 씩 쌓이는 박스라고 생각하면 된다. 메서드를 호출할 때 마다 하나의 스택 프레임이 쌓
이고, 메서드가 종료되면 해당 스택 프레임이 제거된다. - 힙 영역(Heap Area)
객체(인스턴스)와 배열이 생성되는 영역이다. 가비지 컬렉션(GC)으로 메모리가 관리되는 영역이며, 더 이상 참조되지 않는 객체들은 가비지 컬렉션에 의해 제거된다.
* 만약 같은 클래스로 100개의 인스턴스를 생성한다면?
힙 메모리의 100개의 인스턴스가 생성된다. 각각의 인스턴스 내부의 변수의 값은 다 다를 수 있기 때문에 메모리가 할당되지만, 메서드 같은 경우 100개를 생성하더라도 그 내용은 똑같기 때문에 메서드 영역에서 공통으로 관리 되고 실행된다. 따라서 메서드에 대한 새로운 메모리 할당은 없다. 인스턴스의 메서드를 호출하면 메서드 영역에 있는 코드를 불러서 수행한다.
ㅇ 스택 구조 알아보기
스택 구조를 직접 확인해보기 위한 코드를 작성한다.
코드를 확인해보면 메서드의 실행순서는
main() → method1() → method2()라는 걸 확인할 수 있다.
각각의 메서드는 스택 프레임이 생성이 되고 스택 프레임 안에는 매개변수를 포함한 지역변수들이 포함된다.
스택은 후입선출 구조라고 앞에서 말했듯이 실행순서의 역순으로 종료가 된다.
method2() → method1() → main()의 순으로 종료가 되는 걸 콘솔 창을 통해서 확인할 수 있다.
정리
- 자바는 스택 영역에서 메서드 호출과 지역변수(매개변수 포함)을 관리한다.
- 메서드를 호출할 때 마다 스택 프레임이 생성되고 쌓인다.
- 스택 프레임이 종료(메서드 종료)되면 지역 변수도 함께 제거된다.
- 스택 프레임이 모두 종료되면 프로그램도 종료된다.
'Java' 카테고리의 다른 글
JAVA Array(배열) (4) | 2024.10.02 |
---|---|
JAVA 변수 (1) | 2024.09.19 |
JAVA 캡슐화(Encapsulation) (1) | 2024.09.18 |
Java 인터페이스와 추상 클래스의 차이점 (1) | 2024.02.28 |
Java 컴파일 과정을 알아보기 (1) | 2024.02.25 |