JVM의 메모리구조에 대해서 간단히 정리했다.
-> 실제로는 이 그림보다 좀더 복잡한 형태로 되어 있다.
-> 자세한 JVM메모리 구조 참고 : https://jeong-pro.tistory.com/148
클래스 정보와 클래스 변수가 저장되는 곳
프로그램이 실행되는 과정에서 필요한 클래스의 클래스파일을 찾아서 이곳에 읽어온다.
이 때, 메모리에 로딩될때 클래스에 정의된 클래스변수가 자동생성된다.
호출스택은 메서드의 작업공간이다.
메서드가 호출되면 이 곳에 작업에 필요한 메모리를 얻어서
수행하게 된다. 메서드가 종료되면 사용하던 메모리를 자동적으로 반환한다.
메서드에 선언된 지역변수들은 이 곳에 만들어진다.
인스턴스가 생성되는 공간이다.
new연산자에 의해서 상성되는 배열과 객체는 모두 여기에 생성된다.
메서드가 호출되면 수행에 필요한 메모리를 스택에 할당받는다.
메서드가 수행을 마치면 사용했던 메모리를 반환한다.
호출스택의 제일 위에 있는 메서드가 현재 실행중인 메서드다.
아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드다.
main메서드가 호출되면 처음엔 호출스택이 비어있다가
main메서드가 포함된 클래스의 정보를 메서드 영역에서 읽어서
main메서드가 수행되는데 필요한 메모리를 계산해서 그 만큼의
공간이 스택에 마련된다.
호출스택 이름의 기원
-> 스택 이라는 자료구조의 형태로 되어 있어 붙여진 이름
스택 자료구조의 특징
-> 데이터를 꺼낼때 제일 마지막에 넣은 데이터를 제일 먼저 꺼낸다.
호출스택 역시 제일 먼저 호출된 메서드가 제일 바닥에 깔리고
제일 나중에 호출된 메서드가 제일 위에 올라온다.
처음에는 스택이 비어있다가 자바프로그램은 main메서드를 호출함으로써
시작되니까 main 메서드가 스택에 저장되고, main메서드가 firstMethod라는 메서드를 호출하면 맨 오른쪽과 같은 그림이 된다.
이때 main메서드는 대기상태가 되고 firstMethod메서드가 실행된다.
firstMethod가 수행을 마치고 나면 스택에서 제거되고
firstMethod를 호출한 main메서드로 다시 돌아가서
firstMethod를 호출한 다음 문장부터 수행을 이어나간다.
여기서 알수 있는건 호출스택의 제일 위에 있는 메서드가
현재 실행중인 메서드이며 나머지 메서드는 모두 대기상태라는 것이다.
호출스택에서 서로 위아래로 붙어 있는 메서드는
서로 호출하고 호출된 메서드다.
만일 호출스택이 맨 오른쪽 그림과 같다면
현재 실행중인 메서드는 firstMethod이고
firstMethod를 호출한 것은 main메서드다.
public class CallStackTest {
static void firstMrthod() {
secondMrthod();
}
static void secondMrthod() {
System.out.println("secondMethod()");
}
public static void main(String[] args) {
CallStackTest.firstMrthod();
}
}
CallStackTest라는 예제를 실행시키면 처음에는 1번과 같이 호출스택이 비어있다가 CallStackTest클래스의 main메서드가 java.exe에 의해서
자동적으로 호출되면서 프로그램이 시작된다.
main메서드가 firstMethod를 호출한다.
호출스택에는 firstMethod가 수행될 메모리공간이 마련되고
firstMethod가 수행되기 시작한다.
firstMethod에서는 또 secondMethod를 호출한다.
secondMethod는 println메서드를 호출하고
println메서드는 secondMethod()라는 글자를 화면에 출력한다.
println이 글자를 출력하고 종료되면 호출스택에서 제거되고
println을 호출한 secondMethod()로 돌아간다.
secondMethod에 더이상 수행할 문장이 없으므로 종료되고
자신을 호출한 firstMethod로 돌아간다.
firstMethod와 main메서드도 더이상 수행할 문장이 없으므로
차례로 호출스택에서 제거되고 호출스택은 완전히 비워지고
프로그램은 종료된다.