[JAVA] JVM

황시준·2023년 7월 10일
0

개발

목록 보기
4/4
post-thumbnail
post-custom-banner

두루뭉실하게 알고 있던 개념을 조금 제데로 공부하기 위해 글을 작성한다.

1. JVM(Java Virtual Machine)

개인적으로 자바가 가지는 가장 큰 장점이라고 생각하는 점은
바로 모든 기기에 호환이 가능하다는 점이다.
이게 무슨 말이나면
자바로 개발된 언어는 맥, 윈도우, 리눅스 등 자바가 설치되어 있으면 모든 기기에서 동작한다는 말이다.
이게 가능한 원리는 바로 JVM때문이다.

JVM은 Java Virtual Machine의 약자로 스택 기반의 가상머신이다.

일반적인 자바 프로그램의 실행 과정은 다음과 같다.

  1. 프로그램이 실행되면 JVM은 OS로부터 프로그램이 필요한 메모리를 받는다.
  2. 자바 컴파일러(javac)가 자바 소스코드(java)를 읽어들여 자바 바이트코드(class)로 변환
  3. Class Loader를 통해 자바 바이트코드(class) 파일들을 jvm으로 로딩
  4. 로딩된 바이트코드(class)는 실행 엔진(Execution Engine)을 통해 해석
  5. 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실행됨.
    이때 JVM은 스레드 동기화 작업이나, GC와 같은 관리작업을 실행함.

2. JVM 구성

1. Class Loader

  • JVM내로 클래스 파일을 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈이다.
  • Runtime 시에 동적으로 클래스를 로드한다.
  • 클래스를 참조할 때 클래스를 로드하고 링크하는 역할을 수행

2. Execution Engine

  • 클래스를 실행시키는 역할
  • Class Loader가 자바 바이트 코드를 배치하면 이를 실행시키는 역할을 수행
  • 자바 바이트 코드(.class)를 JVM내부에서 기계가 실행할 수 있는 형태로 변경함.

2-1. Interpreter

  • Execution Engine은 자바 바이트 코드(.class)를 한줄 씩 읽어 실행한다.
    하지만 Interpreter 방식은 한 줄씩 읽어 실행시키기 때문에 조금 느리다는 단점이 있다.

2-2. JIT(Just-In-Time)

  • Interpreter 방식을 보완하기 위한 컴파일러.
  • 인터프리터 방식으로 컴파일하다 적적한 시점에 바이트 코드 전체를 컴파일 하여 네이티브 코드로 변경하고 이후에는 인터프리팅 하지 않음.
  • 네이티브 코드는 캐시에 저장되기 때문에 코드가 변환되면 빠르게 수행 가능

3. Runtime Data Area

다음은 Java가 가 실행되면 할당되는 영역이다.

3-1. method area(class area, static area)

  • 클래스 정보를 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간

3-2. heap area

  • 객체를 저장하는 가상 메모리 공간이다.
  • new 로 객체를 생성하면 여기 heap area에 저장된다.

3-2-1. Permanent Generation

  • 생성된 객체들의 주소값이 저장된 공간
  • 리플렉션을 사용하여 동적으로 클래스가 로딩되는 경우 사용

3-2.2. Old Generation

  • New Area에서 일정 시간 참조되고 있는 객제들이 저장되는 Eden이라는 공간에 객체가 가득 차게 되면 GC(Garbage Collection)이 발생해 메모리를 정리하는데 Eden영역에 있는 값을 Survivor 1에 복사하고 이 영역을 제외한 나머지 영역의 객체를 삭제한다.

3-3.3 Young Generation

  • Eden : 객체가 최초로 생성되는 공간
  • Survivor Space : Eden에서 참조한 객체가 저장되는 공간

4. Stack Area

  • 메소드 내에 사용되는 지역변수, 매개변수, 리턴 값 등 연산시 발생하는 값들을 저장하는 공간
  • 메소드를 빠져나가면 소멸되는 공간

5. PC Registers

  • Thread가 시작될 때 마다 생성되는 공간
  • 스레드마다 하나씩 존재
  • 현재 수행중인 JVM주소를 가짐

6. Native Method Stack

  • 자바 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 된 프로그램을 실행시키는 영역
  • JAVA가 아닌 다른 언어로 작성된 프로그램을 위한 공간
profile
하고싶은게 많은 newbie
post-custom-banner

0개의 댓글