notepad

JVM 이해하기 본문

JAVA/JAVA

JVM 이해하기

likewise_ 2020. 9. 1. 20:59

https://www.inflearn.com/course/the-java-code-manipulation

JDK, JVM, JRE
JVM - 자바가상머신, 컴파일된 자바 바이트코드를 OS에 특화된 코드로 변환하여 실행한다.
클래스를 읽고, 메모리에 올리고, 실행하고. JVM 자체는 플랫폼에 종속적이다.

JRE = JVM + Library : 실행에 필요한 것만 포함되어있다
JDK = JRE + devtools
Java11 부터는 JDK만 제공한다


JVM 구조

(크게 4영역)

  1. 클래스 로더 시스템
  2. 메모리
  3. 실행엔진
  4. 네이티브 메소드 인터페이스(JNI), 네이티브 메소드 라이브러리

클래스 로더 시스템(3영역)

바이트코드를 읽고 메모리에 저장

  1. 로딩 : 클래스를 읽어오는 과정
  2. 링크 : 레퍼런스를 연결하는 과정
  3. 초기화 : static 값들 초기화 및 변수에 할당

메모리(5영역)

  • 모든 영역에 공유 : 메소드, 힙
  • 스레드에서 공유 : 스택, PC, 네이티브 메소드 스택
    • 메소드 : 클래스 수준(클래스명, 부모클래스명, 변수) 의 정보를 저장, 공유 자원이다.
    • 힙 : 실제 인스턴스 저장. 공유자원이다
    • 스택: 쓰레드마다 런타임 스택을 만들고, 그 안에 메소드 호출을 스택 프레임이라 부르는 블럭으로 쌓는다. 쓰레드를 종료하면 런타임 스택도 사라진다.
    • PC 레지스터 : 현재 실행할 스택 프레임을 가리키는 포인터
    • 네이티브 메서드 스택 : JNI를 통해 네이티브 메서드 라이브러리를 사용하기 위한 정보가 저장된다.
      • public static native Thread currentThread(); | c나 c++ 같은 네이티브 언어로 작성된 코드, native 키워드가 붙는다

실행엔진

  • 인터프리터, JIT 컴파일러, GC
  • 바이트코드를 인터프리터가 읽어서 네이티브 코드로 변환하여 실행한다
  • JIT 컴파일러 : 바이트코드를 네이티브 코드로 컴파일, 인터프리터 효율을 높이기 위해 인터프리터가 반복되는 코드를 발견하면 JIT컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿔준다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.
  • GC : 더이상 참조되지 않는 객체를 모아서 정리한다.
    • StopTheWorld - GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
    • 힙 메모리를 대상으로 일어난다. 새로운 객체는 Eden영역에 할당된다.
      결론 : 클래스로더가 읽어서 적절히 메모리에 적재 후 실행엔진이 실행.

클래스로더 시스템 상세

클래스 로더 시스템(3영역)
바이트코드를 읽고 메모리에 저장
1. 로딩 : 클래스를 읽어오는 과정
2. 링크 : 레퍼런스를 연결하는 과정
3. 초기화 : static 값들 초기화 및 변수에 할당
  1. 로딩 : bootstrap -> Platform(Extension) -> Application 클래스로더 | 부모로부터 클래스 검색을 하고, 자신까지 못 찾으면 ClassNotFountException 이 발생한다.
  • 클래스 로더가 클래스 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들어 “메소드(클래스정보저장)” 영역에 저장
    • 메소드 영역에 저장되는 데이터 : FQCN(풀패키지경로), class, interface, enum, method, variable
  • 로딩이 끝나면 해당 클래스 타입의 객체를 생성하여 “힙”에 저장
  1. 링크(3단계) :

-> verify (검증, 클래스파일이 유효한지 검증)
-> prepare 메모리를 준비하는 과정 (클래스변수와 기본값에 필요한 메모리)
-> resolve(optional) - 메서드 참조 시, 심볼릭 메모리 레퍼런스를(링크 단계에서는 논리적 레퍼런스. 실제로 객체를 가리키고 있지 않다) 힙에 있는 실제 레퍼런스로 교체한다.

  1. 초기화

-> 준비된 메모리에 스태틱 변수의 값을 할당한다. | 스테틱 블럭이 있다면 이 때 실행

'JAVA > JAVA' 카테고리의 다른 글

[레시피2] 스프링코어 - POJO와 IOC컨테이너를 다루는 기술  (0) 2021.03.10
리플렉션  (0) 2020.09.04
Generics - 제네릭 사용 이유  (0) 2020.05.27
Comments