Java - JVM, JDK, JRE

jaeeunxo1·2020년 12월 23일
0

Java

목록 보기
1/5
post-thumbnail

1. JVM

**JVM(Java Virtual Machine)**으로 자바 애플리케이션을 클래스 로더를 통해 읽어 자바API와 함께 실행하는 것이다. JVM은 OS에 구애받지 않고 작동할 수 있도록 해준다.
가장 중요한 메모리관리, Garbage collection을 수행한다.

동일한 프로그램도 메모리 관리에 따라 성능이 좌우된다. 한정된 메모리를 효율적으로 사용해 최고의 성능을 내기 위해서 JVM에 대해서 공부하는 것이 중요하다!

2. JVM의 구성요소

2-1 Class Loader

클래스 로더는 이름 그대로 **클래스 파일을 적재(Runtime Data Area)**하는 역할을 한다.

로딩 : 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 메서드 영역에 저장하고 로딩이 끝나면 해당 클래스 타입의 Class객체를 생성하여 힙영역에 저장합니다.

링킹 : .class 파일 형식이 유효한지 검증한다. preparation은 클래스 변수와 기본값에 필요한 메모리를 할당, Resolve는 심볼릭 메모리 레퍼런스를 메서드 영역에 있는 실제 레퍼런스로 교체한다.

초기화 : static 변수의 값을 할당합니다.

2-2Execution Engine

클래스로더에 의해 Runtime Data Area에 적재된 클래스(바이트코드)들을 컴퓨터가 이해할 수 있는 기계어로 변경해 명령어 단위로 실행하는 역할을 합니다. 인터프리터 방식과 JIT Compiler 방식이 있습니다.

자바 바이트 코드 (Java bytecode) : 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스코드를 의미한다. 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드이다.

Intepreter : 이때 명령어를 하나씩 실행하는 다시 기계어로 변환을 하는 작업이다. 이 작업은 비용이 많이 든다

JIT : JIT 방식은 실행 시점에 자주 사용하는 코드들을 기계어로 변환 시켜놓고 저장하고 재사용할때 이미 변환된 기계어 코드를 재 사용하는 방식을 말한다. 초기 실행 속도는 다소 느릴 수도 있다.
인터프리터 방식의 단점을 극복하고 일반적으로 빠른 속도로 실행한다.

2-3 Runtime Data Area = memory

메서드 영역(Method Area) : 클래스 멤버 변수 이름, 데이터 타입, 리턴타입, stack변수 등이 저장됩니다. 클래스 수준의 정보가 저장되며, 여기에 저장된 정보들은 공유됩니다.

힙(Heap Area) : new 연산자로 생성된 객체와 배열이 저장됩니다. 객체는 힙 영역의 주소값을 가지고 있습니다. 여기에 저장된 정보들은 공유 됩니다.

스택(Stack Area) : 스레드가 생성될 때 마다 생성되는 영역으로 대표적으로 지역변수가 여기에 저장됩니다. 메서드를 호출할 때 마다 스택이 개별적으로 생성된다.

PC register : 쓰레드가 생성될 때마다 생성되는 영역으로 Program Counter 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다. 이것을 이용해서 쓰레드를 돌아가면서 수행할 수 있도록합니다. 또한 공유되지 않는 영역입니다.

Native Method Stack : 자바 언어 이외의 언어로 작성된 코드를 저장하는 메모리 영역입니다.

2-4 Garbage Collector

가비지 컬렉터는 힙 영역에 생성된 객체들 중에 참조되지 않는 객체들을 메모리에서 제거하는 역할을 합니다. 또한 가비지컬렉터를 수행하는 쓰레드가 아닌 다른 모든 쓰레드는 일시정지 됩니다.

2. Java Program 동작원리

  1. 프로그램이 실행되면 OS로부터 필요한 메모리를 할당받는다.
  1. 자바 컴파일러(.javac)가 자바 소스코드(.java)를 읽어들여 **자바 바이트코드(.class)**로 변환한다.
  2. Class Loader를 통해 class파일들을 JVM으로 로딩한다.
  3. 로딩된 class 파일들은 Excution engine을 통해 해석된다.
  4. 해석된 바이트코드는 Runtume Areas에 배치되어 실질적인 수행을 한다.

JVM은 실행을 하는동안 메모리를 효율적으로 관리하는 작업을 수행행한다.

3. JDK 와 JRE의 차이점

3-1 JDK

Java Development Kit 의 약자로 자바를 개발하기 위한 모든 키트들을 가지고 있다.
기본적으로 JDK는 JRE와, 콘솔, javacod과 같은 것들을 모두 포함하고 있다.
하지만 JDK11 버전부터는 JRE를 포함하지 않는다. 별도로 개발자들이 JRE를 링크를 걸어서 실행환경을 만들어야 한다. (jlink?)

3-2 JRE

Java Runtime Environment 의 약자로 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있다.

참고

https://asfirstalways.tistory.com/158
https://medium.com/webeveloper/jvm-java-virtual-machine-architecture-94b914e93d86
https://cryptosalamander.tistory.com/4

profile
Backend 🖤

0개의 댓글