[Java] 소스코드의 실행과 JVM

Soondol·2024년 8월 10일

간편정리

  • 자바 소스코드 작성 : 개발자가 작성하는 자바소스코드 => .java 의 형태로 저장됨
  • 컴파일 : 이 .java 파일을 자바컴파일러가 ByteCode로 바꿈 (.class)
  • 클래스 로딩 : Class Loader가 이 .class 파일을 Runtime Data Area에 Loading 시킴
  • 실행 : Runtime Data Area에 Loading된 .class파일이 Execution Engine에 의해 interpreter, JIT 방식을 통해 해석됨
  • 런타임 데이터 영역에서의 처리 : 해석된 내용은 Runtime Data Area에서 스레드 동기화, 가비지 컬렉션을 수행함

java compiler

  • java 파일에 오류가 있는지 검사
  • JVM(Java Virtual Machine)을 위한 코드(ByteCode)를 생성

왜?

  • java의 장점 중 한가지는 JVM을 통해 플랫폼 독립적으로 실행 가능한 환경을 제공하는것
    - 한 번 작성된 자바 코드는 다양한 운영 체제에서 JVM이 설치된 환경이라면 실행
  • 바이트코드로 변환된 후, JVM에서 실행할 때 문법 검사를 다시 하지 않기 때문에 실행 속도가 개선
    - 소스 코드가 변경되면 매번 컴파일 과정이 필요하므로, 이 부분에서 성능 저하가 발생할 수 있음

JVM

Class Loader

  • 자바 프로그램의 클래스를 메모리에 로드하는 역할을 합니다. 클래스 로더는 바이트코드 파일(.class)을 찾아서 JVM에 로드하고, 이 과정에서 클래스의 이름과 구조를 검증

메모리 영역(Runtime Data Area)

  • ByteCode로 변경된 .class파일은 class Loader가 JVM 메모리영역, 즉 Runtime Data Area에 Loading 시킴

JVM 메모리영역의 구조

구조 **Method Area** **Heap** **Stack** **PC Register** **Native Method Stack**
JVM이 시작될 때 생성되는 공간으로 바이트코드가 이 영역에 저장됨 동적으로 생성된 객채가 저장되는 영역, GC의 대상이 되는 공간 지역변수, 메서드의 매개변수, 임시적으로 사용되는 변수, 메서드의 정보가 저장되는 영역 스레드가 시작될 때 생성되며, 현재 수행중인 JVM의 명령어 주소를 저장하는 공간 (스레드가 어떤 부분을 어떤 명령어로 수행할지를 저장하는 공간) JAVA가 아닌 즉 C/C++ 등의 코드를 수행하기 위한 공간
클래스 정보, 변수 정보, static으로 선언한 변수 저장 new 연산을 통하여 동적으로 생성된 인스턴스 변수 저장 지역,매개변수의 특성상 해당 메서드의 호출이 종료되면 선언된 변수들이 사라지게되기에 주로 금방 사용되고 끝나는 데이터가 저장됨 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
모든 스레드가 공유 모든 스레드가 공유 스레드 마다 하나씩 생성되는 공간 스레드 마다 하나씩 생성되는 공간 스레드 마다 하나씩 생성되는 공간
- Primitive Type (boolean, byte, short, int, log, char, float, double) 을 제외한 나머지 타입은 Refrence Type (class, interface, enum, Array) 이라고 함
Reference Type의 변수들이 실행될때마다 스택에 쌓여서 넣었다 뺐다하면 비효율적이므로 Heap영역에 진짜 메모리를 저장하고, 그 메모리의 주소를 참조하는 변수를 stack영역에 저장함
Car a = new Car("Porsche", "blue" ...);
a -> Stack, Car(..) -> Heap

실행 엔진(Execution Engine)

  • 로드된 클래스파일의 바이트코드를 실행하는 엔진

어떻게 실행?

  • 바이트코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 작업이 필요
  • 2가지의 방법 존재
    - interpreter : 명령어를 한줄한줄 해석하면서 실행
    - JIT(Just In Time) Compiler:
    1. 인터프리터의 단점을 해결하기위한 방법
    2. 런타임 시간에 한꺼번에 변경하여 실행
    3. 인터프리터와 함께 사용되어 성능을 최적화
  • 기계어로 해석된 내용이 Runtime Data Area에 배치되어 수행(스레드 동기화, 가비지 컬렉션)됨

가비지 컬렉터 (GC)

  • 더 이상 사용되지 않는 객체를 자동으로 메모리에서 해제하는 역할을 합니다. 이를 통해 메모리 누수를 방지하고, 자바 프로그램의 메모리 관리를 효율적으로 수행

    따로 정리할 예정 !

Native Method Interface(JNI)

  • 자바와 네이티브 코드 간의 상호작용을 위한 인터페이스로, 자바에서 네이티브 메소드를 호출하거나 네이티브 코드에서 자바 메소드를 호출할 수 있게 해줌

Native Mehtod Libraries

  • JNI를 통해 호출할 수 있는 네이티브 메소드를 포함하는 라이브러리로, C/C++로 작성되어 자바 애플리케이션에서 사용

0개의 댓글