ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JVM 이해하기
    Computer Science/JAVA 2021. 1. 12. 16:30

    JVM 이해하기

    JVM(Java Virtual Machine)

    • 자바 바이트 코드를 OS에 특화된 코드로 변환시켜서 실행합니다.
    • 플랫폼에 종속적입니다

    JRE(Java Virtual Machine)

    • 자바 애플리케이션을 실행할 수 있도록 구성하는 배포판입니다
    • JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일을 가지고 있습니다
    • 개발 관련 도구는 포함하지 않습니다

    JDK(Java Development Kit)

    • JRE + 개발 관련 도구
    • 소스 코드를 작성할 때 사용하는 자바 언어는 플랫폼에 종속되지 않습니다

    JAVA

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

    JVM 구조

    1. 클래스 로더 시스템
    • .class에서 바이트 코드를 읽고 메모리에 저장합니다
    • 로딩 : 클래스를 읽어오는 것
    • 링크 : 레퍼런스를 연결하는 과정
    • 초기화 : static 값들을 초기화 및 변수에 할당
    1. 메모리
    • 메소드 영역 : 클래스 수준의 정보(부모 클래스, 클래스 이름, 메소드, 변수 등)를 저장, 프로세스 공유
    • 힙 영역에는 객체를 저장, 프로세스 공유
    • 스택 영역에는 쓰레드마다 스택을 만들고, 그 안에 메소드 호출을 스택 프레임이라 부르는 블럭으로 쌓음.
    • PC 레지스터 : 쓰레드마다 현재 실행할 스택 프레임을 가리키는 포인터
    • 네이티브 메소드 스택 : 네이티브 메소드를 사용하는 스택

    네이티브 메소드란?

    • C, C++, 어셈블리 등으로 작성된 메소드
    • Native 키워드를 붙여 사용
    1. 실행 엔진
    • 인터프리터 : 바이트 코드를 한 줄씩 실행
    • JIT 컴파일러 : 인터프리터의 효율을 높이기 위해, 인터프리터가 반복되는 코드를 발견하면 JIT 컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿔둔다.
    • GC(garbage collector) : 더 이상 사용하지 않는 객체를 모아서 정리

    클래스 로더

    • 로딩, 링크, 초기화 순서로 진행
    • 로딩
      • 클래스 로더가 class 파일을 읽어 그 내용에 따라 바이너리 데이터를 만들고 메소드 영역에 저장함
      • 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 힙 영역에 저장
    • 링크
      • .class 파일 형식이 유효한지 체크하고 클래스 변수와 기본값에 필요한 메모리를 준비합니다.
    • 초기화
      • static 변수의 값을 할당합니다

    클래스 로더는 계층 구조로 이루어져있음.
    부트 스트랩 클래스 로더 → 플랫폼 클래스 로더 → 애플리케이션 클래스 로더

    • 부트 스트랩 클래스 로더 - JAVA_HOME\lib에 있는 코어 자바 API를 제공한다. 최상위 우선순위를 가진 클래스 로더
    • 플랫폼 클래스로더 - JAVA_HOME\lib\ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다.
    • 애플리케이션 클래스로더 - 애플리케이션 클래스패스(애플리케이션 실행할 때 주는 -classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치)에서 클래스를 읽는다.

    Reference

    인프런 - 더 자바, 코드를 조작하는 다양한 방법 (백기선)

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

    String, StringBuilder, StringBuffer  (0) 2021.08.20
    Object 클래스  (0) 2021.08.20
    예외 처리  (0) 2021.08.12
    Maven vs Gradle  (0) 2021.01.18
    Java 인스턴스 비교  (0) 2020.12.21

    댓글

Designed by Tistory.