본문 바로가기
  • 꾸준히 앞으로
언어 log/Java

[Java] JVM(Java Virtual Machine) 구조

by lijly 2020. 9. 10.

JVM의 역할


  • 자바 애플리케이션을 Class Loader를 통해 읽어 들여 자바 API와 함께 실행
  • JVM은 Java와 OS 사이에서 중개자 역할을 수행

    → JAVA가 OS에 독립적으로 실행 및 재사용을 가능하게 함

  • 메모리관리, Garbage collection을 수행
  • 스택기반의 가상머신
    • ARM 아키텍쳐 같은 하드웨어는 레지스터 기반으로 동작하는데 비해 JVM은 스택기반으로 동작한다

 

JVM 구조


.java 파일이 javac(java 컴파일러)를 거쳐 .class 파일로 만들어져 JVM으로 들어온다.

💡
.class 파일 = 바이트 코드
- byte 코드 → JVM과 같은 가상 머신이 이해할 수 있는 코드 - binary 코드
→ CPU가 이해할 수 있는 코드

 

Class Loader

바이트 코드를 읽어오며 메모리에 적절히 배치하는 역할

  • 로딩 : .class 파일을 읽어온다.
  • 링크 : 코드 내부의 레퍼런스를 연결
  • 초기화 : 클래스에 있는 static 값들을 초기화

Runtime Data Area(Memory)

JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다

[Method Area, Heap Area]

전체 공유 자원

  • Method : 클래스 수준의 정보 저장
    • 클래스 멤버 변수, 메소드 정보, Type(Class or interface)정보, Constant Pool, static, final 변수 등이 생성된다.
    • 상수 풀은 모든 Symbolic Refernce를 포함하고 있다.
  • Heap : 객체(인스턴스)수준의 정보 저장
    • GC의 주요 대상

 

[Stack Area, PC register, Native Method Stack]

쓰레드 단위로 하나씩 생성된다.

  • Stack : 인스턴스 및 지역 변수의 참조 주소들을 저장
    • JVM시작 시 생성되고 프로그램이 종료될 때까지 유지된다.
    💡
    클래스 Person p = new Person(); 이라는 소스를 작성했다면
    Person p는 스택 영역에 생성되고
    new로 생성된 Person 클래스의 인스턴스는 힙 영역에 생성된다.
    스택영역에 생성된 p의 값으로 힙 영역의 주소값을 가지고 있다.
    → 즉, 스택 영역에 생성된 p가 힙 영역에 생성된 객체를 가리키고(참조하고) 있는 것
    • 쓰레드마다 런타임 스택, 스택 프레임(메소드 call)을 쌓는다
  • PC register : 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역
    • Program Counter
  • Native Method Stack : 네이티브 메소드 호출할 때 사용하는 별도의 스택
    • 네이티브 메소드는 java가 아닌 low-level로 구현된 메소드

      ex. Thread.currentThread()

Execution Engine

  • 인터프리터
    • 바이트 코드를 한줄 한줄 읽어서 네이티브 코드로 변환
  • JIT(Just In Time) 컴파일러
    • 바이트 코드에서 반복되는 코드 부분은 JIT 컴파일러가 미리 네이티브 코드로 변환시켜 놓음
    • 반복되는 코드가 읽힐 순서가 왔을 대, 인터프리터로 읽지 않고 바로 네이티브 코드를 바로 사용한다.
    • 인터프리터 읽을 때의 속도 효율성을 JIT 컴파일러가 보완하는 형태
  • GC(Carbage Collector)
    • 더 이상 참조되지 않는 객체를 모아서 메모리 정리를 한다.

 

⍞ Reference


 

 

 

'언어 log > Java' 카테고리의 다른 글

[Java] Array to List, List to Array  (0) 2020.06.13
[Java] Array copy 배열 복사/복제  (0) 2020.05.31

댓글