Java의 동작원리

최태양 (choittttt)·2023년 11월 24일

Java 배우기

목록 보기
1/4
post-thumbnail

출처 : 생활코딩, 이정록

Java 동작의 전체 적인 흐름


  1. computer 위에 Java Virtual Machine이 다운로드됨

  2. 우리가 하고자하는 일을 담은 Java Source code (.java) 이것은 사람이 이해하기 쉬운 언어이므로 컴퓨터가 이것을 이해하려면 Compile이라는 과정을 거쳐야함

  3. Compile 과정이 거치면 Java Apllication (.class)가 생성되게 됨

  4. 이후 Run을 통해 실행이되면 JVM이 파일을 읽어서 동작하게 됨

생활코딩님 강의에는 간단히 이 정도로만 설명이 됐었다. 나는 좀 더 구체적인 부분을 조사하게 됐다.

우리가 작성한 Java Source code는 .java의 형태로 저장이 되는데 컴파일 과정을 거치게 되면 .class 파일인 Byte code로 만들어지게 된다.

Byte code로 변환하는 이유?

1. 플랫폼 독립성

Java는 "Write Once, Run Anywhere"라는 철학을 가지고 있습니다. 즉, 한 번 작성된 Java 소스 코드는 어떤 운영체제나 하드웨어에서도 동작할 수 있어야 합니다.

Java 소스 코드는 자바 가상 머신 (JVM)이 이해할 수 있는 중간 형태인 Byte code로 컴파일 하여 JVM은 이 바이트 코드를 해당 플랫폼에서 실행하므로, Java 프로그램은 운영체제에 독립적으로 실행될 수 있습니다.

2. 효율성 및 성능 최적화

JVM의 해석을 거치기 때문에 C언어와 같은 네이티브 언어에 비해 속도가 느렸지만 JIT(Just In Time)컴파일러를 구현해 이 점을 극복했다. Byte code는 JVM 위에서 OS에 상관없이 실행된다. 이런 점이 Java의 가장 큰 장점이라고 할 수 있다. OS에 종속적이지 않고 Java 파일 하나만 만들면 어느 디바이스든 JVM 위에서 실행할 수 있다.

이 변경된 Class(Byte code) 파일들을 Class Loader를 통해 JVM 메모리영역(Runtime Data Areas) 영역으로 로딩한다.

JVM(Java Virtual Machine)

JVM에 대해서 알아보자. JVM은 크게 4가지 다이어그램으로 나타낼 수 있다.

  • 클래스 로더(Class Loader)
  • 런타임 데이터 영역(Runtime Data Area)
  • 실행 엔진(Execution Engine)
  • 가비지 컬렉터(Garbage Collector)

하나씩 알아보도록 하자!

Class Loader

  • 로딩(Loading)
    - 자바 바이크 코드(.class)를 메소드 영역에 저장한다.
    • 각 자바 바이트 코드(.class)는 JVM에 의해 메소드 영역에 다음 정보들을 저장한다.
      • 로드된 클래스를 비롯한 그의 부모 클래스의 정보
      • 클래스 파일과 Class, Interface, Enum의 관련 여부
      • 변수나 메소드의 정보
  • 링크(Linking)
    - 검증(verify) : 읽어 들인 클래스가 자바 언어 명세 및 JVM 명세에 명시된 대로 잘 구성되어 있는지 검사한다.
    • 준비(perpare) : 클래스가 필요로 하는 메모리를 할당하고, 클래스에서 정의된 필드, 메소드, 인터페이스를 나타내는 데이터 구조를 준비하다.
    • 분석(resolve) : 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다.
  • 초기화(Initialization)
    - 클래스 변수들을 적절한 값으로 초기화 한다. 즉 static 필드들이 설정된 값으로 초기화한다.

Runtime Data Area

메서드 영역과, 힙 영역은 모든 스레드가 공유하는 공간이다.

1. 메서드 영역

클래스 정보, 변수 정보, static으로 선언한 변수가 저장

2. Heap 영역

동적으로 생성된 객체가 저장되는 영역으로 GC의 대상이 되는 공간이다.

3. Stack 영역

지역변수나 메서드의 매개변수, 임시적으로 사용되는 변수, 메서드의 정보가 저장되는 영역이다.
(주로 금방 사라지는 데이터 들을 말한다)

Reference Type의 변수들이 Stack 쌓여서 넣었다 뺏다하게 되면 비효율적이기 때문에 Heap 영역에 메모리를 저장한 후 메모리의 주소를 참조하는 변수를 Stack 저장하여 사용한다.

Stack PC Register Native Method Stack

4. PC Register

스레드가 시작될 때 생성되며, 현재 수행중인 JVM의 명령어 주소를 저장하는 공간

5. Native Method Stack

Java가 아닌 다른 언어로 작성된 코드를 위한 공간 즉, JNI(Java Natvie Interface)를 통해 호출하는 C/C++등의 코드를 수행하기 위한 공간

Runtime Data Area에 로딩된 class 파일 Execution Engine을 통해 해석하게 된다.

Execution Engine

Byte code를 실행시키기 위해서는 컴퓨터가 이해할 수 있는 기계어로 바꾸는 작업이 필요하다. 방법이 2가지 존재하는데

  • Interpreter : 명령어를 한줄 한줄 해석하며 실행
  • JIT Compiler : Interpreter의 단점을 극복하기 위해 나온 것 런타임시간에 한꺼번에 변경하여 실행

기계어로 해석 된 것들이 Runtime Data Area에 배치되어 스레드 동기화나 GC를 수행하게 됨

Native Method

Native Method Interface(JNI)

JVM에 의해 실행되는 코드 중 네이티브로 실행되는 것이 있다면 해당 네이티브 코드를 호출하거나 호출 될 수 있도록 만든 일종의 프레임워크

Native Method Libraries

네이티브 메서드 실행에 필요한 라이브러리

profile
Better Than Yesterday

0개의 댓글