본문 바로가기

카테고리 없음

JVM 내부구조

JVM 구조

1. 자바 소스 코드는 .java의 형태로 저장이 된다 

 

2. 이것을 자바 컴파일러가 byte 코드로 컴파일 해주는데 이것은 .class 파일로 저장된다. 바이트 코드로 변경하는 이유는 소스 코드를 바로 실행하지 않고 바이트 코드를 거치므로 안전성 검사도 되고 JIT컴파일러를 통해 효율적인 실행이 가능하다.

 

3. 클래스 로더가 바이트 코드타입의 클래스 파일들은 클래스 로더를 통해 런타임 데이터 영역으로 로딩된다.

 

4. 런타임 영역(JVM의 메모리 영역)은 5개로 나뉘는데 

 

   (1) Method Area : JVM이 시작될때 생성되는 공간으로 바이트 코드를 처음 메모리 공간에 올릴때 초기화 하는 대상을 저장하기 위한                                      공간이다. 클래스 정보, 변수 정보, static으로 선언한 변수가 저장되고 모든 스레드가 공유하는 영역이다.

 

   (2) Heap : 동적으로 생성된 객체(new로 생성되는 클래스와 인스턴스 변수, 배열 타입 등 참조형 자료)가 저장되는 영역으로 GC의 대                         상이 되는 공간이다. 효율적인 가비지 컬렉션을 수행하기 위해 5개의 영역으로 나뉜다.

         - Eden : new를 통해 새로 생성된 객체가 위치하고 살아남은 객체는 survivor1/0으로 이동한다. (Young Generation : 생명 주기                          가 짧은 객체를 GC대상으로 하는 영역)

         - Survivor 0 / Surviovor 1 : 각 영역이 채워지면 살아남은 객체는 비워진 survivor로 이동한다.(Young Generation : 생명 주기

                                                      가 짧은 객체를 GC대상으로 하는 영역)

         - Old Generation : 생명 주기가 긴 객체를 CG대상으로 하는 영역 Young Generation 에서 마지막까지 살아남은 객체가 이동

 

    ⭐️ G1 GC ⭐️ : 기존의 CMS GC를 대체한 버전, 지역이라는 개념을 사용하며 eden,old,survivor를 역할을 고정이 아닌 동적으로 부여.

                            이전 GC처럼 일일히 메모리를 탐색하지 않고 메모리가 많이 차있는 영역을 인식하는 기능을 통해 메모리가 많이 차있는 

                            영역을 우선적으로 GC한다. 즉 전체를 탐색하는것이 아니고 영역을 나눠 영역별로 탐색한다.

                            또한 순차적으로 eden-sur-old 가 아니라 s1에 있는 객체가 eden에 있는것이 효율적이라 생각한다면 재할당한다.

 

    (3) Stack : 기본자료형을 생성할때 저장되는 공간으로 지역변수,매개변수나 임시적으로 사용되는 변수들을 저장하는 영역이다.

                       person p = new person에서 p는 stack person은 heap에 저장된다. 메소드 호출시 생성되고 종료시 소멸된다.

 

    (4) PC 레지스터 : 스레드가 시작될때 생성되며 현재 수행중인 JVM의 명령어 주소를 저장하는 공간이다. 스레드가 어떤 부분을 명령어                                  로 수행할지 저장하는 공간

 

    (5) Native Method Stack : JAVA가 아닌 다른언어로 작성된 코드를 위한 공간이다. 즉 JNI를 통해 호출하는 C/C++등의 코드를 수행

                                                 하기 위한 공간. 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역.

 

5. 런타임 영역에 로딩된 바이트 코드들은 Execution Engine을 통해 해석된다. 

 

    (1) 실행 엔진(Execution Engine) : 클래스 로더를 통해 런타임 영역에 배치된 바이트 코드를 명령어 단위로 읽어서 실행한다.

                                                           인터프리터와 JIT컴파일러 두가지 방식을 혼합해 바이트 코드를 실행한다.

     - 인터프리터 : 명령어를 하나씩 하나씩 읽어서 해석하고 바로 실행한다. 기본적으로 인터프리터 방식으로 실행하지만 속도가 느림

     - JIT 컴파일러 : 인터프리터의 단점을 보완하기 위해 바이트 코드를 전체를 컴파일 하여 Native Code로 변경하고 메소드를 더이상 인                                터프리터 하지 않고 놔두다가 네이티브 코드로 직접 실행하는 방법. 하나씩 하는게 아니라 전체적으로 하기 때문에 속도

                              가 빠르지만 비용적인 문제로 인터프리터 방식을 사용하다가 일정 기준이 넘어가면 JIT 사용

 

6. JNI(Java Native Interface) : 자바가 다른 언어로 만들어진 애플리케이션과 상호작용 할 수 있는 인터페이스를 제공하는 프로그램

 

7. Native Method Library : C, C++로 작성된 Library