2 minute read

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

javac 옵션 참고

live-study with whiteship