뭐라도 끄적이는 BLOG

Java (JVM, JIT, JDK 간략한 설명) 본문

Java/Java 기본

Java (JVM, JIT, JDK 간략한 설명)

Drawhale 2023. 6. 29. 06:00

Java는...

Java는 Sun Microsystems에서 James Gosling과 다른 연구원들이 개발한 객체 지향적 프로그래밍 언어이다. 현재 Oracle에서 Sun을 인수하여 Java는 Oracle의 상표가 되었다.

JVM 이란

JVM(Java Virtual Machine)은 자바 가상 머신을 말한다. Java 이전의 언어들은 각 OS에서 제공하는 라이브러리들을 가져와 사용하고 각 OS에 특성에 맞게 개발을 해야 했다. Java는 이러한 불편함을 해소시키기 위해 JVM이라는 가상 머신에서 동작하도록 설계되었다. JVM이 자바 바이트코드(.class)를 각 OS에 특화된 코드로 변환하고 실행해주어 개발자들은 더 이상 OS에 신경 쓰지 않고 공통된 라이브러리를 이용해서 개발에 집중할 수 있게 되었다.

JVM은 각 운영체제에 종속적이지만 Java 바이트 코드를 독립적으로 만들어 준다. 즉 각 OS마다 서로다른 JVM을 설치해 주어야 하지만 바이트 코드는 어느 OS마다 동일한 코드로 실행시킬 수 있다. 이렇게 "Write Once Run Anywhere" 한번 작성해서 어느 플랫폼이든 JVM만 있다면 실행이 가능한 Java의 특징이 완성되는 것이다.

JVM은 이름에서 드러나는 것과 같이 Java만을 위한 가상 머신이였으나 지금은 Kotlin, Scala와 같이 바이트 코드를 만들수 있는 다양한 언어의 가상 머신으로 사용되고 있다.

JDK와 JRE

사진 출처 :   www.oracle.com/java/technologies/platform-glance.html

JDK (Java Development Kit)

JDK는 JRE와 Java Application 개발을 위한 필요 도구들이 포함되어 있다. JDK는 Oracle만 제공하고 있는 것이 아니다. 아래 링크에서 다양한 JDK Vendor를 볼 수 있다. Oracle JDK는 상용서비스 시 비용이 발생할 수 있으므로 타사의 JDK를 설치해서 사용해보는 것이 좋다.

 

Java 8 - foojay

The information below presents data on Java 8, made available by Marc R. Hoffmann, from javaalmanac.io, provided under the CC BY-SA 4.0 license.

foojay.io

JRE (Java Runtime Environment)

Java Application의 실행을 위한 라이브러리와 기타 파일들을 말한다. JRE는 11 버전부터 따로 제공하지 않고 JDK와 함께 제공된다.Important Changes and Information에서 해당 내용을 확인할 수 있다.

 

JVM Specs

 

Java SE Specifications

Java Language and Virtual Machine Specifications Java SE 18 Released March 2022 as JSR 393 The Java Language Specification, Java SE 18 Edition HTML | PDF Preview feature: Pattern Matching for switch The Java Virtual Machine Specification, Java SE 18 Editio

docs.oracle.com

Java Spec은 다른 ANSI C, Standard Pascal, jpeg, png같이 국제 표준화 기구와 같은 거대한 공적 기관에서 표준으로 인정받지는 못했다. 그래서 Standard라는 표준을 가지고 있지 않다. 하지만 사실상의 표준으로 사용되고 있다.

JVM은 Spec만 지킨다면 누구나 만들수 있다. 이 스펙은 JCP에 의해 관장된다. 이러한 Spec으로 구현체가 각 Vendor마다 구현하여 사용한다. ORACLE, IBM, AZUL 등에서 HotSpot, OpenJ9, OpenJDK라는 이름으로 JVM이 배포되고 있다.

SDKMAN

Linux 기반의 OS또는 Unix기반의 OS에서 사용할 수 있는 소프트웨어 개발 키트 관리자 이다. WIndows에서도 Cygwin을 사용하면 사용할 수 있다. SDKMAN으로 다양한 JVM들과 각 버전을 설치, 교체, 업데이트를 몇가지 명령어 만으로 간편하게 할 수 있다.

 

 

Home - SDKMAN! the Software Development Kit Manager

SDKMAN! is a tool for managing parallel versions of multiple Software Development Kits on most Unix based systems.

sdkman.io

Java 컴파일 방법

Java를 컴파일 한다는 것은 자바 컴파일러를 사용하여 .java 자바 코드를 .class 바이트 코드로 변환하는 과정을 말한다. JDK(Java Development Kit)을 설치하면 javac 라는 자바 컴파일러가 포함되어 있으며 javac를 이용해 컴파일을 할 수 있다.

public class Main{
	public static void main(String[] argv){
		System.out.println("Hello. world!");
	}
}

javac를 어느 위치에서든지 사용할 수 있도록 하려면 환경변수에 등록해야 한다. 환경변수를 등록하는 방법은 각 OS마다 달라 이글에서는 다루지 않는다.

javac를 이용해서 .java코드가 있는 위치에서 컴파일을 할 수 있다. 컴파일 이후에는. class 파일이 결과물로 생성되며 이것이 자바 바이트 코드이다. JVM은 자바 바이트 코드를 인터프리터 형식으로 실행하게 된다.

바이트 코드 실행 방법

실행할 때는 JDK에 함께 포함되어 있던 java를 사용하여 실행할 수 있다. 마찬가지로 환경변수로 등록해야 사용할 수 있으며 javac를 등록했을 때 bin 폴더를 환경변수로 등록했다면 함께 등록되어 있을 것이다. java는 javac로 컴파일한 바이트코드를 실행할 수 있다.

크로스 컴파일

상위버전으로 컴파일한 java코드는 하위 버전의 java로 실행할 수 없다. 하지만 반대는 가능하다.

상위 버전의 javac로 컴파일할 때 -source와 -target을 지정해 주면 하위 컴파일러에서도 실행되도록 할 수 있다. 이러한 과정을 cross compile이라고 한다. cross compile시 -bootclasspath와 -extdirs옵션을 사용하는 것이 중요하다.

javac -source 8 -target 8 -bootclasspath "C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar" -extdirs "C:\Program Files\Java\jdk1.8.0_221\lib" Main.java

만일 상위버전(11)으로 컴파일한 바이트코드를 하위 버전(8)으로 실행한다면 아래와 같은 에러 메시지가 출력된다.

class version 55(java 11)로 컴파일된 것을 version 52(java 8)로 실행하려고 한다는 에러 메시지를 볼 수 있다. 가끔 다른 라이브러리를 불러와 사용할 때 java상위버전으로만 컴파일 한뒤 패키징을 해서 하위 버전에서 사용 못하는 경우가 있는데 이때 이러한 에러를 확인할 수 있다.

java, javac 옵션

java와 javac 옵션이 많기때문에 몇 가지 옵션만 설명한다. 옵션에 대해 더 상세히 알고 싶다면 각 버전별 documentation에서 tools reference를 참고하는 것이 좋다.

java

java [options] mainclass [args...]
  • --class-path, -classpath, -cp: 클래스 파일을 검색할 디렉터리를 지정한다. 해당 경로를 지정하면 CLASSPATH환경 변수의 모든 설정이 재정의 된다.
  • -Dproperty-value: 시스템의 property 값을 설정한다. ex) -Dfoo= "foo bar"
  • -Xms, -Xmx: Xms는 heap의 초기 크기를 설정한다. 1024의 배수가 들어가야하며 1MB보다 커야 한다. Xmx는 메모리 할당 시 최대 크기를 바이트 단위로 지정한다. 1024의 배수가 들어야 하며 2MB보다 커야 한다.
  • -verbose:class, gc, jni, module: 각각 자바 프로그램 실행 시 클래스에 대한 정보 GC에 대한 정보 JNI 활동에 대한 정보 사용 중인 모듈 정보를 표시한다.
  • -server: 시작 시간은 좀 걸리더라도 다수의 request를 빠르게 처리하는데 중점을 맞추고 있다..
  • -client: 스타트업 시간과 메모리 공간에 대한 최적화에 중점을 두고 있다.
※ client mode와 server mode는 java8 이후부터 신경 쓸 필요가 없다.

javac

javac [options] [sourcefiles]
  • --class-path, -classpath, -cp: 클래스 파일을 검색할 디렉터리를 지정한다. 해당 경로를 지정하면 CLASSPATH환경 변수의 모든 설정이 재정의 된다.
  • -d: 클래스 파일의 대상 디렉터리를 설정한다.
  • -g: 로컬 변수를 포함하여 모든 디버깅 정보를 생성한다. 기본적으로 라인 번호와 원본 파일 정보만 생성된다.
  • -verbose: 컴파일러의 작업에 대한 메시지를 출력한다. 메시지에는 로드된 각 클래스와 컴파일된 각 원본 파일에 대한 정보가 포함된다.
  • -target: target java version
  • -source: source code java version
  • --boot-class-path, -bootclasspath: bootstrap 클래스 파일의 위치를 재정의 한다.
  • -extdirs: 설치된 extensions위치를 재정의 한다. cross-compile 하는 경우 extension클래스를 포함하는 디렉터리를 지정한다.
반응형

'Java > Java 기본' 카테고리의 다른 글

Java 연산자  (0) 2023.07.01
Java Variables와 Data Types  (0) 2023.06.30
Garbage Collector의 종류 (Serial, Parallel, CMS, G1, Z)  (0) 2023.06.29
JVM 구성 요소  (0) 2023.06.29
Java Bytecode  (0) 2023.06.29