JVM 구조

정민영·2022년 4월 9일

java

목록 보기
2/3

  • 클래스 로더

    • 클래스 로더는 .class에서 바이트코드를 읽고 기계로 변환해 메서드 영역에 저장하고 로딩이 끝나면 해당 클래스 타입의 객체를 생성하여 힙 영역에 저장한다.
    • 클래스 로더는 로딩-링크-초기화 3계의 단계로 나눠볼수 있다.
    • 로딩: .class 파일에서 바이트코드를 읽어오는 과정이다.
    • 링크: 레퍼런스를 연결하는 과정
    • 초기화: static 값들 초기화 및 변수에 할당한다.
  • 메모리

    • 메소드: 메서드 영역에는 클래스 수준의 정보를 저장하고 공유하는 자원이다.(클래스 이름, 부모 클래스 이름, 메서드 정보, 변수정보) 공유자원이기에 jvm당 하나의 메서드 영역만을 가지며 모든 스레드가 하나의 메서드 영역을 사용하게 되므로 스레드 세이프 해야하는 영역이다.
    • 힙 : 힙 영역 역시 공유자원이고 jvm당 하나의 힙영역 밖에 생성되지 않는다. 힙 영역은 new 연산으로 생성된 인스턴스나 배열이 저장된다. if -> App app = new App(); 으로 생성되었다면 힙영역에 인스턴스가 저장되고 app 인스턴스는 힙영역의 주소값을 가지고 있게 된다.
    • 스택 : 스택 영역은 공유 리소스가 아닌 스레드가 생성될때 마다 스레드에 할당되는 영역이고 대표적으로 지역변수가 여기에 저장된다고 한다. 스레드가 시작되면 '메서드 호출'을 저장하기 위해 별도의 '런타임 스택' 이 생성되고 메서드 호출마다 'stack Frame'이라는 하나의 항목이 생성되어 런타임 스택의 맨 위에 추가 되며 이렇게 추가된 항목을 스택 프레임이라고 한다.(종료시 pop된다)
    • 스택 영역은 아래와 같이 3가지 영역으로 나눠집니다.
      • Local Variable Array(로컬변수 배열): 메서드의 파라미터와 지역 변수들을 저장하는 배열이다. 0 에는 메서드가 속한 클래스 인스턴스의 참조값이 있고 1에는 메서드로 전송된 파라미터 정보가 저장된다. 파라미터 다음엔 메서드의 지역변수가 저장된다고 한다.
      • Operand Stack(피연산자 스택): 필요한 경우 중간 작업을 수행하는 런타임 작업 영역 역할을 한다. 각 메서드는 피연산자 스택과 로컬변수 배열 간에 데이터를 교환하고 다른 메서드를 푸시하거나 팝업하여 결과를 호출한다.
      • Reference to Constant Pool : Constant Pool resoulution의 정보, 메서드가 정상종료되었을때의 정보, 비정상종료 되었을때의 예외 정보를 저장한다고 한다.
    • PC register: 각 JVm 스레드에 대해 스레드가 시작되면 현재 실행중인 명령의 주소(메서드 영역의 메서드 메모리 주소)를 보유하기 위해 생성된다.(네이티브 메서드는 pc 레지스터에 정의되지 않는다.). 현재 스택영역의 실행이 완료되면 pc 레지스터가 다음 명령의 주소로 업데이트 된다.
    • Native Method Stack: 자바 언어 이외의 언어(C, C++) 로 작성된 코드를 저장하는 메모리 영역이다. 주로 native 키워드가 붙은 항목이 저장된다. 또한 이렇게 native 키워드가 붙은 항목을 JNI 라고 하고 JNI를 구현한 걸 네이티브 메서드 라이브러리 라고 한다.
  • 실행엔진(Execution Engine) : (이부분은 자세한 공부가 더 필요하다.) runtime data area에 적재된 바이트코드가 실행되는 공간이다. 실행엔진이 바이트코드를 읽어들여 실행한다.

    • 인터프리터 : 읽어들인 바이트 코드를 한줄씩 실행한다. 같은 코드가 중복되는 경우 같은걸 또 실행해야한다.
    • JIT 컴파일러: 인터프리터 효율을 높이기 위해 인터프리터가 반복되는코드를 발견하면 IT 컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿔두고 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.

0개의 댓글