JVM과 Java Runtime Memory

혁콩·2022년 10월 25일
0
post-thumbnail

교수님과 면담 중

JVM과 Javac가 어떤건지 어떤식으로 구성되고 동작하는지에 대해 아냐고 여쭤보셨다. 물론 JVM은 무엇이고 어떤식으로 동작하는지 안다. "대충"말이다. JVM은 Java Virtual Machine이며 자바 컴파일러가 한번 더 변환한다는 정도다.

먼저 알고있던 내용을 정리해보았다.

  1. 자바 소스 파일은 자바 컴파일러(Javac)에 의해 바이트 코드로 변환된다.
  2. 이러한 바이트코드(.class)를 JVM이 읽어 실행한다.
  3. JVM을 통해 실행하기 때문에 어떤 운영체제든 Java파일을 실행할 수 있다.

막상 적어보니 아는게 정말 적다..!


이제 JVM에 대해 알아보자

1. JVM은 운영체제에 종속적이다.

리눅스에서 만든 파일을 윈도우에서 실행하고 싶다면, 윈도우용 JVM을 설치만 하면 된다!


2. JVM의 구조는 크게 4가지로 나눌 수 있다.

Garbage Collector, Execution Engine, Class Loader, Runtime Data Area로 나눌 수 있다.

2.1 Class Loader

  • .java 소스를 자바 컴파일러가 컴파일 하면 .class(바이트코드)가 생성된다.
  • 이렇게 생성된 클래스 파일들을 엮어서 Runtime Data Area로 적재하는 역할을 한다.

2.2 Execution Engine

  • Class Loader에 의해 적재된 클래스들을 기계어로 변경해 명령어 단위로 실행한다.

2.3 Garbage Collector

  • Heap 메모리 영역에 생성된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.
  • GC가 수행되는 동안 GC를 수행하는 쓰레드가 아닌 다른 모든 쓰레드가 일시정지된다.
  • GC가 언제 역할을 하는지 정확히 알 수 없다. (참조가 없어지자마자 해제되는 것을 보장하지 않음)

2.4 Runtime Data Area

  • JVM의 메모리 영역.
  • 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.
  • Method Area, Heap Area, Stack Area, PC Register, Native Method Stack으로 나뉜다.
  • 아래에서 자세히 설명하겠다!

3. Runtime Data Area의 구조

3.1 Method Area

  • 클래스 멤버 변수의 이름, 데이터 타입, 접근제어자 정보같은 필드 정보와 메소드 이름, 리턴 타입, 파라미터, 접근 제어자 정보같은 메소드 정보, 타입 정보(Interface / class), Constant Pool(문자 상수, 타입, 필드, 객체 참조 저장), static 변수, final class 변수 등이 생성되는 영역

3.2 Heap Area

  • new 키워드로 생성된 객체와 배열이 생성되는 영역.
  • 메소드 영역에 로드된 클래스만 생성 가능
  • Garbage Collector가 참조되지 않는 메모리를 제거하는 영역

3.3 Stack Area

  • 지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역.
    • int a = 10; 이라면 Stack에 이름이 a라고 붙여진 값이 10인 메모리 공간을 만든다.
    • Person p = new Person(); 이라면 Person p는 Stack에 생성, new로 생성된 인스턴스는 힙 영역에 생성된다.

3.4 PC Register

  • Thread가 생성될 때마다 생성되는 영역, Program Counter
  • 현재 Thread가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.

3.5 Native method stack

  • 자바 외 언어로 작성된 native code를 위한 메모리 영역

Thread가 생성되었을 때 기준으로

  • 메소드 영역, 힙 영역은 모든 Thread가 공유
  • Stack, PC Register, Native method stack은 각각의 Thread마다 생성, 공유되지 않는다.

이렇게 정리해보니

어느정도 알던 것도 있고 완전히 새로이 알게 된 내용들도 있다.

이번엔 JVM의 구조에 대해서 알아보았다.

다음번엔 Java의 특성과 장단점, 그리고 사용했을 시 기대할 수 있는 효과에 대해 알아보겠다.

위 내용 및 사진은 다음 블로그를 보고 정리하였습니다.

profile
아는 척 하기 좋아하는 콩

0개의 댓글