[자바 스터디] 자바의 정석 1단원 && 백기선 자바 스터디 1차

Jifrozen·2022년 5월 20일
0

자바 스터디

목록 보기
1/14

목표

자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.

학습할 것

  • JVM이란 무엇인가
  • 컴파일 하는 방법
  • 실행하는 방법
  • 바이트코드란 무엇인가
  • JIT 컴파일러란 무엇이며 어떻게 동작하는지
  • JVM 구성 요소
  • JDK와 JRE의 차이

1-1 JVM이란 무엇인가?


JVM(Java Virtual Machine) : ‘자바를 실행하기 위한 가상 컴퓨터’ 을 뜻하는 말로 바이트코드를 실행하는 주체

  • Java로 작성된 application은 모두 JVM에서만 실행된다.
  • OS와 바로 맞붙어 OS에 종속적으로 실행되는 다른 application과 다르게 JAVA의 경우 JVM을 사용해 운영체제의 독립적으로 실행이 가능하다. → 'Write Once, Run Anywhere'
  • but, JVM은 OS에 종속적이다 → 윈도우, 리눅스..등 에 맞는 JVM존재
  • 다른 application의 코드와 달리 JVM을 추가로 거치기 때문에 실행 시 해석(interpret) 된다 → 속도 느림

1-2 컴파일 하는 방법


컴파일을 한다는 것은 .java 파일을 .class 파일(바이트코드)을 만든다는 것을 의미 한다.

  • javac.exe : 자바 컴파일러, JDK (Java Development Kit) 자바 개발 도구를 설치하면 bin 폴더 안에 javac 라는 java compiler 가 포함되어 있다. → 이 명령을 사용해서 .class 파일을 만든다.

1-3 실행하는 방법


컴파일하여 얻어낸 클래스파일(.class)을 인터프리터로 실행한다.

  • java.exe : 자바 인터프리터, 컴파일러가 생성한 바이트코드를 해석하고 실행한다.

1-4 바이트코드란 무엇인가?


바이트코드 : 컴파일된 자바코드

  • 프로그래밍 언어 → 사람이 이해하는 언어이기 때문에 컴퓨터가 이해할 수 있는 언어로 만들어줘야 됨
  • 이러한 역할을 JVM이 담당함 → JVM이 이해할 수 있는 형태가 바이트코드
  • javac 명령을 통해 컴파일 → .class 확장자 갖는 바이트 코드 만들어지고 JVM이 실행

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


JIT 컴파일러(Just-in-time compilation) : 바이트코드를 하드웨어의 기계어로 번역

  • 인터프리터 방식 - 바이트 코드 한줄씩 번역 → 중복 번역 = 비효율
  • 이를 방지해서 보다 좋은 성능을 낼 수 있게 하기 위해 JIT 컴파일러는 번역한 내용을 캐싱해 두었다가 동일한 메소드를 실행할 경우 다시 번역하지 않고 캐싱된 내용을 실행
  • JIT 컴파일러를 통해 Java의 대표적인 단점인 속도문제가 상당히 개선되었다.

1-6 JVM 구성 요소


JVM은 크게 네가지 구성 요소를 가진다.

  1. Class Loader

  2. GC (Garbage Collector)

  3. Execution Engine

  4. Runtime Data Area

1. Class Loader

  • JRE의 일부로, 바이트코드를 실행할 때 class 객체를 메모리에 생성하는 요소이다.
  • 클래스의 인스턴스를 생성하면 Class Loader를 통해 메모리에 로드한다.

2. GC (Garbage Collector)

  • 자바는 메모리 관리를 사용자가 아닌 JVM이 알아서 해준다.
  • GC는 더이상 참조되지 않는 메모리를 정리해준다.
  • GC가 언제 호출되는지는 알 수 없으며, 심지어 사용자가 호출하더라도 메모리 정리할 필요가 없다고 판단하면 실행하지 않는다.

3. Execution Engine

  • 메모리에 로드 된 바이트코드를 실행하는 역할을 한다.
  • Class Loader를 통해 Runtime Data Area에 배치된 바이트코드는 Execution Engine에 의해 실행 된다.
  • 인터프리터 방식이나 JIT 방식으로 실행한다.

4. Runtime Data Area

  • JVM이 프로그램 실행을 위해 OS로부터 할당받은 메모리 영역 a. 클래스 영역 -> 실행에 필요한 클래스들을 로드하여 저장한다. 내부에서 메소드 영역과 상수 영역으로 또 나뉘어 저장 된다. b. 가비지 컬렉션 힙 영역 -> GC에 의해 관리되는 영역이다. 동적 메모리 할당 영역 이라고도 하며, 소스상에서 new 연산자로 객체를 만들 때 할당되는 영역이다. c. 런타임 스택 영역 -> 프로그램 실행 중 발생하는 메소드 호출과 복귀에 대한 정보를 저장한다. d. 네이티브 메소드 스택 영역 -> 자바에는 하드웨어를 직접 제어하는 기능이 없기 때문에, 필요할 경우 C언어와 같은 다른 언어의 기능을 빌려 사용한다. 이때 사용하는 기술이 JNI (Java Native Interface) 기술로 네이티브 메소드들이 바이트 코드로 변환 되면서 사용되고 기록하는 영역이다.

1-7. JDK와 JRE의 차이


JDK(Java Development Kit) : 자바개발도구

  • JDK = JRE + 개발에 필요한 실행파일(javac.exe 등)
  • Java로 프로그램 개발을 하기 위한 모든 파일을 포함한 kit를 의미한다.

JRE(Java Runtime Environment) : 자바로 작성된 응용프로그램이 실행되기 위한 최소환경

  • JRE = JVM + 클래스라이브러리(Java API)

0개의 댓글