티스토리 뷰

java를 통해 개발을 하면서 jvm위에서 돌아간다는 것쯤은 알고 있을 것이다. 하지만 프로그램이 실행되고 처리되는 과정에 대해 정리가 되지 않았던 것 같아 정리하면서 여러 가지 궁금점을 포함해 공부해보고자 한다!

 

 

JVM(Java Virtual Machine)이란?

: 자바 코드를 CPU나 운영체제(플랫폼)의 종류와 무관하게 실행할 수 있도록 하는 주체이다.

 

왜? java는 운영체제 위에서 바로 실행이 되지 않아 JVM이 필요할까?

: Java 컴파일러는. java 파일을. class 파일로 컴파일한다. 이는. java 파일을 Java byte code로 변환하여. class 만드는 것인데 Byte Code는 기계어가 아니기 때문에 OS에서 바로 실행이 되지 않는다.

 

이를 해결하기 위해 JVM을 통해 .class 파일을 로드/해석하여 Java 프로그램을 실행하는 것!

즉, 운영체제 위에서 동작하는 프로세스로 자바 코드를 컴파일해서 얻은 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 바꿔 실행시켜주는 역할을 한다.

 

※ C는 리눅스(Linux), 윈도(Windows), 맥(Mac) 등 운영체제별로 운영체제 위에서 바로 실행되지만, 자바는 운영체제 위의 JVM에서 실행된다.

 

자바 애플리케이션이 실행될 때 JVM에서 처리되는 과정

<간단하게 나타낸 구조>

<Subsystem까지 나타낸 구조>

1. Class Loader

: .java파일 → 컴파일 → .class(바이트 코드) 파일 생성 이렇게 생성된 .class파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는 역할을 한다. → class loader의 subsystem에서 파일을 로드, 링크, 초기화 함으로써 메모리에 적재.

(자바 애플리케이션이 실행 중일 때 이런 작업이 수행된다. 즉, 컴파일 타임이 아닌 런타임에 클래스를 처음 참조할 때 작업이 수행되는 것.)

  • Loading : 아래의 클래스 로더마다 담당한 클래스들을 로드한다.

    Boot Strap ClassLoader

    rt.jar 이외의 부트 스트랩 클래스 경로에서 클래스를 로드하는 역할을 하며 이 로더는 로더 중에서 우선순위가 가장 높다

    Extension ClassLoader

    ext 폴더 (jre \ lib)에 있는 클래스를 로드하는 작업을 담당한다.

    Application ClassLoader

    응용 프로그램 수준 클래스 경로, 환경 변수 등을 로드하는 데 사용된다. 이 클래스 로더는 클래스 파일을 로드하는 동안 위임 계층구조 알고리즘을 따르게 된다.

  • linking

    Verify

    바이트 코드 검증 기는 생성된 바이트 코드가 올바른지 여부를 검증하게 된다. 검증이 실패하면 검증 오류가 발생한다.

    Prepare

    모든 정적 변수에 대해 메모리가 할당되고 기본값이 지정된다.

    Resolve

    모든 기호 메모리 참조가 메서드 영역의 원래 참조로 바뀐다.

  • initialization: 클래스 로딩의 마지막 단계로 여기서 모든 staic 변수는 원래 값으로 지정되고 static 블록이 실행된다.

 

2. Execution Engine

: Class Loader로부터 받은 runtime data area에 있는 .class파일(바이트코드)을 →기계어로 변환시키는 역할을 한다. 바이트 코드를 읽어 조각 별로 실행한다. interpreter와 JIT 방식이 있다.

  • Interpreter : 명령어를 하나하나 실행하게 된다. 하나의 메서드가 여러 번 호출될 때마다 매번 새로운 해석이 요구된다는 단점이 있어 느리다.
  • JIT(Just-In-Time) Compiler : Execution Engine은 interpreter로 바이트 코드를 변환하지만, 반복 코드를 발견하면 JIT 컴파일러를 사용하여 전체 바이트 코드를 컴파일하고 원시 코드로 변경한다. 이 원시 코드는 반복적인 메서드 호출에 직접 사용되어 시스템 성능을 향상 시계 된다. 이를 통해 interpreter의 단점을 해소시킨다.

 

3. Garbage Collector(GC)

: Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.

GC가 역할을 하는 시간은 정확히 언제인지를 알 수 없다. (참조가 없어지자마자 해제되는 것을 보장하지 않는다는 의미!) "System.gc ()"를 통해 GC를 호출할 수 있지만 실행이 보장되지는 않는다.

또 다른 특징은 GC가 수행되는 동안 GC를 수행하는 스레드가 아닌 다른 모든 쓰레드가 일시 정지된다.특히 Full GC가 일어나서 수 초간 모든 스레드가 정지한다면 장애로 이어지는 치명적인 문제가 생길 수 있는 것이다.

 

 

4. Runtime Data Area

: JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.

이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있다.

  • Method Area : 모든 클래스 레벨의 데이터가 static 변수를 포함하여 여기에 저장됨. JVM 당 단 하나의 메서드 영역이 있으며 공유 자원이다.

    구체적으로는 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보 같은 필드 정보와 메서드의 이름, 리턴 타입, 파라미터, 접근 제어자 정보 같은 메서드 정보, Type정보(Interface인지 class인지), Constant Pool(상수 풀 : 문자 상수, 타입, 필드, 객체 참조가 저장됨), static 변수, final class 변수 등이 이 영역에 생성된다.

  • Heap Area: 모든 객체와 해당 인스턴스 변수 및 배열이 여기에 저장된다. 공유 자원이다.

    →구체적으로는 new 키워드로 생성된 객체와 배열이 생성되는 영역으로 메서드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.

    *힙 영역을 굳이 5개로 나눈 이유는 효율적으로 GC가 일어나게 하기 위함이다.

  • Stack Area : 모든 스레드에 대해 별도의 런타임 스택이 만들어진다. 스택 영역은 공유 자원이 아니므로 스레드 안전 영역이다.

    → 구체적으로는 지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역으로서 메서드를 호출할 때마다 개별적으로 스택이 생성된다. 이 영역 안에서도 Local Variable Array, Operand stack, Frame data로 나뉜 게 된다.

  • PC Register : 스레드가 생성될 때마다 생성되는 영역으로 Program Counter 즉, 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다. (*CPU의 레지스터와 다름) 이것을 이용해서 스레드를 돌아가면서 수행할 수 있게 한다. 공유 자원이 아니다.

  • Native Method Stack : 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다. 보통 C/C++ 등의 코드를 수행하기 위한 스택이다. (JNI(Java Native Interface) :Native Method Libraries와 상호 작용하고 Execution Engine에 필요한 Native Libraries를 제공) 공유 자원이 아니다.

 

→ 메모리에 load 하고 heap stack 등 메모리 영역을 할당하는 것은 OS. 하지만 어떻게 JVM이 runtime area를 자바 프로그램에게 할당하는지?

: 이유는 OS가 JVM에게 메모리 할당 권한을 주기 때문! 따라서 OS위에서 메모리를 받아 실행되는 다른 프로그램들과 다르게 자바 애플리케이션의 경우 JVM에게 메모리를 할당받아 실행된다. 즉, 자바 애플리케이션은 OS가 아닌 JVM에 종속적이라는 뜻!

 

→ java 프로그램을 구동하기 위해는 jre, api, jvm이 포함된 jdk를 설치해야 한다. jdk를 설치할 때는 각자 OS환경에 맞는 것을 선택해야 하는데 이렇게 OS마다 다른 JVM이 제공되기 때문에 별개로 작동하게 된다

 

 

 

 

 

 

 

 

 

 

 

 

 

-참고 사이트

jeong-pro.tistory.com/148

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함