[Java] JVM

iamjinseo·2023년 1월 26일
6

스터디

목록 보기
5/8

1. JVM이란?

A Java virtual machine (JVM) is a virtual machine that enables a computer to run Java programs as well as programs written in other languages that are also compiled to Java bytecode.

자바 프로그램뿐만 아니라, 다른 언어로 쓰인 프로그램들도 자바 바이트코드로 변환하여 컴퓨터가 실행할 수 있게 하는 소프트웨어

컴파일러가 자바 코드를 컴파일하면 자바 바이트코드가 된다. 이 자바 바이트코드를 CPU가 이해하는 기계어로 번역해주는 것이 바로 JVM이다.
(자바 바이트코드란 자바 코드를 컴파일하면 나오는 .class파일이다.)

JVM의 이러한 역할은 Java와 OS사이에 중개를 담당하여 OS종속성에서 벗어나게 해준다.


2. JVM의 해석 과정

인터프리터와 JIT 컴파일러를 혼합하여 명령어 단위로 해석한다.

  • 인터프리터
    바이트코드를 한 줄씩 해석하고 실행 => 느릴 수 있음
  • JIT(Just In Time)
    인터프리터의 느린 속도를 보완하기 위한 대책.

    캐싱 -
    인터프리터 방식으로 실행하는 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 해당 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식

    • 캐싱 이후에는 바뀐 부분만 컴파일하고 다른 부분은 캐싱된 코드를 이용한다.

❗ JIT가 인터프리터의 느린 속도를 보완하는 대책이라고 하지만, 인터프리터는 규모가 크지 않은 프로그램을 실행할 때, 코드를 한 번만 실행할 때 적절하다.

❗ 따라서 JIT는 메소드 호출 빈도에 따라 컴파일 여부를 결정한다.


3. 특징 및 장단점

JVM은 자바 코드를 해석할 때 인터프리터와 컴파일러 방식을 혼용하여 적용한다는 특징이 있다.

3-1. 장점

  • 컴파일 언어와 비교
    C언어는 각 운영체제에 맞게 따로 컴파일해야 한다.
    하지만 자바는 C언어처럼 코드를 바로 기계어로 컴파일하지 않고 중간단계(바이트코드)에 머무르게 한다.
    => 그것을 JVM으로 해석함으로써 플랫폼 종속에서 벗어난다.

  • 인터프리터 언어와 비교
    인터프리터 언어는 한줄한줄 해석하기에 성능이 떨어질 수 있다.
    => 정적 컴파일러만큼 빠른 JIT와 혼용하며 인터프리터의 빠른 응답속도를 챙길 수 있음

3-2. 단점

각 플랫폼마다 JVM을 설치해야 한다.

그렇다면 JVM이 플랫폼에 종속적인 것 아닌가?
=> 오라클은 JVM을 손쉽게 설치할 수 있도록 지원하고 있다.


4. JVM구조

4-1. 클래스 로더(classLoader)

  • .class 파일들을 JVM으로 로딩한다.
  • 한 번에 모든 클래스를 로드하지 않고, 런타임에 클래스 파일을 찾아 메모리에 로딩한다.
  • 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리에 로드된다.

4-2. JVM Memory

JVM이 프로그램을 수행하기 위해 OS로부터 별도로 할당받은 메모리 공간

4-2-1. Method Area

  • 모든 스레드가 공유하는 메모리 영역.
  • 클래스, 인터페이스, 메소드, 필드, static변수 등의 바이트코드 보관

4-2-2. Heap

  • 런타임 시점에 동적 할당되어 사용하는 영역
  • 클래스의 인스턴스는 이곳에 저장됨

4-2-3. JVM Language Stacks

  • 메소드가 호출될 때 메소드와 메소드의 정보가 쌓이는 곳
  • 메소드의 매개변수, 지역변수, return 주소, 임시 변수 등의 정보 기록
  • 메소드 호출 종료시 스택에서 정보 제거
  • 타 스레드의 접근 불허

4-2-4. PC Registers

  • 각 스레드별로 하나씩 존재하며 현재 수행중인 JVM Instruction의 주소를 가짐
  • 스레드가 어떤 명령을 실행할지 기록하하는 부분

4-2-5. Native Method Stacks

  • 자바 외의 언어로 작성된 코드를 위함
  • Native Interface(뭐지)를 통해 호출되는 C/C++코드 수행

4-3. 실행 엔진(Execution Engine)

  • 로드된 클래스의 바이트코드를 실행하는 런타임 모듈
  • 여기서 인터프리터와 JIT사용

5. 자바 프로그램 실행과정

  1. JVM이 OS로부터 프로그램에 필요한 메모리 할당받음
  2. 자바 컴파일러가 소스코드를 읽어 바이트코드로 변환
  3. 클래스로더를 통해 클래스파일들을 JVM으로 로딩
  4. 실행엔진에 의해 해석
  5. 해석된 코드는 Runtime Data Area에 배치되어 수행됨

작성 후기

모르는 용어가 상당히 많음(특히 JVM구조)
스레드, 가비지컬렉션에 대해서 긴밀히 알아보는 시간을 가지는 것이 좋겠음

또한 Java가 내부적으로 어떻게 실행되는지 알 수 있었고 타 언어와 어떤 차이가 있는지 파악함.

참고

전체(플랫폼 종속, 정의, JIT 등) - https://coding-factory.tistory.com/827
JIT, JVM구조 - https://doozi0316.tistory.com/entry/1주차-JVM은-무엇이며-자바-코드는-어떻게-실행하는-것인가
JIT, 단점 - https://ko.wikipedia.org/wiki/JIT_컴파일
JVM구조 - https://ko.wikipedia.org/wiki/자바_가상_머신
JVM구조 - https://code-lab1.tistory.com/92
JVM구조, 자바 프로그램 실행과정 - https://jaehoney.tistory.com/173

profile
일단 뭐라도 해보는 중

5개의 댓글

comment-user-thumbnail
2023년 1월 27일

글 잘 읽었습니다!

java의 파일 구조가 왜 .java와 .class가 붙는지 알 수 있었네요.
다만 메모리 부분에서 3-2-1 ~ 3-2-3은 객체 지향의 T메모리 구조를 검색해보시면 설명이 더 잘 들어오는 것 같아요!

또, 글의 목차가 많은데 구분이 H 크기로만 이루어져서 가독성이 약간 떨어질 수 있는 것 같아요!
구분 선이나, 색 구분 등이 추가되면 더 이쁘게 정리 될 것 같습니다..!

좋은 글 감사합니다 ㅎㅎ🙂

답글 달기
comment-user-thumbnail
2023년 1월 29일

글 잘읽었어요!! JVM이 인터프리터와 컴파일 방식을 혼용하여 사용한다 했는데 경우에 따라 다르게 사용하는 건지 적절한 장점만을 섞어 작동하는 것인지 궁금하네요!!

답글 달기
comment-user-thumbnail
2023년 1월 29일

좋은 글 감사합니다.
실제 자바를 실행할 때 보이지 않는 부분이라 동작과정에 대해서 자세히 알지 못했는데, 구조 그림과 함께 하나하나 설명해주신 부분을 통해서 조금이나마 이해한 것 같습니다!

답글 달기
comment-user-thumbnail
2023년 1월 29일

좋은 글 감사합니다!
자바가 인터프리터를 사용하면서 컴파일 언어라는 건 알고 있었지만, 왜 그런지, 어떤 메커니즘으로 동작하는 지에 대해서는 잘 모르고 있었는데 이번 글을 보고 자세히 이해할 수 있습니다.

답글 달기
comment-user-thumbnail
2023년 1월 29일

깔금하게 정리된 좋은 글 올려주셔서 감사합니다.
.java와 .class 2개의 파일이 생성되는 것에 대해 생각해본 적이 없는데 이유를 알게되니 신기하네요!!!

답글 달기