Java, JVM

murphytklee·2023년 4월 10일
0
post-thumbnail

1. 자바 가상 머신(Java Virtual Machine, JVM)

  • 시스템 메모리를 관리하면서 자바 기반 애플리케이션을 위해 이식가능한 실행 환경을 제공한다.
  • JVM은 다른 프로그램을 실행시키는 것이 목적인 프로그램
    • 방어적 코딩의 훌륭한 예

1.1 JVM의 기본 기능

  • OS에 종속받지 않고 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터.
  • 자바 프로그램이 어떤 기기, 운영체제에서도 실행될 수 있게 하는 것 “한 번 작성해, 어디서나 실행한다”
  • 프로그램 메모리를 관리하고 최적화 하는 것

1.2 JVM에서의 메모리 관리

  • JVM 실행에 있어 가장 일반적인 상호작용은 힙(Heap)과 스택(Stack)의 메모리사용을 확인하는 것이다.
  • 가장 흔한 교정작업은 JVM의 메모리 설정 값들을 조율하는 것

1.3 가비지 컬렉션(Garbage Collection)

  • 가비지 컬렉션은 자바 프로그램에서 사용되지 않는 메모리를 지속적으로 찾아내서 제거한다.
  • 가비지 컬렉션은 실행 중인 JVM 내부에서 일어난다.



2. JVM의 3가지 측면

2.1 JVM 사양, Specification

  • JVM은 소프트웨어 사양이다.
  • JVM 사양은 구현에 있어 최대한 창조성을 허용하기 위해 JVM 구현 세부사항이 사양안에 정의되어 있지 않다.
  • “자바 가상 머신을 올바르게 구현하려면, 클래스(Class) 파일 포맷을 읽고 그 안에 지정된 작업을 제대로 수행하기만 하면 된다.”
  • JVM이 해야만 하는 일은 자바 프로그램을 정확하게 실행하는것 뿐

2.2 JVM 구현, Implementation

  • 오라클의 라이선스가 부여된 JDK를 포함해 거의 모든 Open JDK와 핫스팟 JVM의 Fork로 생성된 것
  • 일반적으로 JRE(Java Runtime Environment) 번들의 한 부분으로 JVM을 다운로드해 설치한다.

2.3 JVM 인스턴스, Instance

  • JVM 스펙이 구현되어 소프트웨어 제품으로 릴리즈 되면, 개발자는 그것을 하나의 프로그램처럼 다운로드해 실행할 수 있다.
    • 이렇게 다운로드 된 프로그램이 하나의 JVM 인스턴스이다.
  • 개발자들이 JVM에 대해 말하는 경우 대부분은 소프트웨어 개발 환경 또는 제품화 환경에서 실행되는 하나의 JVM 인스턴스를 지칭한다.



3. JVM 구성요소

3.1 클래스 로더

  • JVM내로 클래스파일(.class)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
  • 클래스를 처음 참조할 때, 해당 클래스를 로드하고 링크하는 역할

3.2 실행 엔진

  • 클래스 로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치시키고 실행 엔진에 의해 실행된다.
  • 인터프리터
    • 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
  • JIT
  • 가비지 컬렉터
    • 더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제한다.

3.3 런타임 데이터 영역

3.4 PC Register

  • Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로, Thread마다 하나씩 존재
  • Thread가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖는다.
    - Thread : 프로세스 내에서 실제로 작업을 수행하는 주체를 의미
    - 프로세스 내부에 있는 CPU 수행 단위
    - 프로세스는 운영체제로부터 자원을 할당받는 작업의 단위, 쓰레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이고 프로세스 내에 여러개 생길 수 있다.



4. 메모리 구조

4.1 코드(Code) 영역

  • 메모리의 코드영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부른다.
  • CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다.

4.2 데이터(Data)영역

  • 메모리의 데이터영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다.
  • 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.

4.3 스택(Stack) 영역

  • 함수의 호출과 관계되는 지역변수나 매개변수, 임시 데이터, 스레드나 메소드의 정보를 저장한다.
  • 스택 영역은 함수의 호출과 함께 할당되며 함수 호출이 완료되면 소멸한다.
  • 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.
  • 스택 영역은 푸시(push)동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다.(LIFO)
  • 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
  • Static 영역에 저장되는 데이터
    • Field Information - 멤버변수의 이름, 데이터 타입, 접근 제어자에 대한 정보
    • Method Information - 메소드의 이름, 리턴타입, 매개변수, 접근 제어자에 대한 정보
    • Type Information - class인지 interface인지의 여부 저장, Type 속성, super클래스의 전체이름
      • interface이거나 object인 경우 제외 → Heap

4.4 힙(Heap) 영역

  • 메모리의 힙 영역은 사용자가 직접 관리할 수 있고 해야만 하는 메모리 영역.
  • 힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
  • 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
  • new 연산자로 생성되는 객체와 배열을 저장
  • Class Area(Static Area)에 올라온 클래스들만 객체로 생성할 수 있다.
  • New / Young 영역
    • 이곳의 인스턴스들은 추후 가비지 컬렉터에 의해 사라짐 (Minor GC)
    • Eden : 객체들이 최초로 생성되는 공간
    • Survivor 0, 1: Eden에서 참조되는 객체들이 저장되는 공간
  • Old 영역
    • 이곳의 인스턴스들은 추후 가비지 컬렉터에 의해 사라짐 (Major GC), Minor에 비해 속도가 느림



5. JDK JRE

5.1 JDK

  • Java Development Kit
  • java를 사용하기 위해 필요한 모든 기능을 갖춘 Java용 SDK(Software Development Kit)
  • JDK는 JRE 및 컴파일러(javac), jdb, javadoc과 같은 도구가 있다.
  • JDK는 프로그램을 생성, 실행, 컴파일할 수 있다.

5.2 JRE

  • java Runtime Environment
  • JVM + Java Class Library 등으로 구성되어 있다.
  • 컴파일된 Java 프로그램을 실행하는데 필요한 패키지이다.



Reference

0개의 댓글