CS Study 9주차: [Java] 자바 가상 머신(JAVA Virtual Machine)

hjern·2024년 4월 17일
0

CS Study

목록 보기
8/10

JAVA 의 특징

컴파일된 코드(바이트코드)는 플랫폼 독립적이기 때문에 어느 하드웨어(CPU)든, 어느 운영체제(OS)든 상관 없이 구동할 수 있다는 장점이 있다. 이는 어느 플랫폼이든 간에 작성된 소스를 변경할 필요 없이 실행할 수 있다는 의미인데, 이러한 특징은 자바 가상 머신(JAVA Virtual Machine) 을 통해 구현된다. JVM은 단순하게 말하면 컴파일된 코드(바이트코드)를 실행시켜주는 가상의 컴퓨터라고 볼 수 있다. 물론, 실제 H/W와 OS 위에 실행되기 때문에 JVM 자체는 플랫폼에 따라 호환되는 JVM을 실행시켜야 한다.

자바 가상 머신(JAVA Virtual Machine)

JVM의 역할

시스템 메모리를 관리하면서, 자바 기반 애플리케이션을 위해 이식 가능한 실행 환경을 제공함

  1. 자바 프로그램이 어느 기기나 운영체제 상에서도 실행될 수 있도록 하는 것
  2. 프로그램 메모리를 관리하고 최적화하는 것

즉, JVM은 코드를 실행하고, 해당 코드에 대해 런타임 환경을 제공하는 프로그램에 대한 사양이며 개발자들이 말하는 JVM이란 보통 어떤 기기 상에서 실행되고 있는 프로세스 특히, 자바 앱에 대한 리소스를 대표하고 통제하는 서버를 지칭한다.

자바 코드(JAVA Code) 실행 과정

  1. 작성된 자바 소스 즉, 확장자가 .java인 파일을 자바 컴파일러(JAVA Compiler)를 통해 자바 바이트 코드(.class file)로 컴파일
  2. 컴파일된 바이트 코드를 JVM의 클래스 로더(Class Loader)에게 전달
  3. 클래스 로더는 동적 로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩, 링크하여 런타임 데이터 영역(Runtime Data Area) 즉, JVM 메모리에 올림
  4. 실행 엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와 실행

JVM 속 동작 환경


1. 3 main components of JVM Architecture
JVM 내로 클래스 파일(*.class)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다. 런 타임시 동적으로 클래스를 로드하고 jar 파일 내 저장된 클래스들을 JVM 위에 탑재한다. 즉, 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크하는 역할을 한다.

.class file(바이트 코드)은 JVM 내 클래스 로더에게 전달되어 실행엔진에 의해 기계어로 해석되며 Runtime Data Area에 배치됨

1) Class Loader subsystem

(1) load

  • 메모리에 바이트 코드를 할당하는 일을 담당

(2) link

  • Verify(검증): 기본적으로 클래스 로더에 의해 로딩된 바이트 코드가 JVM Class Specification과 그 상세에 알맞게 구성됐는지 체크하는 단계
  • Prepare(준비): 클래스가 필요로 하는, 클래스 변수에 한해서(not for the instance variables) 메모리를 할당되는 과정
  • Resolve(분석): 클래스 내의 모든 심볼릭 레퍼런스(기호 참조)가 해결되는 과정으로써 다이렉트 레퍼런스(실제 참조)로 변경되는 과정

(3) initialize
클래스 변수들을 적절한 값으로 초기화

2) 5 areas or Runtime data areas
프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간

(1) Methord Area

클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간(클래스와 메소드, 멤버(클래스, 인스턴스)변수와 상수(final) 정보 등이 저장되는 공간)
ㄴ Runtime Constant Pool : 스태틱 영역에 존재하는 별도의 관리영역. 상수 자료형을 저장하여 참조하고 중복을 막는 역할을 수행한다.

(2) Heap

New명령어를 통해 생성한 인스턴스와 배열 등의 참조형 변수정보가 저장되는 공간.물론 Method Area에 올라온 클래스들만 생성이 가능. GC의 대상. 단, 참조형 변수의 경우, Heap에 인스턴스가 저장되는 것이 아닌 포인터가 저장된다.

Permanent Generation : 생성된 객체들의 정보의 주소값이 저장된 공간이다. 클래스 로더에 의해 load되는 Class, Method 등에 대한 Meta 정보가 저장되는 영역이고 JVM에 의해 사용된다. Reflection을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다.

💡 Reflection이란?
객체를 통해 클래스의 정보를 분석해 내는 프로그래밍 기법. 구체적인 클래스 타입을 알지 못해도, 컴파일된 바이트 코드를 통해 역으로 클래스의 정보를 알아내어 사용할 수 있다는 뜻이다.

New/Young 영역 : 이곳의 인스턴스들은 추후 가비지 콜렉터에 의해 사라진다. 생명 주기가 짧은 “젊은 객체”를 GC 대상으로 하는 영역이다. 여기서 일어나는 가비지 콜렉트를 Minor GC 라고 한다.
ㄴ Eden : 객체들이 최초로 생성되는 공간
ㄴ ㄴ Survivor 0, 1 : Eden에서 참조되는 객체들이 저장되는 공간
💡 Eden 영역에 객체가 가득차게 되면 첫번째 가비지 콜렉트가 발생한다. Eden영역에 있는 값들을 Survivor 1 영역에 복사하고 이 영역을 제외한 나머지 객체를 삭제한다.

Old 영역 : 이곳의 인스턴스들은 추후 가비지 콜렉터에 의해 사라진다. 생명 주기가 긴 “오래된 객체”를 GC 대상으로 하는 영역이다. 여기서 일어나는 가비지 콜렉트를 Major GC 라고 한다. Minor GC에 비해 속도가 느리다. New/Young Area에서 일정시간 참조되고 있는, 살아남은 객체들이 저장되는 공간이다.

💡 GC
더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제함.


(3) Stacks
프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다. 메소드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성된다. 메서드 수행이 끝나면 프레임 별로 LIFO 방식으로 삭제한다. 메소드 안에서 사용되는 값들을 저장한다. 또 호출된 메소드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다.

(4) PC Registers
JVM은 스택 기반의 가상 머신으로, CPU에 직접 접근하지 않고 Stack에서 주소를 뽑아서 가져온다. Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로, 스레드마다 하나씩 존재한다. 가져온 주소는 PC Register에 저장된다. 현재 어떤 명령을 실행해야 할 지에 대한 기록을 담당한다.

(5) Native Method Stacks
자바 외 다른 언어의 호출을 위해 할당되는 영역. 자바에서 C/C++의 메소드를 호출할 때 사용하는 Stack 영역

3) Execution Engine
JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행

(1) 인터프리터 : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행. 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느리다는 단점

(2) JIT 컴파일러(Just-In-Time Compiler) :
JIT 컴파일(just-in-time compliation) 또는 동적 번역(dynamic translation) 이라고 하며 JIT 컴파일러는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일러. 인터프리터의 단점을 보완하기 위해 도입된 방식으로 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 해당 메서드를 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식. 기계어(컴파일된 코드)는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 빠르게 수행할 수 있음. 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠름. 다만, 한 번만 실행되는 코드라면 컴파일 하지 않고 인터프리팅하는 것이 유리하다고 할 수 있음.

참고자료
[Java] 자바 가상 머신(Java Virtual Machine)
[JAVA] JVM 동작원리 및 기본개념
CS Study 1주차: [Java] 컴파일 과정

profile
주니어의 굴레는 언제 벗어날 것인가

0개의 댓글