1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. #1
JVM이란 무엇인가
자바 가상 머신(Java Virtual Machine)으로 컴퓨터(OS 무관)에서 Java bytecode로 컴파일된 다른 언어(eg. Python, JavaScript, …)로 작성된 프로그램뿐만이 아니라 자바 프로그램을 실행할 수 있게 하는 가상 머신이다.
컴파일 하는 방법
CMD/Terminal에서 JDK 가 설치되어 있고, 환경변수로 등록되어 있다면 javac 자바파일명.java 로 컴파일한다.
"%JAVA_HOME%"\bin\javac filename.java
실행하는 방법
CMD/Terminal에서 java 자바클래스명(확장자 제외)으로 실행한다.
"%JAVA_HOME%"\bin\java filename
바이트코드란 무엇인가
JVM이 읽을 수 있는 언어로 변환된 코드로 Java compiler로 컴파일한 결과이다.
JIT 컴파일러란 무엇이며 어떻게 동작하는지
Just-In-Time 컴파일러는 런타임에 자바 어플리케이션의 퍼포먼스를 향상시키는 JRE의 한 컴포넌트이다.
Interpreter 방식의 단점을 보완하기 위해 도입된 방식으로, Interpreter 방식으로 실행하다가 적정한 시점에 바이트 코드 전체를 컴파일하여 네이티브 코드로 변경하고, 더 이상 interpreting 하지 않고 네이티브 코드로 직접 실행하는 방식이다. 네이티브 코드는 캐시에 보관되기 때문에 한 번 컴파일된 코드는 빠르게 실행할 수 있다.
JVM 구성 요소
- 자바 인터프리터: 자바 바이트코드를 읽고 해석하는 것
- 클래스 로더: 자바 클래스를 JVM으로 동적으로 로드하는 것
- JIT 컴파일러: 자바 프로그램을 실행하는 시점에 기계어로 번역해주는 것
- 가비지 컬렉터: 사용하지 않는 메모리를 자동으로 회수해주는 것
JDK와 JRE의 차이
- JDK(Java Development Kit): java 컴파일 및 실행 가능
- JRE(Java Runtime Environment): java 실행만 가능
1주차 추가 과제
javac 옵션 조사
C:\dev\git>javac -help
Usage: javac <options> <source files>
where possible options include:
-g 모든 디버깅 정보를 생성
-g:none 디버깅 정보를 생성하지 않음
-g:{lines,vars,source} 지정 디버깅 정보 생성(lines: 라인 정보, vars: 지역변수, source: 소스 파일정보)
-nowarn 경고 메시지 미출력
-verbose 컴파일러가 하는 것에 대해 출력
-deprecation deprecate 된 API가 사용된 소스 위치 출력
-classpath <path> 사용자 클래스를 찾을 위치 지정
-cp <path> 사용자 클래스를 찾을 위치 지정
-sourcepath <path> input 소스 파일을 찾을 위치 지정
-bootclasspath <path> bootstrap 클래스 파일 경로 Override
-extdirs <dirs> 설치된 확장 디렉토리 위치 Override
-endorseddirs <dirs> JDK에 포함되지 않은 라이브러리 위치 Override
-proc:{none,only} annotation 처리 및/또는 컴파일됐는지를 제어
-processor <class1>[,<class2>,<class3>...] 실행시킬 annotation processors 이름
-processorpath <path> annotation processors를 찾을 위치 지정
-parameters 메타데이터를 생성 for reflection on method parameters
-d <directory> 생성된 클래스 파일 위치 지정
-s <directory> 생성된 소스 파일 위치 지정
-h <directory> 생성된 헤더 파일 위치 지정
-implicit:{none,class} 클래스 파일을 생성할 것인지 아닌지 지정 for implicitly referenced files
-encoding <encoding> 소스 파일에 사용된 인코딩 지정
-source <release> 지정된 release와 소스 호환성 Provide
-target <release> VM 버전 명시를 위한 클래스 파일 생성
-profile <profile> 사용된 API가 가능한지를 확인
-version 버전 정보
-help 표준 옵션 개요 출력
-Akey[=value] annotation processors에 전달할 옵션 지정
-X 비표준 옵션 개요 출력
-J<flag> Pass <flag> directly to the runtime system
-Werror 경고 발생 시, 컴파일 종료
@<filename> 파일로부터 옵션, 파일명 Read