Unicorns
All the things
All the things
JVM (Java Virtual Machine) : 자바 프로그램이 실행되는 가상 컴퓨터(VM)
운영체제에서 바로 실행하면 되는 데 JVM 이라고 하는 가상 머신(기계)이 왜 필요 한 것인가 ??
자바는 운영체제에 독립적, JVM은 운영체제에 종속적이다.
자바 프로그램에서 컴파일이란?
1.자바 설치(JDK)
※ 자바 컴파일러(Java compiler)
자바를 가지고 작성한 자바 소스 코드를 자바 가상 머신이 이해할 수 있는 자바 바이트 코드로 변환해준다.
자바 컴파일러는 자바를 설치하면 javac.exe 라는 실행 파일 형태로 설치된다.
2. java 소스 파일 작성하기
public class Hello {
public static void main(String\[\] args) {
System.out.println("hello world");
}
}
3. 자바 컴파일러 실행
JDK 폴더 안에 자바를 실행할 수 있는 java.exe가 있다.
JVM(자바 가상 머신) 이 이해할 수 있는 언어로 변환된 코드를 의미
javap 는 .class 파일의 필드, 생성자, 메서드들의 정보를 보여주는 명령어이다.
Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("hello , java");
}
}
javap : 최소 구성만 보여준다.
javap Hello.class
Compiled from "Hello.java"
public class step1.Hello {
public step1.Hello();
public static void main(java.lang.String[]);
}
javap -p : 모든 클래스와 멤버를 보여준다.
javap -p Hello.class
Compiled from "Hello.java"
public class step1.Hello {
public step1.Hello();
public static void main(java.lang.String[]);
}
javap -v : stack size , arguments for methods 와 같은 자세한 정보를 보여준다.
javap -v Hello.class
Last modified 2021. 10. 12.; size 422 bytes
MD5 checksum ff4146e1163a7cb1070c19e462ccf9f6
Compiled from "Hello.java"
public class step1.Hello
minor version: 0
major version: 55
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
this_class: #5 // step1/Hello
super_class: #6 // java/lang/Object
interfaces: 0, fields: 0, methods: 2, attributes: 1
Constant pool:
#1 = Methodref #6.#15 // java/lang/Object."<init>":()V
#2 = Fieldref #16.#17 // java/lang/System.out:Ljava/io/PrintStream;
#3 = String #18 // hello , java
#4 = Methodref #19.#20 // java/io/PrintStream.println:(Ljava/lang/String;)V
#5 = Class #21 // step1/Hello
#6 = Class #22 // java/lang/Object
#7 = Utf8 <init>
#8 = Utf8 ()V
#9 = Utf8 Code
#10 = Utf8 LineNumberTable
#11 = Utf8 main
#12 = Utf8 ([Ljava/lang/String;)V
#13 = Utf8 SourceFile
#14 = Utf8 Hello.java
#15 = NameAndType #7:#8 // "<init>":()V
#16 = Class #23 // java/lang/System
#17 = NameAndType #24:#25 // out:Ljava/io/PrintStream;
#18 = Utf8 hello , java
#19 = Class #26 // java/io/PrintStream
#20 = NameAndType #27:#28 // println:(Ljava/lang/String;)V
#21 = Utf8 step1/Hello
#22 = Utf8 java/lang/Object
#23 = Utf8 java/lang/System
#24 = Utf8 out
#25 = Utf8 Ljava/io/PrintStream;
#26 = Utf8 java/io/PrintStream
#27 = Utf8 println
#28 = Utf8 (Ljava/lang/String;)V
{
public step1.Hello();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 3: 0
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=1, args_size=1
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String hello , java
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
LineNumberTable:
line 5: 0
line 6: 8
}
javap -c : .class 파일을 분해해서 해석해준다.
javap -c Hello.class
Compiled from "Hello.java"
public class step1.Hello {
public step1.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 , java
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
bytecode를 기계어로 변환하기 위해 JVM Execution Engine(실행 엔진)에 있는 Interpreter 와 JIT 컴파일러가 구동된다.
Interpreter가 매번 바이트 코드를 읽고 한 줄 씩 기계어 코드를 생성하고 이를 순차적으로 실행한다.
심지어 같은 메서드를 여러번 호출 할 때, 매번 한 줄씩 interpreter 가 구동된다.
이로 인해 시스템 효율과 성능이 떨어질 수 있다.
JIT(Just-In-Time) 컴파일러가 이 점을 보완 해 줄 수 있다.
인터프리터 방식으로 기계어를 생성할 때 자주 사용되는 메서드, 변수 그리고 여러번 호출 되는 메서드를 캐싱하여
재사용 할 수 있다. 이는 매번 기계어 코드를 생성하는 것을 방지 할 수 있다.
요약하면
바이트 코드를 읽고 자바를 실행 하는 JVM의 구성 요소를 살펴보자
ex)
public static void main(String[] args) {
Thread.currentThread();
}
Thread.currentThread(); 는 C로 구현한 메서드이다. 앞에 native 키워드가 있다.
※ 네이티브 응용 프로그램 이란?
하드웨어와 운영 체제 플랫폼에 종속된 프로그램들을 말한다
.
REFERENCE
이것이 자바다
자바의정석
더 자바, 코드를 조작하는 방법
https://www.theserverside.com/definition/Java-compiler
http://www.tcpschool.com/java/java_intro_programming
https://www.tutorialspoint.com/How-to-compile-a-java-program
https://wikidocs.net/257
https://www.ibm.com/cloud/learn/jre
https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre
https://www.softwaretestinghelp.com/java-components-java-platform-jdk/
http://javapracs.blogspot.com/2011/12/one-java-2-compilers-javac-and-jit.html
https://www.baeldung.com/java-class-view-bytecode
[Java Study] - Garbage Collection(GC) in JVM (0) | 2021.09.26 |
---|---|
[Java Study] - LinkedList , Queue in Collection framework (0) | 2021.09.26 |
[Java Study] - 연산자 , 연산자의 종류 (0) | 2021.09.23 |
[Java Study] - 자바 데이터 타입, 변수 ,배열 (0) | 2021.09.22 |
[Java] 문자열 앞뒤 공백 잘라내기- trim() (0) | 2021.05.14 |