[Alex] 데이터 장인의 블로그

[JVM] 기본 개념 정리 본문

Hadoop & Spark

[JVM] 기본 개념 정리

Alex, Yoon 2022. 12. 19. 18:14

 

JVM 내부 (Java Virtual Machine)

자바 컴파일 과정 

자바 컴파일러는 .java 로 작성된 파일을 읽어 Class화 한다. Class 화 한다는 것은 바이트 코드로 변환하여 클래스 로더에 의해 JVM에 들어와 메모리 공간을 만들어주고 컴퓨터가 이해할 수 있는 기계어로 만든다는 것. 즉, 클래스 로더에 의해 클래스 파일 내 내용이 JVM 안의 메모리로 올라가고(Method Area), 기계어로 변환도 해주는 역할을 수행한다. 

https://velog.io/@minkeun428

JVM 이란?

이렇게 자바 바이트 코드화 된 반기계어는 아직 '컴퓨터'가 읽을 수 없는 바이트 코드를 뜻하며, JVM이 이 바이트 코드를 완전한 기계코드로 바꿔준다. JVM은 자바 가상머신으로 자바 프로그램을 실행시켜주는 가상 컴퓨터라고 생각하면 된다. 

 

Method Area에 배치된 자바 .class파일의 byte 코드는 실행 엔진 속 interpreter가 해석하여 cpu에게 작업을 수행시킨다. 이러한 실행 과정 속에서 JVM은 필요에 따라서 스레드 동기화나 가비지 컬렉션 같은 메모리 관리 작업을 수행. 

Runtime Data Area (JVM Memory)

쓰레드가 메모리를 공유하는 영역 

메소드 영역 : 클래스에 대한 모든 정보가 저장. 클래스 정보를 파싱해서 저장하는 공간. (변수, 메소드, 정적 변수 등)

힙 영역 : 런타임에 생성되는 모든 객체들이 생성. (메소드 실행과정에서 선언된 변수) 프로그램을 실행하면서 생성한 모든 객체를 저장. 중요! 가비지 컬렉터가 활동하는 공간. 

쓰레드마다 존재하는 영역 

JVM Stack : 새로운 메소드가 생성될때 마다 하나씩 쌓이고 종료되면 차례대로 사라지는 형태의 구조. 

PC Register : 현재 실행되고 있는 명령의 주소들을 저장하고 있음. 멀티 쓰레드로 구동되는 작업들이 선 수행되고 난 다음에는 PC가 기억하고 있는 다음 작업을 수행하여야 한다. 즉, 스레드가 어떤 명령어로 실행되어야 할지 기록하는 부분(JVM 명령의 주소를 가짐)

Native Method Stack : 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역. C, C++ 로 작성된 메소드가 수행될 때. 실행되는 영역

 

즉 JVM Stack, PC Register, Native mothod Stack 이 서로 동시성을 침범하지 않는 이유는 각각의 쓰레드의 메모리를 공유하지 않음 때문이다. 

출처 : https://www.nowwatersblog.com/cs/JVM

JVM이 CPU 레지스터를 사용하지 않고 Stack구조로 구성한 이유. 

각 컴퓨터의 레지스터 사양은 각자 다르기 때문에, 레지스터를 사용하게 된다면 최소한의 OS 사양에 영향을 주게된다(EX.최소 레지스터 개수 필요). 계산 과정이 복잡해질 수 있더라도 Stack 을 사용하는 것이 더 안정적인 구동이 가능 .

 

실행 엔진

Class Loader에 의해 JVM Memory에 적재된 .class 파일을 기계어로 변경하여 명령어 단위로 실행하는 역할을 수행한다. 

Interpreter

  • 명령어를 하나하나 실행하는 방법
  • 특징: 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행. 하나하나의 실행은 빠르나, 전체적인 실행속도가 느리다는 단점

JIT(Just-In-Time) 컴파일러

  • JIT는 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 실행하는 방법이다.
  • 특징: 인터프리터의 단점을 보완하기 위해 도입되었으며 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 바이너리 코드를 직접 실행하는 방식이다. 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠르다.

 

반응형
Comments