자바프로그램 실행 + 메모리 관리(Garbage Collection)
바이트코드 VS 바이너리코드
- 바이트코드는 가상머신이 이해하는 코드 (OS독립적이다.)
- 바이너리코드는 컴퓨터가 이해하는 코드 (이진코드이나 반드시 기계어라고 할 수는 없다.)
❯ cat Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
❯ javac Hello.java
❯ ls
Hello.class Hello.java
❯ 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
}
❯ java Hello
Hello world!
: 컴파일러 버전이 실행파일 버전보다 높은경우
❯ 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
❯ 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)
출처: 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에서 해주는 역할 중 하나
JRE = JVM + Java Class Library + Java Class Loader
JDK = JRE + javac(컴파일)