JVM

eunsol Jo·2021년 12월 25일
0

☕️  Java

목록 보기
1/4

JVM?

자바프로그램 실행 + 메모리 관리(Garbage Collection)

  • 바이트코드를 읽고,검증,실행
  • OS종속적이다. 단, 바이트코드(.class)는 OS독립적이다.

바이트코드 VS 바이너리코드

  • 바이트코드는 가상머신이 이해하는 코드 (OS독립적이다.)
  • 바이너리코드는 컴퓨터가 이해하는 코드 (이진코드이나 반드시 기계어라고 할 수는 없다.)

.java ~ .class

1) Hello.java 작성

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

2) Hello.java 컴파일 (javac)

❯ javac Hello.java
❯ ls
Hello.class Hello.java

3) Hello.class 바이트코드 확인 (javap -c)

❯ javap -c Hello.class
Compiled from "Hello.java"
public class Hello {
  public Hello();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello world!
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}
  • OP Code 가 1byte라서 바이트코드라 한다.(1byte = 2^8 = 256개의 명령어를 저장 가능.)
  • javap -c : disassembled된 코드를 출력. JVM의 바이너리코드를 출력.

4) Hello.class 실행

❯ java Hello
Hello world!

💡 java version < javac version

: 컴파일러 버전이 실행파일 버전보다 높은경우

❯ java -version
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_292-b10)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.292-b10, mixed mode)
❯ javac -version
javac 11.0.13

UnsupportedClassVersionError 발생

❯ java Hello
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: Hello has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)

JIT(Just In Time) 컴파일러?

  • java 실행시 인터프리터가 라인바이라인으로 바이트코드를 읽어 기계어로 해석한다.
  • 여러번 사용되는 코드의 경우 JIT컴파일러가 기계어를 캐싱해 재사용한다. 매번 해석하는 시간을 줄여 빠르게 처리 된다.
  • 일종의 Tread로 동작한다. (인터프리터와 동시에 처리 가능)
  • JVM의 Runtime영역에 존재 (JVM Hotspot부터 기본 배포됨)

JVM 구성 요소


출처: https://www.inflearn.com/course/the-java-code-manipulation#curriculum

  • Class Loader : 컴파일 한 .class 파일을 런타임에 올려서 실행하는 부분

  • Execution Engine : .class 파일을 해석한다 (인터프리터, JIT 방식으로)

  • Runtime Data Area : 해석된 프로그램은 여기서 돌아간다. JVM 메모리 영역. 필요에 따라 GC나 쓰레드 동기화등 관리해줌

  • Garbage Collector : 메모리 관리를 해준다. Runtime Data Area에서 해주는 역할 중 하나

JDK & JRE

JRE (Java Runtime Eviroment)

JRE = JVM + Java Class Library + Java Class Loader

  • 자바프로그램 실행환경 (실행을 위해서 반드시 필요)
  • 실행에 필요한 라이브러리 및 기타파일을 포함
  • JVM에서 실행할수 있게끔 처리 (by. 클래스로더 + 라이브러리)

JDK (Java Development Kit)

JDK = JRE + javac(컴파일)

  • 개발을 위해서는 JDK필요
profile
Later never comes 👩🏻‍💻

0개의 댓글