[JAVA] JVM

야부엉·2023년 10월 17일

프로그래밍 언어

  • "언어"란 "사람""사람" 간의 소통을 위해 사용된다.
  • 프로그래밍 언어도 비슷한 맥락으로 "사람""컴퓨터" 간의 소통을 위해 사용된다.

JAVA가 좋은 이유?

1. 공통 실행환경(JVM)

  • 여러 기기의 운영체제에서 JVM을 통한 동일한 환경을 제공

2. 세상과 닮아 있는 개발언어

  • 자바는 객체 지향 언어로 이해하기 쉽고 유지 보수가 쉽다.
    - "객체" 👉 "특징"과 "행동"을 가진 세상의 모든 것
  • 즉, JAVA는 객체 지향 언어로서 세상의 모든것을 표현이 가능 (세상과 닮아있다)

3. JAVA는 안정성이 높아서 프로그래밍 오류를 방지하고 보안상 안전

  • JAVA 언어로 작성된 코드들은 변환기(Compiler)를 통해 바이트 코드로 변환 하는데 이 과정에서 먼저 오류를 체크!

4. 대규모 앱 개발이 가능하다

  • 네트워크 및 데이터베이와 관련된 작업을 처리하는 API를 제공

5. 다양한 개발 도구와 라이브러리 사용 가능

  • 많은 사람이 이미 자바를 이용해 개발에 종사하고 있음으로, 관련 자료도 많다.

JVM(Java Virtual Machine)

1. 정의

  • "Java Virtual Machine"의 약자로 "자바 가상 머신"이라는 뜻을 가지고 있다.
  • 가상 머신은 가상의 기기를 만들어 주는 것이다
  • 다시 말해서, 어느 기기 위에 JAVA 프로그램을 실행 시킬 수 있는 가상의 기기를 생성해주는 것을 의미한다.

2. 구성 요소

  • 바이트 코드
    - 작성한 코드를 자바 컴파일러가 운영체제가 읽을 수 있는 코드로 변환한 코드

    JAVA 컴파일러란?
    - 작성한 Java 코드들(.java 파일)을 운영체제가 읽을 수 있는 바이트 코드💬(.class 파일)로 변환하는 변환기

  • 인터프리터
    - Java .class 코드 해석기
    - 바이트 코드를 기계가 실행할 수 있는 기계어로 번역

  • JIT 컴파일러
    - 빠른 Java .class 코드 해석기
    - 인터프리터의 효율을 높여주는 서포터

    예전 자바의 문제점
    1. 자바파일(.java)을 바이트 코드(.class) 파일로 컴파일 한다. 즉, 자바 컴파일러는 자바 소스 코드를 JVM을 위한 기계어로 변환
    2. JVM의 실행 엔진 내에 있는 인터 프리터로 특정 환경의 기계어로 변환
    -> 자바는 인터프리터 방식과 정적 컴파일 방식을 두 개 다 사용하기 때문에 다른 언어에 비해 느릴 수 밖에 없다. 이 문제를 개선하기 위해 "JIT 컴파일러"를 추가했다.

    JIT Compiler란?
    JIT 컴파일러는 실행 시점에서 인터프리터와 같이 기계어 코드를 생성하면서 해당 코드가 컴파일 대상이 되면 컴파일하고 그 코드를 캐싱(저장과 비슷하다고 생각)한다. JIT 컴파일은 실시간으로 일어나며(Just-In-Time), 전체 코드의 일부분만 변환한다.
    즉, 변환된 일부분은 캐시에 저장되기 때문에 재사용시 컴파일을 다시 할 필요가 없어진다.

    위 와 같이 반복되는 코드들을 컴파일하여 캐싱해둠으로써 인터프리터는 반복되는 코드를 읽지 않고 컴파일된 코드를 바로 사용 가능

  • 메모리 영역
    - Java 데이터를 저장하는 영역
    - 운영체제로부터 JVM이 할당받은 메모리 영역

  • 클래스 로더
    - Java 바이트 코드(.class)를 메모리 영역에 담는 운반기
    - 바이트 코드를 불러와서 메모리 영역에 저장

  • 가비지 컬렉터
    - Java의 쓰레기 청소기
    - 메모리 영역에 있는 안쓰는 데이터를 주기적으로 청소

3. 프로그램이 동작하는 흐름

  • Java 소스 파일을 컴파일러를 통해 바이트 코드로 전환 후, 클래스 로더가 JVM 영역으로 전달
  • JVM 내에서 기계어 번역 이후 해당 운영 체제에 전달 된다.

참고

profile
밤낮없는개발자

0개의 댓글