JVM이해하기

man soup·2020년 4월 19일
1

자바 공부

목록 보기
2/7

JVM이란?

  • 자바 가상 머신
  • 자바 바이트 코드를 OS에 특화된 코드로 변환(인터프리터 & JIT 컴파일러을 통해)하여 실행한다.
  • 바이트 코드를 실행하는 표준이자 구현체(오라클, 아마존, Azul등의 밴더가 구현)
  • 특정 플랫폼에 종속적이다.

JRE란?

  • JVM + 라이브러리
  • 자바 어플리케이션을 실행할 수 있도록 구성된 배포판
  • 개발 관련 도구 포함X

JDK란?

  • JRE + 개발 툴
  • Write Once Run Anywhere

자바란?

  • 프로그래밍 언어
  • JDK에 들어있는 자바 컴파일러(javac)를 사용하여 바이트코드로 컴파일 할 수 있다.

JVM 언어

  • JVM 기반으로 동작하는 프로그래밍 언어
  • JVM은 바이트 코드로 이뤄진 class 파일을 읽어서 사용함
    -> java언어가 아닌 다른 언어로 코딩해도 class파일로 컴파일 시 JVM에서 사용 가능
    => JVM의 축적된 훌륭한 기능들 및 안전성 사용해 어플리케이션 제작
  • 클로저, 그루비, JRuby, Kotlin 등

JVM 구조

  • 클래스 로더 시스템 : .class 파일에서 바이트 코드를 읽고 메모리에 저장
    • 로딩 : 클래스를 읽어오는 과정
    • 링크 : 레퍼런스를 연결하는 과정
    • 초기화 :static 값들 초기화 및 변수에 할당
  • 메모리 :
    • 메소드 영역 : 클래스 수준의 정보( 클래스 이름, 부모 클래스 이름, 메소드, 변수)를 저장, 공유 자원, 상수 풀 존재해 상수("abc"...) 저장
    • 힙 영역 : 객체를 저장, 공유 자원
    • 스택 영역 : 런타임 스택을 만들고 그 안에 메소드 호출을 쌓는다 (스레드 마다 가짐)
    • PC 레지스터 : 쓰레드 마다 쓰레드 내 현재 실행할 스택 프레임을 가리키는 포인터 생성
    • 네이티브 메소드 스택 : 네이티브 메소드를 위한 스택(ex) createThread()
  • 실행 엔진 :
    • 인터프리터 : 바이트 코드를 한줄 씩 실행
      바이트 코드를 한줄 씩 컴파일 후 실행하는 것 -> 같은 코드를 계속 컴파일하는 것은 낭비 -> JIT 컴파일러 사용
    • JIT 컴파일러 : 인터프리터 효율을 높이기 위해 인터프리터가 반복되는 코드 발견 시 JIT 컴파일러로 반복되는 바이트 코드를 네이티브 코드로 바꿔두면 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.
    • GC : 더 이상 참조 되지 않는 객체들을 모아서 정리
  • JNI(Java Native Interface) : 자바 에플리케이션에서 C,C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법을 제공, Native 키워드를 사용한 메소트 호출
  • 네이티브 메소드 라이브러리 : C,C++로 작성 된 라이브러리

클래스 로더

  • 로딩, 링크, 초기화 순으로 진행

  • 로딩

    • 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들어 메소드 영역에 저장
    • 메소드 영역에 저장하는 데이터
      • FQCN(Fully-Qualified Class Name)
      • 클래스 인지 인터페이스 인지 이늄인지
      • 메소드 & 변수
    • 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 힙 영역에 저장
  • 링크

    • Verify, Prepare, Resolve 단계로 진행
    • Verify : .class 파일 형식이 유효한지 체크
    • Prepare : 클래스 변수(static 변수) 와 기본 값에 필요한 메모리 준비
    • Resolve : 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체( ex)처음에 Book book = new Book()에서 book이 실제 new된 레퍼런스를 가리키지 않고 논리적인 곳을 가리키고 있는데 이걸 실제 메모리 주소를 가리키게 함)
      메모리 레퍼런스이므로 논리 영역 가리키다가 메소드 영역 가리킴(heap 영역x)
  • 초기화

    • Static 변수의 값을 할당(static 블럭이 있으면 이때 실행)
  • 클래스 로더는 계층 구조로 이뤄져 있으며 기본적으로 세가지 클래스 로더가 제공

  • 부트 스트랩 클래스 로더 :
    JAVA_HOME/lib 에 있는 코어 자바 API를 제공
    최상위 우선순위를 가진 클래스 로더

  • 플랫폼 클래스로더 : JAVA_HOME/lib/ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽음

  • 애플리케이션 클래스 로더 : 애플리케이션 클래스패스에서 클래스 읽음

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

profile
안녕하세요

0개의 댓글