[Java] JVM

박상혁·2023년 1월 3일
0

Java

목록 보기
1/10
post-thumbnail

개요

"어떻게 자바 코드로 File을 포함한 다양한 입출력이 가능할까?"
"내부에서 어떻게 돌아가서 프로세스로 만들어질까?"

이에대한 궁금증을 해소하기 위해서는 운영체제 기초와 JVM 내부 동작방식을 알고 있어야 합니다.

JVM의 내부 구조를 파악한 후 어떻게 동작하는지 흐름을 파악해야 합니다. 이후 위 질문에 답변하기 위해 JNI까지 알아보겠습니다.

목차

  1. Compiler
  2. Class File
  3. ByteCode
  4. JVM internal structure
  • Class Loader
    loading, linking, initializing
  • Execution Engine
    JIT complier, interpreter, Garbage Collector
  • Runtime Data Area

본론

Compiler

자바 소스코드를 JVM이 읽을 수 있도록 중간단계 언어인 바이트코드로 변환하는 과정을 수행합니다.
바이트코드를 만들 때 클래스 단위로 생성하기 때문에 전체를 컴파일 할 필요가 없습니다.

public class Hello {
	public Hello();
    	Code:
        	0: aload_0
            1: invokespecial	#1			// Method java/lang/Object."<init>':()V
            4: return
	public static void main(java.lang.String[]);
    	Code:
        	0: getstatic 		#2			// field java/lang/System.out:Ljava/io/PrintStream;
            3: lde				#3			// String HelloWorld!
            5: invokevirtual	#4			// Method java/io/PrintStream.println:(Ljava/lang/String;)V
            8: return
}

Class File

Hello.class는 바이트 코드 이외에 여러 정보들이 들어있는 통합 파일입니다.

  • 버전 정보
  • 접근 제어자
  • 슈퍼 클래스
  • 선언된 필드
  • 메서드
    ...등 해당 클래스에 대한 모든 정보가 들어있습니다.

Class Loader

구조

  • Loading
    File -> Memory
    2차 메모리에 있던(SSD, HDD) .Class File들을 Run-time Data Area 메모리 내부의 Method로드하는 역할을 맡습니다.
    이때, .Class File의 Bytecode를 읽어서 적절하게 배치합니다.

이 작업이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 heap영역에 저장합니다.
-> reflection 기술 사용가능

"명령어를 저장한다."

  • Linking
    • Verifying
      자바 언어 명세, JVM 명세에 명시된 대로 잘 구성되어 있는지 검사하는 단계입니다.
    • Preparing
      field, method(명령어 모음), interface 등을 나타내는 데이터구조 준비 및 이에따른 메모리 공간을 할당하는 단계입니다.
    • Resoving
      Class의 Runtime Constant Pool 안에 있는 Symbolic Reference실제 Direct(고정) Reference로 변경하는 단계입니다.
      해당 단계에서 동적 바인딩이 발생합니다. 다형성을 구현할 수 있게 하는 본인입니다.

"레퍼런스를 연결한다."

  • Initializing
    클래스가 필요로 하는 메모리 및 값을 할당합니다. -> static 정적 변수 할당

"static 초기화"

종류

  • BootStrap Class Loader
    네이티브 코드로 작성되어 있습니다.
    JVM을 처음 시작할 때 실행되며 java.lang 패키지 등의 JVM 실행에 필요한 필수 클래스들을 로딩합니다.

  • Extension Class Loader -> Platform Class Loader
    java.lang.ClassLoader의 인스턴스입니다.
    java SE platform API 등 자바에서 기본적으로 제공해주는 클래스를 로딩할 때 사용합니다.
    Bootstrap Class Loader를 부모로 가지고 있습니다.

  • Application Class Loader -> System Class Loader
    java.lang.ClassLoader의 인스턴스입니다.
    유저가 작성한 클래스를 로딩할 때 사용됩니다.
    Platform Class Loader를 부모로 가지고 있습니다.

reflection

클래스 로딩이 끝나면,
클래스 타입의 인스턴스를 만들어서 heap에 저장하므로 __.class을 통해 인스턴스를 가져올 수 있습니다.

자세한 동작은 리플렉션 포스팅을 참고해주세요.

caching

Execution Engine

interpreter

JIT compiler (Just-In-Time)

GC (Garbage Collector)

Runtime Data Area

Method Area

클래스 수준의 정보를 저장합니다.
다른 영역에서도 공유할 수 있습니다.

모든 프로그램는 운영체제 내에서 동작하도록 되어있습니다.
JVM을 통해서 만들어진 프로세스도 마찬가지입니다.

자바 코드를 컴파일한 바이트 코드를 JVM이 해석하여
운영체제 및 CPU가 이해할 수 있는 코드로 변경하기 때문에
File 등을 자바코드 만으로 조작할 수 있습니다.

참조

Java 혁신의 숨은 공신, JVM의 구조와 동작 원리 - 개발장
"[Java] 참조 타입과 참조 변수" - 불곰
"JVM Internal" - James D Bloom
JVM Internal - Naver D2
JVM stack과 frame
더 자바, 코드를 조작하는 다양한 방법 - 백기선
자바의 실행 과정 - pond1029
10분 테코톡 JVM Memory Layout - 어썸오
스택 기반 VM과 레지스터 기반 VM - 쿠키
Java의 메모리 구조_기본구조[1/3] - 코데방
Java 프로그램의 실행원리(feat. JVM) - ikjo

profile
개발 노트

0개의 댓글