T 메모리 구조
JDK를 이용해 개발된 자바 애플리케이션이 JRE에 의해 JVM상에서 실행되면 OS는 JVM에 메모리를 할당한다. 이때, 자바 애플리케이션은 JVM이 OS로부터 할당받은 메모리를 사용하게 된다. 기계어를 포함한 모든 프로그래밍 언어의 공통된 메모리 사용 방식은 아래와 같은데 코드 실행 영역과 데이터 저장 영역으로 나누어진다.
코드 실행 영역은 프로그램의 코드가 저장되는 영역으로 텍스트영역이라고도 부른다. 자바 실행 파일(.java)를 컴파일러가 바이트 파일(.class)로 바꿔 JVM 메모리에 로드하는데 이때 바이트파일이 저장되는 곳이 코드 실행 영역이다. 데이터 저장 영역은 프로그램의 데이터가 저장되는 메모리 영역인데 OOP에서는 우리가 잘 아는 Static, Stack, Heap의 세가지 영역으로 분할해서 사용한다.
코드 실행 영역은 바이트 코드 파일로 이루어져있는데 어셈블리어를 학습할 것이 아니기 때문에 깊게 알 필요는 없고 해당 글에서는 데이터 저장 영역을 3분할한 아래 Static, Stack, Heap 영역을 자세히 다뤄보기로 하고 앞으로 아래와 같은 메모리 구조를 T메모리 구조라고 부르도록 하겠다.
Static 영역과 Stack 영역
아래와 같이 main() 메서드가 실행될때 Static 영역과 Stack 영역의 변화를 살펴보자.
public class Main {
public static void main(String[] args) {}
}
main() 메서드가 실행되기까지의 과정을 살펴보면 자바 애플리케이션이 실행될때 JRE는 프로그램 안에 main() 메서드가 있는지 확인하고 Main 클래스에서 main() 메서드를 발견한다. JRE는 JVM에 전원을 넣어 부팅한 후 목적 파일을 받아 실행하고 JVM은 모든 자바 프로그램이 포함하는 패키지인 java.lang 패키지를 T메모리의 Static 영역에 올려놓는다. 이후 JVM은 프로그램의 모든 클래스와 import 패키지를 Static 영역에 가져다 놓는데 지금까지의 과정을 시각화 하면 아래와 같다. (프로그램 내에 Main 클래스만 존재)