[Java] JVM(Java Virtual Machine)

sung eon·2022년 9월 19일
0

스터디

목록 보기
12/13

JVM

JVM 이란?

Java Virtual Machine 의 줄임말로, 직역하면 ‘자바를 실행하기 위한 가상 기계/컴퓨터’라고 할 수 있습니다.
개발자들이 말하는 JVM은 보통 어던 기기상에서 실행되고 있는 프로세스, 특히 자바 앱에 대한 리소스를 대표하고 통제하는 서버를 지칭합니다.

JVM이 필요한 이유?

Java는 OS에 종속적이지 않다는 특징을 가지고 있습니다. 따라서 OS에 족속받지 않고 실행되려면 OS위에서 Java를 실행시킬 무언가가 필요한데, 그 역할을 하는게 JVM 입니다.

쉽게 말해서, OS에 종속받지 않고 CPU가 Java를 인식하고 실행할 수 있게 하는 가상 컴퓨터 입니다.

JVM의 동작 원리

자바 애플리케이션을 클래스 로더를 통해 읽어들이고, 자바 API와 함께 실행되는 역할을 합니다. JAVA와 OS사이에서 중개자 역할을 수행하여 OS에 종속(구애)받지 않고 재사용을 가능하게 해줍니다.

이해를 돕기 위한 내용
Java 소스코드(.java)는 CPU가 인식을 못해서 기계어로 컴파일을 해줘야합니다. 하지만 Java는 JVM(가상머신)을 거쳐서 OS에 도달하기 때문에 OS가 인식할 수 있는 기계어로 컴파일되는게 아니라, JVM이 인식할 수 있는 Java bytecode(.class)로 변환합니다.



Java compiler가 .java 파일을 .class라는 Java bytecode로 변환합니다. 변환된 bytecode는 기계어가 아니라서 OS에서는 바로 실행되지 않습니다. 이 때 JVM이 OS가 bytecode를 이해할 수 있도록 해석해줍니다.
따라서 Bytecode는 JVM위에서 OS 상관없이 실행될 수 있습니다. 죽! Java 파일 하나만 만들면 어느 디바이스든 JVM 위에서 실행할 수 있습니다.

  1. 여기서 Java compiler는 JDK를 설치하면 bin 에 존재하는 javac.exe를 말합니다.
    즉, JDK에 Java compiler가 포함되어 있다는 말입니다. Javac 명령어를 통해 .java를 .class 로 컴파일 할 수 있습니다.
  2. bytecode : 가상 컴퓨터(VM)에서 돌아가는 실행 프로그램을 위한 이진 표현법입니다.
    Java bytecode는 JVM이 이해할 수 있는 언어로 변환된 자바 소스코드를 의미합니다.

JVM에서의 메모리 관리

JVM 실행에 있어서 가장 일반적인 상호작용은, 힙과 스택의 메모리 사용을 확인하는 것입니다.

JVM 실행 과정

  1. 프로그램이 실행되면, JVM은 OS로부터 이 프로그램이 필요로하는 메모리를 할당받습니다. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리합니다.

  2. 자바 컴파일러(JAVAC)가 자바 소스코드를 읽고, 자바 바이트코드(.class)로 변환시킵니다.
  3. 변경된 class 파일들을 클래스 로더를 통해 JVM 메모리 영역으로 로딩합니다.
  4. 로딩된 class 파일들은 Execution engine을 통해 해석됩니다.
  5. 해석된 바이트 코드는 메모리 영역에 배치되어 실직적인 수행이 이루어집니다. 이러한 실행 과정 속 jvm은 필요에 따라 스레드를 동기화나 가비지 컬렉션 같은 메모리 관리 작업을 수행합니다.

이해를 위한 용어 정리

  • 자바 컴파일러 : 자바 소스코드(.java)를 바이트 코드(.class)로 변환 시켜준다
  • 클래스 로더 : JVM은 런타임시에 처음으로 클래스를 참조할 때 해당 클래스를 로드하고 메모리 영역에 배치시킨다. 이 동적 로드를 담당하는 부분이 바로 클래스 로더다
  • Runtime Data Areas : JVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역이다. 총 5가지 영역으로 나누어진다.
    • PC 레지스터 : 스레드가 어떤 명령어로 실행되어야 할 지 기록하는 부분입니다.
    • 스택 area : 지역변수, 매개변수, 메서드 정보, 임시 데이터 등을 저장합니다.
    • 네이티브 메서드 스택 : 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역입니다.
    • 힙 : 런타임에 동적으로 할당되는 데이터가 저장되는 영역입니다. 객체나 배열 생성이 여기에 해당합니다.

      (힙에 할당된 데이터들은 가비지컬렉터의 대상이 됩니다. JVM 설능 이슈에서 가장 많이 언급되는 공간입니다.)
    • 메서드 영영 : JVM이, 시작될 때 생성되고, JVM이 읽은 각각의 클래스와 인터페이스에 대한 런타임 상수 풀, 필드 및 메서드 코드, 정적 변수, 메서드의 바이트 코드 등을 보관합니다.

가비지 컬렉션 (Garbage Collection)

보통 줄여서 GC라고 부릅니다., 자바 이전에는 프로그래머가 모든 프로그램 메모리를 관리했지만 자바에서는 JVM이 이 프로그램 메모리를 관리합니다. 이 때 JVM은 GC라는 프로세스를 통해 메모리를 관리합니다. 가비지 컬렉션은 자바 프로그램에서 사용되지 않는 메모리를 지속적으로 찾아내서 제거하는 역할을 합니다.

실행순서

  1. 참조되지 않은 객체들을 탐색 후 삭제
  2. 삭제된 객체의 메모리 반환
  3. 힙 메모리 재사용
profile
코베베

0개의 댓글