Java 그리고 JVM

정훈·2023년 4월 30일
0

자바는 운영체제에 독립적인이유 그리고 자바로 작성된 프로그램은 운영체제의 종류에 관계없이 실행이 가능하다 이유 ?

  • Java Virtual Machine 때문이다. 그렇다면 어떠한 이유? 일까.

자바 컴파일 순서

  • 개발자가 자바 소스코드를 작성.
  • 자바 컴파일러 가 자바 소스파일을 컴파일한다. 이때 나오는 파일은 자바 바이트코드 파일로 아직

컴퓨터가 읽을 수 없는 즉 .자바 가상 머신이 이해할 수 있는 코드이다.

바이트 코드의 각 명령어는 1바이트 크기에 Opcode와 추가 피연산자로 이루어져있다.

  • 그 후 컴파일한 자바 바이트코드 를 읽어주는 것이 자바 인터프리터이다.
    • 자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상머신과 연결된다.
  • 이렇게 동적으로 클래스를 읽어오는것이,클래스로더
  • JIT 컴파일러 는 프로그램이 실행중인 런타임에 실제 기계어로 변환해주는 컴파일러를 의미.
    • 동적 번역이라고도 불리는 이기 법은 프로글맴의 실행 속도를 향상시키기 위해 개발이되었다.
  • 가비지 컬렉터 더는 사용하지 않는 메모리를 자동으로 회수한다.
    • 따라서 개발자가 따로 메모리를 관리를 하지ㅏ않아도 더욱 손쉽게 프로그램잉을 할수 있게 도와준다.
      • 그래서 이걸 보고 생각이든 부분은 JVM의 메모리 또는 구성요소 ,하는 역할이 궁금해짐 .

여기서 컴파일이란 ?

  • 컴퓨터는 무조건 0과 1로만 모든 명령을 이해하고 실행한다. 우리가 ‘A’라는 문자를 입력하더라도 컴퓨터는 이것을 0과 1로 이루어진 이진코드로 해석을한다.여기서 ‘A’라는 문자를 어떻게 해석해줄 것인가? 이러한 기능을 컴파일이라고한다.
  • 즉 사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 바꾸어주는 과정이다.
    • 원시코드에서 목적코드로 바꾸어주는 것이 컴파일이고, 목적파일을 실행 파일로 바꾸는 것이 링크.

여기서 바이트 코드란 ?

자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드

  • 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불린다.
    • 자바 바이트코드는 자바 가상 머신만 설치되어있으면 어떤 운영체제에서라도 실행될수있다.
      • 단, 자바 프로그램과는 달리 자바 가상 머신(JVM)은 운영체제에 종속적이므로, 각 운영체제에 맞는 자바 가상 머신을 설치해야 합니다.

자바의 특징

  • 운영체제에 독립적
  • 객체지향 언어
  • 비교적 배우기 쉬움
  • 자동 메모리 관리
  • 네트워크와 분산처리를 지원
  • 멀티쓰레드를 지원함
  • 동적 로딩을 지원함
    • 보통 자바로 작성된 애플리케이션은 여러개의 클래스로 구성되어 있다. 자바는 동적 로딩을 지원하기 때문에 실행 시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩하여 사용 할 수 있다는 장점이 있다.

JVM 구성요소 및 동작

  • 프로그램이 실행되면 OS로부터 메모리를 먼저할당. (필요로하는 메모리)
  • 자바컴파일러를 통해 작성한 .java → .class 로 변환 (바이트코드)
  • 변환된 파일을 class Loader 에서 바이트코드 JVM에 로딩
  • 로딩 된 바이트코드를 execution engine을 통해 기계어로 해석
  • 해석된 바이트코드를 runtime data Area 에 배치되어 실질적인 수행이이루어짐

Class Loader

  • 로딩 → 링킹 (래퍼런스연결)→ 초기화 세가지 기능을 동작.
  • 클래스로더는 자바 컴파일로를 통해 바이트코드로 변환된 부분을 초기화 시키는역할을함
    • Method Area에 적재, 로딩이 끝나면 Heap Area 에 적재
  • Linking 은 검증(verify)을 통해 바이트코드 파일이 유효한 지 체크와 클래스 변수(static)의 필요한 메모리, 메모리 래퍼런스를 Method영역에 있는 실제 래퍼런스로 교체함
  • Initailization, Static 변수의 값을 할당함.
  • 모든 바이트 코드(.class)를 한번에 메모리에 올리는게 아니라 필요할 때마다 동적으로 올려줌

클래스 로더의 계층구조, 3가지 클래스 로더 제공 .

  • Bootstrap Class loader
    • JAVA_HOME/lib 에 있는 핵심 자바 API를 제공함. 다른 모든 ClassLoader 인스턴스의 부모역할 .
      • Extension Class Loader
        • JAVA_HOME/lib/ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다. 부트스트랩 클래스 로더의 자식이고 모든 응용 프로그램에 사용할 수 있도록 표준 핵심 자바 클래스의 확장을 로딩
      • System Class Loader
        • Application class loader 로도 불린다. application level의 클래스들을 로드함 .

JVM의 메모리 관리

Method Area

  • field , method, type constant pool, static ,final,클래스 인터페이스 등 관리

스택

  • 메서드 호출 시마다 가각의 스택 프레임(메서드만을 위한공간) 이 생성된다. 그리고 메서드안에 서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수 , 리턴 값 몇 연산시 일어나는 값들을 임시로 저장하고.

마지막으로 메서드 수행이 끝나면 프레임별로 삭제 .

Heap Area

  • 모든 객체와 인스턴스 변수, 배열 등 저장
    • new 키워드로 생성된 객체와 배열이 생성되는 영역
  • statck Area는 지역 변수와 thread가 관리

PC register

  • 운영체제에서 관리되는 context switch가 발생할때 사용함

Native Method Stack

  • 자바가 아닌 다른 언어로 작성된 코드를 실행함 .

Reference

https://techvidvan.com/tutorials/java-virtual-machine/

0개의 댓글

관련 채용 정보