[Java] 자바, JVM, JDK, JRE 그리고 JVM 구조

YulHee Kim·2021년 12월 18일
1

Java

목록 보기
5/8
post-thumbnail

백기선님의 더 자바, 코드를 조작하는 다양한 방법을 수강한 후 정리해보았습니다.

[ JVM 이해하기 ]

💡 JVM(Java Virtual Machine)

  • 자바 가상 머신
  • class file 안에 들어있는 자바 바이트코드를 인터프리터나 JIT컴파일러를 실행해 OS에 특화된 코드로 변환하여 실행합니다.
  • 그래서 플랫폼에 종속적입니다.
  • 바이트 코드를 어떻게 실행하는지에 대한 스팩입니다. 구현체는 다양합니다.
  • JVM 벤더: 오라클, 아마존, Azul, ..

JVM은 JVM 혼자 단독으로 제공되지 않습니다. 최소한의 배포 단위는 JRE입니다.
JRE는 library와 JVM을 함께 제공하는 것입니다. JRE의 목적은 자바 어플리케이션을 실행하는 것입니다.

💡 JRE(Java Runtime Environment)

  • 자바 애플리케이션을 실행할 수 있도록 구성된 배포판
  • JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일을 가지고 있습니다.
  • 개발하는데 필요한 툴은 제공되지 않습니다.(JDK에서 제공)

💡 JDK(Java Development Kit)

  • JRE + 개발에 필요한 툴
  • 소스코드를 작성할 때 사용하는 자바 언어는 플랫폼에 독립적
  • 오라클은 자바 11부터 JDK만 제공하고있습니다. 모듈 시스템을 사용할 수 있으므로 JRE를 따로 제공하지 않습니다.

💡 Java

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

💡 JVM 언어

  • JVM 기반으로 동작하는 프로그래밍 언어
  • 클로저, 그루비, Kotlin, Jython 등
  • 위 언어들을 컴파일했을 때 class file이나 java file이 만들어주기만 한다면 JVM을 활용할 수 있습니다.

[ JVM 구조 ]

💡 클래스 로더 시스템

  • .class에서 바이트코드를 읽고 메모리에 저장합니다.
  • 로딩: 클래스를 읽어오는 과정입니다.
  • 링크: 레퍼런스를 연결하는 과정입니다.
  • 초기화: static 값들을 초기화하고 변수에 할당합니다.
    클래스에는 static 값을 설정할 수 있습니다. 이것을 다른 메서드에서 참조해서 사용할 수 있습니다. 이런 값들을 초기화하는 과정이라고 할 수 있습니다.

💡 메모리

  • 메소드 영역: 클래스 수준의 정보를 저장합니다. (클래스 이름, 풀패키지 경로, 부모 클래스 이름, 메소드, 변수들) 공유 자원입니다.
  • : 힙 영역에는 객체를 저장하며 공유 자원입니다.

힙과 메소드는 공유 자원이지만, 스택, PC, 네이티브 메소드 스택은 쓰레드에 국한되는 자원입니다.

  • 스택: 스택 영역에는 스레드마다 런타임 스택을 만들고 그 안에 메소드 호출을 스택 프레임이라 부르는 블럭으로 쌓습니다. 쓰레드 종료를 하면 런타임 스택도 사라집니다.
    예를들어 에러 메세지 로그를 보면 메소드가 쭉 쌓여있는 것을 볼 수 있습니다. 스택 안에 쭉 메서드 호출이 쌓여있는 것입니다.
  • PC(Program Counter) 레지스터: 쓰레드 마다 쓰레드 내 현재 실행할 스택 프레임을 가리키는 포인터가 생성됩니다. 스레드에 국한됩니다.
  • 네이티브 메소드 스택: 네이티브 메소드를 호출할 때 사용하는 별도의 메소드 스택입니다. 네이티브 메소드는 네이티브 키워드를 붙여놓고 구현은 C나 C++로 구현된 메소드입니다.

💡 실행 엔진

  • 인터프리터: 바이트 코드를 한줄씩 실행합니다. 한줄마다 네이티브 코드로 컴파일하는 것입니다.
  • JIT 컴파일러: 인터프리터 효율을 높이기 위해, 인터프리터가 반복되는 코드를 발견하면 JIT컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿔둡니다. 인터프리터가 해당하는 라인을 보면 바로 네이티브 코드로 컴파일된 코드를 사용합니다.
  • GC(Garbage Collector): 더이상 참조되지 않는 객체를 모아서 정리합니다.

참고)

profile
백엔드 개발자

0개의 댓글