JVM 이란 ?

  • 어느 OS 어느 환경에서 든지 java를 실행시킬수 있게 해줌.
    • bytecode가 JVM위에서 실행되기 때문이다.
  • java bytecode를 os가 읽을수 있게 바꿔줌 ( 이 작업은 인터프리터와 JIT컴파일러를 사용)
    • 특정 OS별로 네이티브 언어를 바꿔줘야 하기때문에 특정 OS에 종속적이다.

컴파일 하는 방법.

  • javac.exe 를 사용하여 컴파일 한다.

실행하는 방법

  • java.exe 를 사용하여 클래스파일을 실행시킨다.

바이트코드란 무엇인가 ?

  • jvm이 이해할수 있는 상태인 코드
  • 이 바이트 코드는 인터프리터와 JIT 컴파일러가 읽을 수 있다.

JIT 컴파일러란 무엇이며 어떻게 동작하는지 ?

  • 중복된 바이트코드를 네이티브 언어로 모두 바꿔주는 컴파일러

  • 인터프리터가 읽으면서 컴파일시키고 실행하다가 중복되는 부분을 발견하면

  • JIT컴파일러로 보낸다 그럼 JIT 컴파일러가 중복된 바이트코드를 모두 네이티브 언어로 바꿔준다.

JVM 구성요소

  • 클래스 로더 시스템 , 메모리 , 실행엔진 , 네이티브 메소드 인터페이스, 네이티브메소드 라이브러리로 나뉘어져 있다.
  1. 클래스로더 시스템

    • 컴파일된 class 파일들을 읽어서 메모리에 적절히 배치시킨다.
    1. 로딩

      • 클래스에서 바이트코드를 읽어오는 과정

      • 클래스 로더가 class파일을 읽고 그 내용에 따라 바이너리 데이터를 만들고 메소드 영역에 저장

      • 이떄 저장하는 데이터는

        • FQCN ( 패키지, 풀 패키지 경로와 클래스 이름 )
        • 클래스 , 인터페이스, 이늄 ( 클래스가 어떤 타입인지 저장 )
        • 메소드와 변수
      • 로딩이 끝나면 해당 클래스 타입의 class 객체를 생성하여 힙 영역에 저장.

      • 처음에 bootstrap classloader에서 찾아서 없으면 자식인 platform classloader가 찾고

      • 또 없으면 application classloader가 찾아서 없으면 class not found 익센션을 호출

      • bootstrap classloader는 네이티브 코드로 구현되어 있어 JVM마다 구현이 다 다르다.

    2. 링크

      • 레퍼런스를 연결하는 과정
      • verify , prepare, revolve 3단계로 나뉘어져 있다.
        • verify
          • .class파일이 유효한지 확인
            • 파일이 유효하지 않으면 JVM에러로 종료됨.
        • prepare
          • static변수와 기본값에 필요한 메모리를 준비하는 과정
        • Resolve ( Optional )
          • 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체하는 과정.
          • 심볼릭 메모리 레퍼런스란 ?
            • 다른 객체를 참조할때 논리적으로만 연결시켜놓고 실제론 연결되어 있지 않음.
    3. 초기화

      • statc 값들 초기화 및 변수에 할당
  2. 메모리

    1. 스택
      • JVM 쓰레드가 생길때 해다 쓰레드를 위한 스택도 같이 생긴다.
      • 이때 프레임이 스택에 들어가며 이 프레임은 메소드가 호출될때마다 만들어지며
      • 메소드의 상태 정보를 저장한다.
      • 쓰레드를 종료하면 런타임 스택도 사라진다.
    2. PC
      • 쓰레드마다 쓰레드 내 현재 실행할 스택 프레임을 가리키는 포인터가 생성된다.
    3. 네이티브 메소드 스택
      • 쓰레드 마다 생기는 스택인데 native method가 호출될때 쌓인다.
      • JNI를 사용하는 메소드는 여기에 스택이 쌓인다.
      • 객체를 저장, 공유
    4. 메소드
      • 클래스 수준의 정보를 저장, 공유
      • (클래스 이름 , 풀패키지 경로 , 부모 클래스 이름 , 메소드 , 변수)
      • 다른 영역에서 참조 가능
  3. 실행 엔진

    1. 인터프리터
      • 바이트코드를 한줄마다 읽음과 동시에 네이티브 코드로 변경시키면서 실행시킴.
    2. JIT 컴파일러
      • 인터프리터가 반복되는 코드를 찾으면 JIT 컴파일러로 보내서 JIT 컴파일러가 반복되는 코드를 모두 네이티브 코드로 바꿔둔다.
      • 그러면 인터프리터는 네이티브 코드를 바로 실행시킨다.
    3. GC
      • 더이상 참조되지 않은 객체를 메모리에서 해제시킨다.
  4. 네이티브 메소드 인터페이스

    • 자바에서 C나 C++된 함수를 사용할수 있는 방법을 제공하는 인터페이스
  5. 네이티브 메소드 라이브러리

    • C , C++로 작성된 라이브러리

JDK와 JRE의 차이

  • JRE는 단순히 자바를 실행할수 있게만 해줌

    • JVM과 라이브러리들이 포함.
    • 자바 런타임 환경에서 사용되는 프로퍼티 세팅이나 리소스 파일을 가지고 있다.
  • JDK는 JRE와 개발툴들이 같이 포함되어 있음.

출처

'백선생님 온라인스터디' 카테고리의 다른 글

6주차 상속  (0) 2021.01.10
4주차 - 제어문  (0) 2021.01.09
3주차 연산자  (0) 2021.01.07
연산자  (0) 2020.11.28
스터디 2주차 - 자바 데이터타입, 변수 그리고 배열  (0) 2020.11.21

+ Recent posts