S E P H ' S
[JAVA] Java 프로그램의 실행 본문
자바 프로그램의 실행
C나 다른 언어의 실행 방식과 Java 실행 방식을 비교한 간단한 그림이다. JDK가 운영체제에 맞게 존재하고 그 안에 자바 컴파일러(javac.exe)가 자바 코드를 해석하면 바이트 코드(.class 형태의 파일)가 되고 그를 JRE이 지니고 있는 자바 프로그램 실행기(java.exe)를 포함하고 있고 JVM이 중재자로서 각 플랫폼에서 프로그램을 구동하는 데 문제 없게끔 만들어준다.
자바 프로그램의 메모리 사용 방식
프로그램이 실행될때 메모리는 보통 다음과 같이 영역이 나눠서 사용된다.
자바와 같이 객체 지향 프로그램에서는 데이터 저장 영역을 다시 세 개의 영역으로 분할해서 사용한다.
위의 그림을 다시 더 상세한 설명을 덧붙인다면 스태틱 영역은 클래스가 위치하고 스택 영역은 메소드가 위치하며 힙 영역은 객체가 위치한다고 할 수 있다.
JRE는 먼저 프로그램 안에 main() 메소드가 있는지 확인한다. main() 메소드가 확인되면 프로그램 실행을 위한 사전 준비를 한다. 가상 기계인 JVM은 맨 먼저 전처리 과정을 거친다. 모든 자바 프로그램이 반드시 포함하는 패키지인 java.lang 패키지를 T 메모리의 스태틱 영역에 위치시킨다. 다음으로는 개발자가 작성한 모든 클래스, 임포트 패키지를 스태틱 영역에 놓는다.
main() 메소드가 실행되기 전 JVM이 수행하는 전처리 작업들
- java.lang 패키지를 T 메모리의 스태틱 영역에 배치
- import 된 패키지를 T 메모리의 스태틱 영역에 배치
- 프로그램 상의 모든 클래스를 T 메모리의 스태틱 영역에 배치
다음으로는 main() 메소드가 실행되기 위해 main() 스택 프레임이 스택 영역에 배치 된다. 메소드를 시작하는 중괄호를 만날 때 마다 이 스택 프레임이 하나씩 생기게 된다. 그리고 그 스택 프레임에 메소드의 인자를 저장할 변수 공간을 할당한다. 이렇게 하고나면 명령문을 실행할 준비가 다 된 것이다.
스택 프레임들은 닫는 중괄호를 만나면 소멸된다. main() 메소드는 자바 프로그램의 시작점이자 끝이다. 따라서 main() 메소드의 닫는 중괄호를 만나게 되면 JRE는 JVM을 종료하고 JRE 자체도 운영체제 상의 메모리에서 사라진다.
블록 구문과 메모리: 블록 스택 프레임
public class Start3 {
public static void main(String[] args) {
int i = 10;
int k = 20;
if (i == 10) {
int m = k + 5;
k = m;
} else {
int p = k + 10;
k = p;
}
// k = m + p;
}
}
위와 같은 코드가 있다면 T 메모리 상태는 아래와 같을 것이다.
다음으로 실행해야 할 것은 if 문이다. 현재 i가 10이므로 실행되는 블록은 위 블록이다. if문도 마찬가지로 중괄호가 열리면 스택 프레임이 생성된다.
if 문 안에는 int m = k + 5;가 있는데 T 메모리 상에서는 먼저 m의 변수 공간이 할당된 다음 k + 5;가 대입이 될때 25가 m에 저장이된다. 그리고 m의 값을 k에 대입하면서 if 문은 종료될 것이다. 마찬가지로 닫는 중괄호를 만나면서 if 스택 프레임은 사라지게 된다.
메모리는 지금까지 그려진 그림과 같이 작업을 수행한다. Start3 클래스의 주석문을 해제하면 메모리 상에서 m과 p 변수가 없기 때문에 오류를 발생하며 컴파일을 거부할 것이다. 차례대로 수행이 되다가 main() 메소드의 닫는 중괄호를 만나게 되면 T 메모리 소멸, JVM 가동 중지, JRE가 사용한 시스템 자원을 운영체제에 반납하게 된다.
'Programing & Coding > JAVA' 카테고리의 다른 글
[Java] Iterator (ConcurrentModificationException 에러) (0) | 2023.04.25 |
---|---|
[JAVA] 메모리와 멀티 스레드 / 멀티 프로세스 (0) | 2023.02.10 |
[Java] StringBuilder (0) | 2022.12.12 |
[Java] Arrays.asList() (0) | 2022.11.07 |
[Java] 9. Overloading & Overriding (0) | 2022.01.18 |