infitry 2022. 8. 13. 11:16
반응형

JVM에 대해 다시 공부하다, 정리가 한 번 필요할 것 같아서 정리 해봅니다.

 

그림 1. JVM 구조

개발자들이 작성한 .java 코드가 어떻게 실행 되는지 한 눈에 알아 볼 수 있는 그림입니다.

Java개발자라면 이클립스, 인텔리제이, vscode 등 IDE를 이용하여 개발할 때 JDK가 필요해 각자 본인 PC에 Java를 설치할 것 입니다.

JDK를 설치하면 javac 명령어를 사용할 수 있습니다.

javac 명령어로 .java 파일을 컴파일하게되면 바이트 코드인 .class 파일이 생성되고 JVM이 샐행할 메모리를 OS로 부터 할당 받습니다. 그 후 JVM의 Class Loader에 의해 클래스 파일을 읽어 옵니다.

JVM 위에서 실행 되기때문에 Java를 OS에 상관없이 실행시킬 수 있습니다.

그럼 JVM은 어디에 있을까요? JDK 혹은 JRE를 설치하면 자동으로 설치됩니다.

JVM 구성요소

JVM은 Java 프로그램을 실행시키는 역할을 합니다.

앞서 말했던 것과 같이 javac에 의해 컴파일 된 바이트 코드인 .class 파일을 읽어들여 실행합니다.

각 구성요소에 대해 알아보겠습니다.

  • Class Loader : JVM 내(Runtime Data Area)로 Class 파일을 로드하고 링크
  • Execution Engine : 메모리(Runtime Data Area)에 적재된 클래스들을 기계어로 변경해 실행
  • Garbage Collector : 힙 메모리에서 참조되지 않는 개체들 제거
  • Runtime Data Area : 자바 프로그램을 실행할 때, 데이터를 저장

구성요소만 봤을때는 도대체 어떤 기능을 하는지 알기 어렵습니다.

그냥 단순하게 설명하면 .class 파일을 JVM의 Class Loader에 의해 읽어들여 Excution Engine에 의해 실행한다.

하지만 실행되면서 필요한 메모리 부분은 Runtime Data Area에 저장한다.

그로 인해 생긴 더 이상 참조되지 않는 메모리(Runtime Data Area의 Heap영역)는 Garbage Collector가 정리한다.

입니다. 일단은 이 정도로 이해한 후 Runtime Data Area에 대한 이해가 필요합니다.

 

Runtime Data Area의 구성요소

Runtime Data Area는 JVM이 프로그램을 실행하기 위해 OS로 부터 메모리를 할당받은 영역입니다.

 

그림 2. Runtime Data Area

다음과 같은 구조를 가집니다. 

크게는 각각의 Thread가 개별 생성,관리하는 pc register, stack, native method stack 영역과 

전체 Thread가 공유하는 HEAP, method area 영역으로 나뉘어 입니다.

각 영역에 대해 알아보면,

heap 

  • 런타임 시 동적으로 할당하여 사용하는 영역
  • new 연산자로 생성된 객체와 배열 저장
  • 참조가 없는 객체는 GC(가비지 컬렉터)의 대상

method area

  • 클래스가 사용 되면 해당 클래스의 파일(.class)을 읽어들여, 클래스에 대한 정보(바이트 코드)를 메서드 영역에 저장
  • 클래스와 인터페이스, 메서드, 필드, static 변수, final 변수 등이 저장되는 영역입니다.

pc register

  • 쓰레드가 현재 실행할 스택 프레임의 주소를 저장

stack

  • 스레드 마다 존재하여 스레드 가 시작할 때마다 할당
  • 지역변수, 매개변수, 연산 중 발생하는 임시 데이터 저장
  • 메서드 호출 시마다 개별적 스택 생성

native method stack

  • C/C++ 등의 Low level 코드를 실행하는 스택

다른 설명들을 많이 확인했거나 이미 어느정도 공부가 된 상태가 아니라면 위의 설명만 보면 어떻게 되는지 하나도 이해가 안됩니다.

저도 그래요. "이게 뭔 소리야?" 라는 생각이 드시면 그게 맞습니다.

위에서 말씀 드렸던 더 이상 참조되지 않는 메모리(Runtime Data Area의 Heap영역)는 Garbage Collector가 정리한다.

의 * Heap 영역이 나왔습니다. Java 개발자로 살아가려면 알아야 할 Runtime Data Area에서 제일 중요한 영역인 것 같습니다.

 

Heap영역에서는 개발자 분들이 짜신 소스의 New 연산자로 생성된 객체와 배열들이 저장 됩니다.

메모리를 할당 받은 객체들이 추후에 사용하게 되지 않으면 메모리 정리를 해주는게 GC(Garbage collector) 입니다.

GC의 내부 동작방식에 대해서는 설명을 잘 해주신 영상이 있어 공유 드립니다. (저도 이거 보고 이해했어요...😅😅😅)

 

조엘의 GC - 우아한 테크톡

 

 

후기 및 정리

정리 및 공부를 하면서 다시 한 번 느낀 건 개발자는 원리를 이해하는게 가장 중요한 것 같습니다.

원리를 확실하게 이해하고 있다면 이슈가 발생하였을 때 좀 더 빠르게 대처할 수 있는 것 같습니다.

 

다시 한 번 정리하자면 

1. 개발하려고 JDK를 설치한다. (JVM 포함)

2. 개발을 막 합니다. 실행시켜요.

  • javac에 의해 .class 바이트 코드로 컴파일 되고
  • JVM의 Class Loader에 의해 읽어들인 후 Runtime Data Area에 실행에 필요한 클래스파일, 변수, 동적 메모리 등을 할당 한 후
  • Execution Engine에 의해 실행된다.
  • 실행 시 Runtime Data Area의 Heap 영역에 동적으로 할당 된 메모리는 GC의 특정 알고리즘(Java 버전 별로 다르다고 알고 있음)에 의해 정리 된다.

 

정도로 실행 과정을 간략화 할 수 있을 것 같습니다.🙃🙃

반응형