자바 프로그램 실행 과정

  • 1.자바 소스코드를 컴파일러가 JVM이 이해할 수 있는 코드(byte code)로 변환
  • 2.바이트 코드를 JVM의 클래스 로더에게 전달
  • 3.클래스 로더는 동적로딩(Dynamic loading)을 통해 필요한 클래스들을 로딩 및, 링크하여 런타임 데이터 영역(JVM의 메모리)에 올린다.
    • 클래스 로더 세부 동작 
      • 로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드
      • 검증 : 자바 언어 명세 및 JVM 몇세에 명시된 대로 구성되어 있는지 검사
      • 준비 : 클래스가 필요로 하는 메모리를 할당
      • 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 래퍼런스로 변경
      • 초기화 : 클래스 변수들을 적절한 값으로 초기화한다. (static 필드)
  • 4.실행엔진(Execution engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행한다. 
    • 자바 인터프리터 : 바이트 코드 명령어를 한줄씩 해석하고 실행  
    • JIT 컴파일러 : 바이트 코드 전체를 컴파일하고 바이너리코드로 변경해서 직접 실행하는 방식
  • 5. 해석된 바이트 코드는 메모리 영역에 배치되어 실질적 수행이 이루어진다. JVM은 필요에 따라 스레드 동기화나 가비지 컬렉션같은 메모리 관리 작업을 수행한다.

 

자바 컴파일러(Java compiler)

  • 자바를 가지고 작성한 자바 소스 코드를 자바 가상 머신이 이해할 수 있는 자바 바이트 코드로 변환한다.
  • javac.exe

 

자바 바이트 코드(Java bytecode)

  • 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드
  • 명령어 크기 1 byte

 

자바 가상 머신(JVM)

  • 자바 바이트 코드를 실행하기 위한 가상 기계
  • 각 운영체제에 맞는 JVM을 설치해야 한다.

 

 

자바 가상 머신 구성요소

  • 자바 인터프리터 : 자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 역할
  • 클래스 로더(class loader)
    • 자바는 동적으로 클래스를 읽어오기 때문에, 동적으로 클래스를 로딩해주는 역할
  • JIT 컴파일러(Just In Time Compiler)
    • 프로그램이 실행 중인 런타임에 실제 기계어로 변환해 주는 컴파일러
    • 동적 번역을 통해, 프로그램의 실행 속도를 향상시켜 준다.
    • JIT 컴파일러는 자바 컴파일러가 생성한 바이트 코드를 바로 런타임에 기계어로 변환
  • 가비지 컬렉터(Garbage Collector)
    • 더 이상 사용하지 않는 메모리를 자동으로 회수
    • 개발자가 메모리 관리를 하지 않아도 되는 편의성
    • 실행 순서 : 참조되지 않은 객체들 탐색 후 삭제 -> 삭제된 객체의 메모리 반환 -> 힙 메모리 재사용

 


JVM이 관리하는 메모리 구조

  • 자바가 실행되면, JVM은 운영체제로 부터 해당 프로그램을 수행할 수 있도록 필요한 메모리를 할당 받는다.
  • 용도에 따라
    • 1. 메소드(method) 영역
      • 클래스에 대한 정보와 함께 클래스 변수(static variable)가 저장되는 영역
    • 2. 힙(heap) 영역
      • 모든 인스턴스 변수가 저장되는 영역
      • new 키워드를 사용한 인스턴스가 생성되면, 해당 인스턴스의 정보를 힙 영역에 저장한다.
      • 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
    • 3. 스택(stack) 영역
      • 메소드가 호출될 때 메소드의 스택 프레임이 저장되는 영역
        • 스택 프레임(stack frame) : 메소드의 호출 정보
      • 메소드가 호출되면, 메소드 호출과 관계되는 지역변수와 매개변수를 스택에 저장
      • 메소드가 호출되면 함께 할당되고, 호출이 완료되면 소멸한다.

 

JVM - Runtime Data Areas

  • JVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역

1. PC 레지스터(register)

  • 프로그램 실행 포인터를 관리하는 영역

 

2. Native method stack(네이티브 메서드 스택)

  • 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역

 

3. Method area

  • Class 자체에 대한 정보
  • Class를 처음 사용하는 시점에 memory에 올라간다.
  • class의 static field

 

4. heap Area

  • new keyword으로 생성되는 모든 인스턴스가 저장된다.
  • String constant pool : string pool을 heap 안에 가지고 있고, 여기에서 문자열을 관리한다.

 

5. call stack area

  • method가 호출되면 method를 위한 공간이 스택에 쌓인다.
  • 그리고 메소드 안에 사용하는 local variable(지역 변수) 같은 것들이 이 공간에 위치한다.

 

+ Recent posts