더 자바 강의 정리(1-2강)
java21 May 2020
Java
JVM(Java Virtual Machine)
- 자바 가상 머신으로 자바 바이트 코드(.class 파일)를 OS에 특화된 코드로 변환(인터프리터와 JIT 컴파일러)하여 실행한다.
- 바이트 코드를 실행하는 표준(JVM 자체는 표준)이자 구현체(특정 밴더가 구현한 JVM)다.
javap -c {file}
명령어로 바이트 코드 확인 가능
- JVM 밴더: 오라클, 아마존, Azul 등
- 특정 플랫폼에 종속적
JRE(Java Runtime Environment)
- 최소한의 배포 단위로 자바 애플리케이션을 실행할 수 있도록 구성된 배포판
- JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일을 가지고 있다. (JVM + 라이브러리)
- 실행에 관련된 것만 제공하며, 개발 관련 도구는 포함하지 않는다. (JDK가 제공)
JDK(Java Development Kit)
- JRE + 개발에 필요한 도구
- 소스 코드를 작성할 때 사용하는 자바 언어는 플랫폼에 독립적
- 오라클은 자바 11부터 JDK만 제공하며 JRE는 따로 제공하지 않는다.
- 자바 9부터 module 시스템이 들어왔는데 이를 이용해 JRE를 구성할수도 있다.
Java
- 프로그래밍 언어
- JDK에 들어 있는 자바 컴파일러(javac)를 사용하여 바이트코드(.class 파일)로 컴파일 할 수 있다.
- Oracle JDK 11 버전부터 상용으로 사용할 때만 유료
타 프로그래밍 언어 지원
- 최초의 JVM은 자바만을 지원하기 위해 만들어졌으나, 의존성이 타이트하지 않아서 .class 또는 .java 파일을 만들 수 있으면 다른 언어와도 사용할 수 있다.
- JVM 기반으로 동작하는 프로그램이 언어
- Closure, Groovy, JRuby, Jython, Kotlin, Scala 등
JVM 구조
Class loader system
- .class 에서 바이트 코드를 읽고 메모리에 저장
- 로딩(loading): 클래스를 읽어오는 과정
- 링크(link): 레퍼런스를 연결하는 과정
- 초기화(initializaiton): static 값들 초기화 및 변수 할당
Memory
- 메소드(method): 클래스 수준의 정보(클래스 이름, 부모 클래스 이름, 메소드, 변수) 저장. 공유 자원
- 힙(heap): 객체를 저장. 공유 자원
- 스택(stack): 쓰레드마다 런타임 스택을 만들고, 그 안에 메소드 호출을 스택 프레임이라 부르는 블럭으로 쌓으며 쓰레드 종료하면 런타임 스택도 사라짐
- PC 레지스터(Program Counter registers): 쓰레드마다 쓰레드 내 현재 실행할 스택 프레임을 가리키는 포인터가 생성
- 네이티브 메소드 스택: 쓰레드마다 생기며 네이티브 메소드를 호출할 때마다 생기는 별도의 스택. 네이티브 메소드 인터페이스(Java Native Interface)와 연결되어 있음
실행 엔진(Execution engine)
- 인터프리터: 바이트 코드를 한 줄씩 실행
- JIT 컴파일러: 인터프리터 효율을 높이기 위해 인터프리터가 반복되는 코드를 발견하면, JIT 컴파일러로 반복되는 바이트 코드를 모두 네이티브 코드로 바꿈. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용
- GC(Garbage Collector): 더이상 참조되지 않는 객체를 모아서 정리
JNI(Java Native Interface)
- 자바 애플리케이션에서 C, C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법 제공
- native 키워드를 사용한 메소드 호출
네이티브 메소드 라이브러리
- C, C++로 작성된 라이브러리
- JNI를 통해서 사용