JVM 메모리 구조
응용프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고,
JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
그 중 3가지 주요 영역(method area, call stack, heap)이다.
1. Method Area (메소드 영역)
- 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이 때, 그 클래스의 클래스 변수(class variable)도 이 영역에 함께 생성된다.
2. Heap (힙)
- 인스턴스가 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다.
3. call Stack (호출 스택)
- 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수 (매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고 메서드가 작업을 마치면 할당되었던 메모리공간은 반환되어 비워진다.
수행과정
- 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당 받는다.
- 메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거된다.
- 호출스택의제일 위에 있는 메서드가 현재 실행 중인 메서드이다.
- 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.
- main()이 firstMethod()를 호출하고 firstMethod()는 secondMethod()를 호출한다. 객체를 생성하지 않고도 메서드를 호출할 수 있으려면, 메서드 앞에 'static'을 붙여야 한다.
- JVM에 의해서 main메서드가 호출됨으로써 프로그램이 시작된다. 호출스택에는 main메서드를 위한 메모리공간이 할당되고 main메서드의 코드가 수행되기 시작한다.
- main메서드에서 firstMethod()를 호출한 상태이다. 아직 main메서드가 끝난 것은 아니므로 main 메서드는 호출스택에 대기상태로 남아있고 firstMethod()의 수행이 시작된다.
- fisrtMethod()에서 secondMethod()를 호출했다. firstMethod()는 secondMethod()가 수행을 마칠 때까지 대기 상태에 있게 된다. secondMethod()가 수행을 마쳐야 firstMethod()의 나머지 문장들을 수행할 수 있기 때문이다.
- secondMethod()에서 println()을 호출했다. println메서드에 의해 'secondMethod()'가 화면에 출력된다.
- println메서드의 수행이 완료되어 호출스택에서 사라지고 자신을 호출한 secondMethod()로 되돌아간다. 대기 중이던 secondMethod()는 println()을 호출한 이후부터 수행을 재개한다.
- secondMethod()에 더 이상 수행할 코드가 없으므로 종료되고, 자신을 호출한 firstMethod()로 돌아간다.
- firstMethod()에도 더 이상 수행할 코드가 없으므로 종료되고, 자신을 호출한 main메서드로 돌아간다.
- main메서드에도 더 이상 수행할 코드가 없으므로 종료되어, 호출스택은 완전히 비워지게 되고 프로그램은 종료된다.
위 코드로 각 메서드의 시작과 종료의 순서를 확인할 수 있다.
Java 메모리 구조에 대해 추가 글은..
https://steady-developer-hyemin.tistory.com/26
'Backend > Java' 카테고리의 다른 글
[Java] 기본형 매개변수와 참조형 매개변수 (0) | 2024.09.09 |
---|---|
[Java] 인터페이스 상속 실습 문제 (1) | 2024.09.06 |
[Java] Class 변수와 메서드 (0) | 2024.09.02 |
[Java] Class 객체 배열 (0) | 2024.08.30 |
[Java] Class 란 / 인스턴스란 / 인스턴스의 생성과 사용 (0) | 2024.08.29 |