자바스터디 - 1주차

megaseunghan·2021년 11월 16일
0

자바스터디

목록 보기
11/15
post-thumbnail

(정리 출처 : 이것이 자바다. 신용권의 Java 프로그래밍 정복)

  • JVM이란 무엇인가

: 설명에 앞서 운영체제는 자바 프로그램을 바로 실행할 수 없다. 자바는 완전한 기계어가 아닌 중간 단계의 바이트코드이기 때문이다. 따라서 이것을 해석하고 실행할 수 있는 가상의 운영체제가 필요하다.

이것이 자바가상기계 JVM(Java Virtual Machine)이다. JVM은 실제의 운영체제를 대신하여 자바 프로그램을 실행하는 가상의 운영체제 역할을 한다.

그럼 왜 JVM이 굳이 운영체제를 대신해야 할까?

: 답은 운영체제별로 프로그램을 실행하고 관리하는 방법이 다르기 때문이라는 이유에 있다. 운영체제별로 자바 프로그램을 별도로 개발하는 것보다는 운영체제와 자바 프로그램을 중계하는 JVM을 두고 어느 운영체제에서든 동일한 결과를 보장받는 자바 프로그램을 개발할 수 있게끔 하는 것이 JVM이 실제 운영체제를 대신하는 이유이다.

바이트코드는 모든 JVM에서 동일한 결과를 보장하지만, JVM은 OS에 종속(독립)적이다.

  • 컴파일 하는 방법
    1. 자바 프로그램은 .java인 파일을 작성하는 것부터 시작한다.
    2. 이것을 소스파일이라고 하는데, 이 파일을 컴파일러(javac.exe)로 컴파일 하면 확장자가 .class인 바이트 코드 파일이 생성된다.
    3. 바이트코드 파일은 JVM 구동 명령어(java.exe)에 의해 JVM의 클래스 로더에 전달되고 클래스 로더는 동적로딩을 통해 필요 클래스들을 Runtime Data Area(JVM의 메모리)에 올린다. (각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져있다)
    - 클래스 로더의 세부 동작은 어떨까(출처 : https://gyoogle.dev/blog/computer-language/Java/컴파일 과정.html)
    1. 로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드함.
    2. 검증 : 자바 언어 명세 && JVM 명세에 맞게 구성됐는지 검사함.
    3. 준비 : 클래스 필요 메모리 할당함.
    4. 분석 : 클래스의 상수 풀 내 모든 Symbolic Reference → Direct Reference로 변경함.
    5. 초기화 : 클래스 변수들을 적절한 값으로 초기화 함.
    - 실행하는 방법

.java 파일 생성 → 컴파일러(javac.exe)가 가상 기계어인 .class파일로 재생성(번역) → JVM이 로딩, 배치를 하여 실행함

  • 바이트코드란 무엇인가

: JVM이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다. 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트코드라고 불린다.

이러한 자바 바이트코드의 확장자는 .class이며 자바 바이트코드는 자바 가상 머신만 설치되어 있으면 어떤 운영체제에서라도 실행될 수 있다.

  • JIT 컴파일러란 무엇이며 어떻게 동작하는지

Just-In-Time Compiler : 인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트코드 전체를 컴파일 하여 네이티브 코드로 변경하고 그 이후에는 해당 메서드를 인터프리팅 하지 않고 네이티브 코드로 직접 실행하는 방식. 하나씩이 아닌 바이트코드 전체가 컴파일된 네이티브 코드를 실행하기 때문에 전체적 실행속도가 인터프리터보다 빠르다.

  • JVM 구성 요소

  • Class Loader : 클래스 로더는 총 3 단계로 실행된다
    1. 로딩 : 클래스로더가 바이트코드를 읽으면서 실행을 시작한다.
    2. 링크 : 클래스간 Reference를 연결한다.
    3. 초기화 : 클래스를 생성한다.(이 때, static 값들을 생성하고 JVM Area에 저장한다.)
    - Execution Engine

: .class 파일을 해석한다. ( Interpreter, JIT 방식 + GB)

  • Runtime Data Area: JVM이 프로세스로써 수행되기 위해 OS로부터 할당받는 메모리 영역이다. 저장 목적에 따라 다음과 같이 5개로 나눌 수 있다.
  • Method Area : 모든 Thread에게 공유되는. 클래스, 변수, 메서드, static 변수, 상수 등이 저장되는 영역
    - Heap Area : 모든 Thread에게 공유되는 new 명령어로 생성된 인스턴스와 객체가 저장되는 구역 (GC a.k.a Garbace Collection)
    - Stack Area : 각 Thread마다 하나씩 생성. Method안에서 사용되는 값들이 저장되는 구역. 호출시 LIFO로 하나씩 생성, 실행 완료되면 LIFO로 하나씩 지워짐
    - Pc Register : 각 Thread마다 하나씩 생성. CPU Register와 역할이 비슷하다. 현재 수행 중인 JVM의 주소 값 저장.
    - Native Method Stack : 각 Thread마다 하나씩 생성. 다른 언어의 메서드 호출을 위해 할당되는 구역. 언어에 맞게 Stack이 형성되는 구역이다 (JNI라는 표준 규약을 제공한다.)
    - JDK와 JRE의 차이
    - JRE(Java Runtime Environment) : JVM, 라이브러리 API, 자바 명령 및 기타 인프라 있음

: JVM의 실행환경을 구현한다고 볼 수 있음.

  • JDK(Java Development Kit) : 프로그램 개발에 필요한 모든 기능을 갖춤. JVM, 라이브러리 API, 컴파일러 등의 개발도구가 포함됨.

: 즉 JDK는 프로그램을 생성하고 컴파일 할 수 있다.

0개의 댓글