[JAVA] JAVA, JVM, JDK, JRE

 

 

 

- JVM(Java Virture Machine)

자바 가상 머신으로 자바 바이트코드(.class) 파일을 해당하는 운영체제(OS)에 맞는 코드로 변환하여 실행한다.(컴파일)

 

- JRE(Java Runtime Environment)

JVM + 라이브러리이며, 자바를 실행 할 수 있도록 구성된 배포판이다. 자바 런타임 환경에서 사용하는 리소스 파일 등을 가지고 있다. (11버전부터 따로 제공되지 않음)

 

- JDK(Java Development kit)

JRE + 개발 툴이며, JRE에서 추가적으로 개발에 관련된 도구들을 포함한다. Java를 사용하는 개발자들은 JDK를 설치하여 개발한다.

 

 


*JVM의 구조

  • 클래스 로더
  • 메모리
  • 실행 엔진
  • 네이티브 메소드 인터페이스(JNI)
  • 네이티브 메소드 라이브러리

 

 

1) 클래스 로더

자바 클래스를 자바 가상 머신으로 동적 로드하는 자바 런타임 환경의 일부이다. 로딩, 링크, 초기화 등의 작업을 수행한다. 자바 클래스(.class)에서 바이트코드를 읽고 메모리에 저장한다. (메모리에 가기 전 바이트코드를 조작할 수 있다)

 

  • 로딩: 클래스로더가 바이트코드(.class)를 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들어 "메소드" 영역에 저장한다. 저장되는 데이터는 클래스, 인터페이스, 이늄, 클래스의 전체경로, 메소드, 변수 등이 있다. 로딩을 마치고나면 해당 클래스 타입의 Class 객체를 힙 영역에 저장한다.
  • 링크: 바이트코드(.class)를 검증, 준비, resolve 등의 작업을 거친다. 바이트코드(.class) 파일의 형식이 유효한지 체크하고 클래스 변수(static 변수)와 기본값에 필요한 메모리 등을 준비하고 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다.
  • 초기화: Static 변수의 값을 할당한다. (static 변수나 블럭을 이때 실행한다.)

 

 

2) 메모리

  • 스택: 쓰레드마다 런타임 스택을 만들고, 그 안에 메소드 호출을 스택으로 쌓는다. 쓰레드 종료시 런타임 스택도 사라진다.
  • PC: 쓰레드마다 쓰레드 내 현재 실행할 스택 프레임을 가리키는 포인터를 생성한다.
  • 네이티브 메소드 스택: 네이티브 메소드가 실행될 때, 스택을 만들고 네이티브 메소드 호출을 스택으로 쌓는다. 쓰레드에 따라 동작한다.
  • 힙: 객체를 저장 공유하는 자원이다.
  • 메소드: 클래스에 수준의 정보(클래스 이름, 메소드, 변수 등)를 저장 공유하는 자원이다.

 

 

3) 실행 엔진

  • 인터프리터: 바이트코드를 한줄씩 실행한다.
  • JIT 컴파일러: 인터프리터에서 바이트코드를 한줄씩 실행하면서 반복되는 바이트코드를 발견하면 JIT컴파일러로 반복되는 코드를 네이티브 코드로 바꿔두고 사용한다.(성능적 이점)
  • GC(Garbage Collector): 더 이상 참조되지 않는 객체를 모아서 정리한다.

 

 

4) JNI(Java Navtive Interface)

네이티브 인터페이스로 네이티브 메소드 라이브러리에 있는, 또는 native 키워드가 사용된 함수를 사용할 수 있는 방법을 제공한다. 

 

 

5) 네이티브 메소드 라이브러리

C, C++로 작성된 라이브러리이며 Java에선 native 키워드로 사용된 메소드로 되어있다.

 

 

 

 

+ Recent posts