본문으로 바로가기

[자바]10. JVM 의 작동원리

category Language/자바 2021. 7. 26. 06:19
728x90
반응형
SMALL
자바 기초를 다시 정리해 가면서 문득 문법들만 공부했었지 자바의 작동원리에 대해서는 생각을 따로 안했던것 같다. 간단히 정리하여 작동 흐름에 대해 항상 파악은 하고있는 겸 자료를 정리한다.  

https://www.javacodemonk.com/

JVM


Java Virtual Machine 의 약자로서 자바 바이트 코드 를 해석하고 실행하는 목적이 있다.

특징으로 서는 OS 에 종속적이지 않으며, 메모리 관리 및 가비지 컬렉션을 해줌으로써 개발자의 부담을 줄여준다.

 

https://asfirstalways.tistory.com/158
https://d2.naver.com/helloworld/1230

JVM 실행과정

1. 프로그램 실행시 OS 는 JVM 에게 메모리 를 할당합니다.
2. JVM은 이 메모리를 용도에 따라서 여러개로 나눕니다.
3. 자바 코드로 작성된 파일(.java)은 javac에 의해서 자바 바이트코드(.class)로 변환됩니다.
4. Class Loader를 통해서 변환된 바이트코드(.class)들이 로딩됩니다.(JVM 메모리에 할당된다.)
5. Execution Engine(실행엔진)에 의해서 로딩된 것들이 JVM 내부에서 기계가 실행할 수 있는 형태로 해석(변환)된다.
6.해석된 바이트코드(.class)들은 Runtime Data Area 로 배치되어 실질적인 수행이 이루어진다.

 

JVM 구성


Class Loader

JVM 내로 클래스를 로드, 링크를 통해 배치하는 작업을 수행하는 모듈

RUNIME 시 동적으로 클래스를 로드한다. jar 파일 내 저장된 클래스들을 jvm위에 탑재하고 사용하지 않는 클래스들은 메모리에서 삭제한다. 

클래스를 처음 참조할때 해당 클래스를 loading하여 linking의 세 개의 과정 검증-분류-구축을 거쳐서 초기화가 된다.

Execution Engine

클래스를 실행시키는 역할이다. 클래스 로더가 JVM 내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이것은 실행엔진에 의해 실행된다. 자바 바이트코드는 기계가 바로 수행할 수 있는 언어보다는 비교적 인간이 보기 편한 형태로 기술된 것이다. 그래서 실행 엔진은 이와 같은 바이트코드 를 실제 JVM 내부에서 기계가 실행할 수 있는 형태로 변경한다. 이 때 2가지 방식을 사용한다.

1. Interpreter

 바이트코드 를 명령어 단위로 한줄씩 해석하기 때문에 느리다는 단점이 있다.

2. JIT(Just In Time)

 Interpreter 의 단점을 보완하여 등장한 JIT 컴파일러이다.

 한번 컴파일 된 코드는 캐시에 보관되기 때문에 빠르게 수행되나 아닌경우 Interpreter 방식보다 오래 걸리게   된다.

 이 때문에 내부적으로 해당 메서드가 얼마나 자주 수행되는지 확인하여 적절이 두 방법을 섞어 수행된다.

 Garbage colletor

  GC를 수행하는 쓰레드 가 있다.

 

 

Runtime Data Area

PC Register

쓰레드가 시작될 때 생성되며 현재 수행중인 JVM 명령의 주소 값을 갖는다.

JVM stack 영역

프로그램 과정에서 임시로 할당되었다가 메소드가 끝나면 바로 소멸되는 특성의 데이터를 저장

변수, 임시 데이터 같은 값들이 저장되며 

메소드 호출 시 그 메소드만을 위한 공간(스택 프레임)이 생성된다. 메소드가 종료되면 프레임 별로 삭제를 한다.

메소드 안에서 사용되는 값들을 저장한다. 메소드의 매개변수, 지역변수, 리턴값 및 연산값들이 임시로 저장된다.

Native method stack

 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다.

 JAVA가 아닌 다른 언어로 작성된 코드를 위한 공간이다.

 

Method Area(클래스 데이터를 위한 공간)

초기화되는 대상을 저장하기 위한 메모리 공간

컴파일 된 바이트코드의 대부분이 메소드 바이트코드이기 때문에 거의 모든 바이트코드가 올라간다.

Runtime constant Pool 이라는 별도의 관리 영역도 존재한다. 이는 상수 자료형을 저장하고 참조하여 중복을 막는 역할을 수행한다

 

-올라가는 정보의 종류

1_필드 정보

멤버변수 이름, 데이터 타입, 접근제어자

2_메소드 정보

메소드 이름, 리턴타입, 매개변수, 접근제어가

3_타입 정보

class 인지 interface인지 판별여부, 전체이름, super class의 전체이름(interface 이거나 object인 경우 제외)

 

Heap

객체를 저장하는 가상 메모리 공간이다.

new 연산자로 생성된 객체와 배열을 저장한다. 물론 class area에 올라온 클래스들만 객체로 생성할 수 있다.

Heap은 세부분으로 나뉘어진다.

Permanet Generation

생성된 객체들의 정보의 주소값이 저장된 공간

class loader에 의해 load 되는 클래스, 메소드 등에 관한 메타정보가 저장되는 영역

Reflection을 이용하여 동적으로 클래스가 로딩되는 경우 사용된다고 한다.

*Reflection: 구체적인 클래스 타입을 모를때 사용하는 방법(해당 클래스의 메소드와 타입 그리고 변수들에 접근할 수 있도록 해주는 자바 API 라고한다.)

 

New/Young 영역

Eden : 객체들이 최초로 생성되는 공간

survivor 0/1 : Eden에서 참조되는 객체들이 저장되는 공간

 

Old 영역

New 영역에서 일정시간 참조되고 있는, 살아남은 객체들이 저장되는 공간 Eden 공간 영역에 객체가 가득차게되면 첫번째 GC가 발생한다.

Eden 영역에 있는 값들을 survivor  1 영역에 복사하고 이 영역을 제외한 나머지 영역의 객체를 삭제한다.

 

 

 

참고 및 출처: https://asfirstalways.tistory.com/158

728x90
반응형
LIST