[java live study] 1์ฃผ์ฐจ : JVM์ ๋ฌด์์ด๋ฉฐ ์๋ฐ ์ฝ๋๋ ์ด๋ป๊ฒ ์คํํ๋ ๊ฒ์ธ๊ฐ
๋ชฉํ๐
์๋ฐ ์์ค ํ์ผ(.java)์ JVM์ผ๋ก ์คํํ๋ ๊ณผ์ ์ดํดํ๊ธฐ.
ํ์ตํ ๊ฒ
- JVM์ด๋ ๋ฌด์์ธ๊ฐ
- ์ปดํ์ผ ํ๋ ๋ฐฉ๋ฒ
- ์คํํ๋ ๋ฐฉ๋ฒ
- ๋ฐ์ดํธ์ฝ๋๋ ๋ฌด์์ธ๊ฐ
- JIT ์ปดํ์ผ๋ฌ๋ ๋ฌด์์ด๋ฉฐ ์ด๋ป๊ฒ ๋์ํ๋์ง
- JVM ๊ตฌ์ฑ ์์
- JDK์ JRE์ ์ฐจ์ด
- +) javac option
JVM์ด๋ ๋ฌด์์ธ๊ฐ
Java Vertual Machine ์ง์ญํ๋ฉด โ์๋ฐ๋ฅผ ์คํํ๊ธฐ ์ํ ๊ฐ์ ๊ธฐ๊ณ(=์ปดํจํฐ)โ๋ผ๋ ๋ป์ผ๋ก ๋ฐ์ดํธ์ฝ๋(์ปดํ์ผ๋ ์๋ฐ์ฝ๋)๋ฅผ ์คํํ๋ ์ฃผ์ฒด๋ค.
Vertual Machine์ ์ํํธ์จ์ด๋ก ๊ตฌํ๋ ํ๋์จ์ด๋ฅผ ๋ปํ๋ ๋์ ์๋ฏธ์ ์ฉ์ด๋ก, ์ค์ ํ๋์จ์ด ์ปดํจํฐ๊ฐ ์๋ ์ํํธ์จ์ด๋ก ๊ตฌํ๋ ์ปดํจํฐ๋ผ๋ ๋ป์ผ๋ก ์ปดํจํฐ ์์ ์ปดํจํฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์๋ฐ๋ก ์์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ชจ๋ ์ด JVM์์๋ง ์คํ๋๊ธฐ ๋๋ฌธ์ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋๊ธฐ ์ํด์๋ ๋ฐ๋์ JVM์ด ํ์ํ๋ค.
The Java Virtual Machine is an abstract computing machine. It is the component of the technology responsible for its hardware- and operating system-independence, the small size of its compiled code, and its ability to protect users from malicious programs.
์๋ฐ ๊ฐ์ ๋จธ์ ์ ์ถ์ ์ปดํจํ ๋จธ์ ์ ๋๋ค. ํ๋์จ์ด ๋ฐ ์ด์ ์ฒด์ ๋ ๋ฆฝ์ฑ, ์ปดํ์ผ ๋ ์ฝ๋์ ์์ ํฌ๊ธฐ ๋ฐ ์ ์ฑ ํ๋ก๊ทธ๋จ์ผ๋ก๋ถํฐ ์ฌ์ฉ์๋ฅผ ๋ณดํธํ๋ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ๊ธฐ์ ์ ๊ตฌ์ฑ ์์์ ๋๋ค. - Oracle JVM ๋ฌธ์
์ผ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ OS์ ๋ฐ๋ก ๋ง๋ถ์ด ์๊ธฐ ๋๋ฌธ์ OS์ ์ข
์์ ์ด๋ค. ์ข
์์ ์ด๋ผ ํจ์ OS์ ๋ณ๋์ด ์๊ธธ๋๋ง๋ค ๊ทธ์ ๋ง๊ฒ ์ ํ๋ฆฌ์ผ์ด์
๋ ๋ณ๊ฒฝํด์ผํ๋ค.
๋ฐ๋ฉด JAVA ์ ํ๋ฆฌ์ผ์ด์
์ JVM๊ณผ ์ํธ์์ฉ์ ํ๊ธฐ๋๋ฌธ์ OS์ ํ๋์จ์ด์ ๋
๋ฆฝ์ ์ด๊ฒ ๋๋ฉฐ ๋ค๋ฅธ OS์์๋ ์ ํ๋ฆฌ์ผ์ด์
์์ ์์ด ์คํ์ด ๊ฐ๋ฅํ๋ค. (๋์ JVM์ด OS์ข
์์ ์ด๊ธฐ ๋๋ฌธ์ ํด๋นํ๋ OS์ ๋ง๋ JVM์ด ํ์ํ๋ค.)
๊ทธ๋ฆฌํ์ฌ ์๋ฐ์ ์ค์ํ ์ฅ์ ์ค์ ํ๋์ธ โWrite once, run anywhere. ํ ๋ฒ ์์ฑํ๋ฉด ์ด๋์๋ ์คํ๋๋ค.โ๊ฐ ๊ฐ๋ฅํ๊ฒ ๋๋ ๊ฒ์ด๋ค!
์ปดํ์ผํ๋ ๋ฐฉ๋ฒ&์คํํ๋ ๋ฐฉ๋ฒ
๊ธฐ๋ณธ์ ์ธ ์คํํ๋ฆ : ์์ค์ฝ๋ ์์ฑ(.java) -> ์ปดํ์ผ(.class) -> ์ปดํ์ผ ๋ classํ์ผ์ JVM์์ ์คํ
// ์ปดํ์ผ
$ javac fileName.java
// ์คํ
$ java fileName.class
์ฌ์ค ์ด๋ ๊ฒ ํ๋ํ๋ ์ปดํ์ผํ๊ณ ์คํํ ์ผ์ ๊ฑฐ์ ์๋ค. ์ฌ์ฉํ๊ณ ์๋ IDE ์์ ๊ฐ๋จํ๊ฒ ์คํ๋ฒํผ์ผ๋ก ์คํํ๋ฉด ๋๋ค.
Q.์์๋ฒ์ ์ ์๋ฐ๋ก ์ปดํ์ผ์ ํ ํ ํด๋น ํด๋์คํ์ผ์ ํ์ ๋ฒ์ ์ ์๋ฐ๋ก ์คํ์ด ๋ ๊น ? -> ์๋๋ค.
๋ฐ๋๋ก ํ์๋ฒ์ ์ ํด๋์คํ์ผ์ ์์๋ฒ์ ์ ์๋ฐ์์ ์คํํ ์ ์๋ค.
์ฌ๊ธฐ์ ์๋ฐ ์ปดํ์ผ ์ต์ ์ ์๊ฐํด๋ณผ ์ ์์ผ๋ฉฐ javac -help ๋ก ์ ์ฒด ์ต์ ์ ํ์ธํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ $ javac -help
Usage: javac <options> <source files>
where possible options include:
-g Generate all debugging info
-g:none Generate no debugging info
-g:{lines,vars,source} Generate only some debugging info
-nowarn Generate no warnings
-verbose Output messages about what the compiler is doing
-deprecation Output source locations where deprecated APIs are used
-classpath <path> Specify where to find user class files and annotation processors
-cp <path> Specify where to find user class files and annotation processors
-sourcepath <path> Specify where to find input source files
-bootclasspath <path> Override location of bootstrap class files
-extdirs <dirs> Override location of installed extensions
-endorseddirs <dirs> Override location of endorsed standards path
-proc:{none,only} Control whether annotation processing and/or compilation is done.
-processor <class1>[,<class2>,<class3>...] Names of the annotation processors to run; bypasses default discovery process
-processorpath <path> Specify where to find annotation processors
-parameters Generate metadata for reflection on method parameters
-d <directory> Specify where to place generated class files
-s <directory> Specify where to place generated source files
-h <directory> Specify where to place generated native header files
-implicit:{none,class} Specify whether or not to generate class files for implicitly referenced files
-encoding <encoding> Specify character encoding used by source files
-source <release> Provide source compatibility with specified release
-target <release> Generate class files for specific VM version
-profile <profile> Check that API used is available in the specified profile
-version Version information
-help Print a synopsis of standard options
-Akey[=value] Options to pass to annotation processors
-X Print a synopsis of nonstandard options
-J<flag> Pass <flag> directly to the runtime system
-Werror Terminate compilation if warnings occur
@<filename> Read options and filenames from file
์ต๊ทผ ์คํ๋ง ํ๋ ์์ํฌ์์ ์๋ฐ15๋ฅผ ์ง์ํ๊ฒ ๋์๊ณ ์ต์ ์ง์ ์๋ฐ๋ฒ์ ์ 8 ์ด์์ด์ฌ์ผ ํ๋ค. ์ฆ, ์ปดํ์ผํ ๋ ์ต์ ์ ์ฃผ์๊ธฐ ๋๋ฌธ์(source, target ์ต์ ) ์๋ฐ8~15๊น์ง์ ๋ฒ์ ์์ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
*๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ๋ฅผ ์ง์ํ๋ ์ ์ฅ์์๋ ๊ผญ ์ดํดํ๊ณ ์์ด์ผ ํ๋ ๋ถ๋ถ (์ด์ง๋ง, ์ ๋ง ์ํ๊น๊ฒ๋ ์ผ๋ถ ๋ฉ์ด๋ธ ํ๋ฌ๊ทธ์ธ์์ ์๋ฐ9๋ก๋ง ์ปดํ์ผ์ ํ๊ณ ํจํค์ง์ ํด๋ฒ๋ฆฌ๊ธฐ๋โฆ)
๊ทธ๋์..! ์ด๋ฐ ๊ฒฝ์ฐ ๋ฐ์๋ ์๋ฌ ๋ฉ์ธ์ง๋ฅผ ์ฝ๊ณ ์ด ๊ฒฝ์ฐ์์ ์์์ผ ํ๋ค.
class file version 58.0๋ฒ์ (์๋ฐ14๋ฒ์ )์ผ๋ก ์ปดํ์ผ๋ ํ์ผ์ 52.0๋ฒ์ (์๋ฐ8)์ผ๋ก ์คํํด์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ด.
// ๋ค๋ฅธ๋ฒ์ (์ 14๋ฒ์ )์ผ๋ก ์์ฑ๋ ์์ค๋ฅผ 8๋ฒ์ ํ๊ฒ์ผ๋ก ์ปดํ์ผ
$ javac FileName.java -source 1.8 -target 1.8
//ํด๋์คํ์ผ์ ๋ฒ์ ์ ํ์ธํ๋ ค๋ฉด javap ๋ก ํ์ธ๊ฐ๋ฅ
//ํด๋น ํด๋์คํ์ผ์ ํธํ ๋ฒ์ ํ์ธ ๋ฐฉ๋ฒ
$ javap -verbos class๋ช
| find /N "version"
๋ ์์ธํ ๋ด์ฉ์ ๐ ์ค๋ผํด 11๋ฒ์ javac ๋ฌธ์ , ์ค๋ผํด 11๋ฒ์ javap ๋ฌธ์
๋๊ตฐ๊ฐ๋ ๊ถ๊ธํด ํ ์ง๋ ๋ชจ๋ฅธ๋ค.
Q. ๋ฌด์กฐ๊ฑด ๋ฒ์ ์ ๋ฎ์ถ์ด ์ปดํ์ผํ๋ฉด ๋ค ๋๋๊ฒ ์๋๊ฐ?
A. ์ปดํ์ผ๋ฌ๋ ๋ฒ์ ์ด ์ฌ๋ผ๊ฐ์๋ก ์ฑ๋ฅ์ด ์ข์์ง๊ธฐ๋๋ฌธ์ ๋๋๋ก ์์๋ฒ์ ์ผ๋ก ์ปดํ์ผ์ ํ๋๊ฒ์ด ์ข๊ณ , ํ์๋ฒ์ ์ผ๋ก ์ปดํ์ผํ ๋ฐ์ดํธ์ฝ๋๊ฐ ๊ณผ์ฐ ํจ์จ์ ์ธ ์ฝ๋์ผ๊น? ๋ ์๋์ง๋. ๊ฐ ๋ฒ์ ์ ์ปดํ์ผ๋ฌ๋ก ์ปดํ์ผํ ๋ฐ์ดํธ์ฝ๋๊ฐ ๊ฐ์ฅ ์ต์ ํ ๋์ด์์ ๊ฒ.
๊ทธ๋์ ๋ฐ์ดํธ์ฝ๋? ํด๋์ค ํ์ผ ์์ ๋ค์ด์๋ ๊ฒ์ด ๋ฐ์ดํธ์ฝ๋ !
( * โ๋ฐ์ดํธ ์ฝ๋โ ์๋๊ณ โ๋ฐ์ดํธ์ฝ๋โ< )
// javap ๋ก ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ฌ๋์ด ์ฝ์ ์ ์๋ ํํ(OP์ฝ๋)๋ก ํด์ํด์ ๋ณด์ฌ์ค
$ javap -c Hello.class
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 #7 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #13 // String Hello java
5: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
OP ์ฝ๋ = Operation Code
์ปดํจํฐ ๊ณผํ์์ ๋ช ๋ น ์ฝ๋(opcodeโoperation code, instruction syllable, instruction parcel, opstring)๋ ๊ธฐ๊ณ์ด์ ์ผ๋ถ์ด๋ฉฐ ์ํํ ๋ช ๋ น์ด๋ฅผ ๋ํ๋ด๋ ๋ถํธ๋ฅผ ๋งํ๋ค. ์ด์ ๋ํ ๊ท๊ฒฉ๊ณผ ํ์์ ํ๋ก์ธ์ ๋ช ๋ น์ด ์งํฉ์ ๋์ ์๋ค. (ํ๋ก์ธ์๋ ์ผ๋ฐ CPU์ผ ์๋ ์๊ณ ํน๋ณํ ์ฒ๋ฆฌ ์ฅ์น์ผ ์๋ ์๋ค) ๊ธฐ๊ณ์ด ๋ช ๋ น์ด(Instruction)๋ ๋ช ๋ น์ด๋ฅผ ๋ํ๋ด๋ opcode๋ฅผ ๊ฐ์ง๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ํผ์ฐ์ฐ์๋ฅผ ๋ํ๋ด๋ ํ๋ ์ด์์ ์ง์ ์๋ฅผ ๊ฐ์ง๋ค. - ์ํค๋ฐฑ๊ณผ
*์ฌ๊ธฐ์์๋ ์๋ฐ์์ ์ ๋ฆฌํด๋ ๊ฐ๊ฐ์ ๋ช ๋ น์ด๋ค์ด ํ ์ค์ฉ ํด์๋์ด ์๋๊ฒ์ผ๋ก ์ดํดํ๋ฉด ๋จ
๋ฐ์ดํธ์ฝ๋์ธ ์ด์ ๊ฐ ํ ์ค์ OP์ฝ๋๊ฐ 1byte ๋ผ์ ๋ฐ์ดํธ์ฝ๋๋ค. ์ฐ๋ฆฌ๋์๋ ์ง๊ธ String ์ผ๋ก ๋ณด์ด์ง๋ง ใ ใ
JIT ์ปดํ์ผ๋ฌ๋ ๋ฌด์์ด๋ฉฐ ์ด๋ป๊ฒ ๋์ํ๋๊ฐ
JIT = Just In Time
javac ์ ์ ํ ๊ด๋ จ ์๋ค. ์๋ฐ๋ฅผ ๊ฐ์ง๊ณ ํ๋ก๊ทธ๋จ์ ์คํํ ๋ ๊ด๋ จ์๋ ์ปดํ์ผ๋ฌ(jvm์ด ์คํํ๋).
์ฝ๋๋ฅผ ์คํํ ๋ ์ธํฐํ๋ฆฌํฐ๊ฐ line by line ์ผ๋ก ๋ฐ์ดํธ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํด์ ์คํ ํ๊ณ , ์์ฃผ ์คํํ๋ ์ฝ๋๊ฐ ์๋ค๋ฉด JIT์ด ๋ฒ์ญ๋ ๊ธฐ๊ณ์ด๋ฅผ ์บ์ฑํด ์ฌ์ฌ์ฉํ๋ค(jvm๋ด๋ถ์ ์บ์ฑ๋จ).
์ธํฐํ๋ฆฌํฐ๊ฐ ๋งค๋ฒ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ์ง ์๊ณ ๋ฐ๋ก ํด์๋ ๊ฒ์ ๊ฐ์ ธ๋ค ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๋ค.(*JIT ์์ฒด๊ฐ ๋น ๋ฅธ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์๋จ)
jvm์ ๋ฐํ์ ์์ญ์ ๋ค์ด๊ฐ ์์ผ๋ฉฐ JIT์ ์ผ์ข
์ ์ฐ๋ ๋๋ก ๋์ํ๊ณ ์ธํฐํ๋ฆฌํฐ๋ ๊ฐ์ด ๋์ํ๋ค. ์ฆ ๋์์ ์งํ๋๋ ํํ.
JVM ๊ตฌ์ฑ ์์
Oracle JVM Structure ๋ฌธ์
์์ด๋ฅผ ์ํด์ ์ ์ ์ฝ๊ณ ์ถ๋ค..
2.5. ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ
2.5.1. pc ๋ ์ง์คํฐ
2.5.2. ์๋ฐ ๊ฐ์ ๋จธ์ Stack
2.5.3. Heap
2.5.4. Class (Method) ์์ญ
2.5.5. Run-Time Constant Pool
2.5.6. Native Method Stacks
๋ฌธ์ 2.5 ๋ถ๋ถ์ ๋ณด๋ฉด ์ด๋ฐ๊ฒ๋ค์ด ๋ณด์ธ๋ค. ์ ์ญ์ ์ ๋ชจ๋ฅด๊ฒ ์ผ๋ ๊ทธ๋ฆผ์ ์ฐพ์๋ณด์.