거누의 개발노트

Java - 프로그램 실행 과정(JVM 구조) 본문

Java

Java - 프로그램 실행 과정(JVM 구조)

Gogozzi 2022. 3. 1. 18:38
반응형

간단히 말하자면 IDE에서 .java 파일에 코드를 작성해서 저장하면 컴파일러가 컴파일 후 컴파일된 코드를 .class 파일에 저장한다.

그럼 우리는 run() 을 하여 코드를 실행 시킬 것이고, run()을 하면 JVM에 적재되고 프로그램이 실행된다.

 

여기서 다시 의문이 생긴다.

JVM이 뭐지?  JavaVirtual Machine의 줄임말인건 알고 있고, 하드웨어의 기종에 상관없이 운영체제에 JVM만 설치되어있으면 Java 프로그램을 실행 할 수 있다고 한다. ( 플랫폼에 종속되지 않는다 )

그럼 JVM안에 요소 하나하나 어떤 역할을 하는지 살펴보자.


 

Class Loader
.class(바이트 코드)를 읽어서 Runtime Data Area에 맞춰서 적재하는 기능을 수행한다.

[로딩 절차]
1. 어떤 메소드를 호출하려고 하는데 해당 바이트코드가 아직 로딩된적 없으면 JRE에서 클래스를 찾는다.
  * JRE : 자바 프로그램을 실행시키기 위한 라이브러리, JVM, 기타 파일들을 가지고 있음
2. JRE에 없으면 CLASSPATH 환경 변수에 지정된 폴더에서 클래스를 찾는다.
3. 찾았다면 그 클래스가 올바른 파일인지 바이트코드를 검증
4. 올바른 바이트코드라면 메소드 영역(Method Area)으로 파일을 로딩한다.
5. 변수를 만들라는 명령어가 있으면 메소드 영역에 변수를 준비
6. 클래스 블록이 있으면 그 블록을 순서대로 실행
7. 이렇게 로딩 되면 JVM이 종료될 때까지 유지

 

Execusion Engine
메모리에 적재된 클래스들을 기계어로 변경해 명령어 단위로 실행하는 역할을 한다.
 - 명렁어를 하나 하나 실행하는 인터프리터 방식
 - 실행 시점에 자주 쓸만한 코드들을 기계어로 변환 시켜놓고 저장해서 사용하는 JIT 방식이 있다.

* 컴파일러 vs 인터프리터 차이점?

둘 다 고레벨 언어로 작성된 프로그래밍 언어를 기계어로 번역하는 것은 동일하다.

컴파일러는 전체 소스코드를 보고 명령어를 수집하고 재구성한다. 고레벨 언어를 바로 기계어로 변환한다.

인터프리터는 소스코드의 각 행을 연속적으로 분석하며 실행한다. 고레벨 언어를 바로 기계어로 번역하지 않고 중간 형태로 변환시킨 후 실행한다.

 

Runtime Data Area
Method Area
클래스 멤버 변수, 메소드 정보, Type(Class or interface)정보, Constant Pool, static, final 변수 등이 생성된다. 상수 풀은 모든 Symbolic Reference를 포함하고 있다.

* Symbolic Reference
기본 자료형(primity data type)을 제외한 모든 타입(클래스와 인터페이스)을 명시적인 메모리 주소 기반의 레퍼런스가 아니라 심볼릭 레퍼런스를 통해 참조한다.

Heap Area
동적으로 생성된 오브젝트와 배열이 저장되는 곳으로 Garbage Collection의 대상이 되는 영역이다.

Stack Area
지역 변수, 파라미터 등이 생성되는 영역, 동적으로 객체를 생성하면 실제 객체는 Heap에 할당되고 해당 레퍼런스만 Stack에 저장된다.Stack은 스레드별로 독자적으로 가진다.

PC Register
현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있다.(CPU의 PC Register와 다르다)

Native Method Stack
자바외 언어로 작성된 네이티브 코드를 위한 메모리 영역

 

반응형
Comments