๐ JVM์ด๋?
JVM(Java Virtual Machine)์ Java ํ๋ซํผ์ ์ด์์ ๋๋ค. ์ด๋ ํ๋์จ์ด ๋ฐ ์ด์ ์ฒด์ ์ ๋ ๋ฆฝ์ฑ, ์ปดํ์ผ๋ ์ฝ๋์ ์์ ํฌ๊ธฐ, ์ ์ฑ ํ๋ก๊ทธ๋จ์ผ๋ก๋ถํฐ ์ฌ์ฉ์๋ฅผ ๋ณดํธํ๋ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ๊ธฐ์ ์ ๊ตฌ์ฑ ์์ ์ ๋๋ค.
JVM์ ์ถ์ ์ปดํจํ ๋จธ์ ์ ๋๋ค. ์ค์ ์ปดํจํ ๋จธ์ ์ฒ๋ผ ๋ช ๋ น์ด ์ธํธ๊ฐ ์์ผ๋ฉฐ ์คํ ์ ๋ค์ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์กฐ์ํฉ๋๋ค.
JVM์ java ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ํด ์๋ฌด๊ฒ๋ ์์ง ๋ชปํ๋ฉฐ, ํน์ ๋ฐ์ด๋๋ฆฌ ํ์์ธ ํด๋์ค ํ์ผ ํ์๋ง ์๊ณ ์์ต๋๋ค. ํด๋์ค ํ์ผ์๋ java Virtual Machine ๋ช ๋ น์ด(๋๋ ๋ฐ์ดํธ ์ฝ๋)์ ์ฌ๋ณผ ํ ์ด๋ธ ๋ฐ ๊ธฐํ ๋ณด์กฐ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
Q. JVM์ด ์ด๋ป๊ฒ ์ ์ฑ ํ๋ก๊ทธ๋จ์ผ๋ก๋ถํฐ ์ฌ์ฉ์๋ฅผ ๋ณดํธํ๋๊ฐ?
๋ฐ์ดํธ ์ฝ๋ ๊ฒ์ฆ, ํด๋์ค ๋ก๋ ๋ณด์, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ, ๋ค์ดํฐ๋ธ ์ฝ๋ ์ ์ด๋ฅผ ํตํด์ ์ด๋ฃจ์ด์ง๋๋ค.
๋ฐ์ดํธ ์ฝ๋ ๊ฒ์ฆ : Javaํ๋ก๊ทธ๋จ์ ๋ฐ์ดํธ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ๊ฒ์ฆํ์ฌ ์์ ํ ์ฝ๋์ธ์ง ํ์ธํฉ๋๋ค.
ํด๋์ค ๋ก๋ ๋ณด์ : ํด๋์ค ๋ก๋๋ Java์์ ์ฌ์ฉํ๋ ํด๋์ค๋ฅผ ๋ก๋ํ๋ ์ญํ ์ ํ๋ฉฐ, ํด๋์ค ํ์ผ์ ์ถ์ฒ์ ๋ฌด๊ฒฐ์ฑ์ ํ์ธํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ : ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ํ๊ฒฝ์ ์ ๊ณตํ์ฌ, ํ๋ก๊ทธ๋จ์ด ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์กฐ์ํ๊ฑฐ๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ์ ํํฉ๋๋ค.
๋ค์ดํฐ๋ธ ์ฝ๋ ์ ์ด : Java ์ ํ๋ฆฌ์ผ์ด์ ์ด C/C++๋ก ์์ฑ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์คํํ ์ ์๋๋ก JNI๋ฅผ ์ ๊ณตํฉ๋๋ค. JVM์ ๋ค์ดํฐ๋ธ ์ฝ๋ ์ฌ์ฉ ์์๋ ๋ณด์์ ๊ฐํํฉ๋๋ค.
๋ค์ดํฐ๋ธ ์ฝ๋ : ์ด์์ฒด์ ๋ฐ ํ๋์จ์ด์์ ์คํ๋๋ ์ฝ๋๋ก, ์ฃผ๋ก C/C++์ด ์ฌ์ฉ๋ฉ๋๋ค.
Q. ๋ค์ดํฐ๋ธ ์ฝ๋๋ ์ ์ฌ์ฉํ๋๊ฐ?
์ด์์ฒด์ ์ ํ๋์จ์ด์ ๊ธฐ๋ฅ์ ํจ์จ์ ์ผ๋ก ํ์ฉํ๊ธฐ ์ํด์ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ๋ค์ํ ์์ ์ ์ฌ์ฉํฉ๋๋ค.
I/O ์์ (ํ์ผ ๋ฐ ๋๋ ํ ๋ฆฌ ์์ , ๋คํธ์ํฌ ํต์ , ํ์ค ์ ๋ ฅ/์ถ๋ ฅ), ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ(GC), ์ค๋ ๋ ๊ด๋ฆฌ, ํ๋ก์ธ์ค ๊ด๋ฆฌ, ํ๋์จ์ด ์ํธ ์์ฉ, ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐ๋, GUI ๊ทธ๋ํฝ ์ฒ๋ฆฌ, ๋ณด์ ๊ธฐ๋ฅ, ์ํธํ ๋ฐ ํค ๊ด๋ฆฌ, ์๋ฐ ๊ฐ์ ๋จธ์ ์์ฒด ๋์์ ์ฌ์ฉ๋ฉ๋๋ค.
Q. Java์์ ๋ค์ดํฐ๋ธ ์ฝ๋๋ ์ด๋ป๊ฒ ์ฌ์ฉํ๋๊ฐ?
JNI(Java Native Interface)๋ฅผ ํตํด ์ฌ์ฉํ ์ ์์ต๋๋ค. JNI๋ Java ํ๋ก๊ทธ๋จ์ด C, C++ ๋ฑ์ผ๋ก ์์ฑ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ํธ์ถํ๊ฑฐ๋ ๋ค์ดํฐ๋ธ ์ฝ๋์์ Java ๋ฉ์๋๋ฅผ ํธ์ถ ํ ์ ์๋๋ก ์ง์ํ๋ ๋ค์ดํฐ๋ธ ์ฝ๋์ ๋๋ค.
Q. ์ ๋ค์ดํฐ๋ธ ์ฝ๋๊ฐ ๊ธฐ๋ฅ์ ํจ์จ์ ์ผ๋ก ๋ง๋๋๊ฐ?
๋ค์ดํฐ๋ธ ์ฝ๋๋ ์ด์์ฒด์ ์ ํ๋์จ์ด์์ ์ง์ ์คํ๋๋ ๊ธฐ๊ณ์ด ์์ค์ ์ฝ๋์ ๋๋ค.
์ธ์ด์ ์ ์์ค ์ ์ด ๋ฅ๋ ฅ๊ณผ ์ด์์ฒด์ ๋ฐ ํ๋์จ์ด์์ ๋ฐ์ ํ ํตํฉ ๋๋ถ์ด๋ค.
Q. ์ด๋ป๊ฒ ๋ค์ดํฐ๋ธ ์ฝ๋ ์ฌ์ฉ์ ๋ณด์์ ๊ฐํํ๋๊ฐ?
๋ค์ดํฐ๋ธ ํธ์ถ์ JVM์ ๋ณด์ ๊ด๋ฆฌ์์ ์น์ธ์ ๋ฐ์์ ๋ฌด๋จ์ผ๋ก ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
๋ํ ๋ค์ดํฐ๋ธ ์ฝ๋๋ JVM ์ธ๋ถ์์ ์คํ๋๋ฉฐ, JVM์ ๋ฉ๋ชจ๋ฆฌ ํ๊ฒฝ์ ์์์ํฌ ์ ์์ต๋๋ค.
Q. C๋ C++๋ง ๋ค์ดํฐ๋ธ ์ฝ๋์ธ๊ฐ?
C๋ C++์ธ์๋ Rust, Go, ์ด์ ๋ธ๋ฆฌ์ด์ ๊ฐ์ ๋ค๋ฅธ ์ธ์ด๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ JVM ๋์ ๋ฐฉ์
JVM์ ๋์๋ฐฉ์์ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ์ํด ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ก๋ํ๊ณ ํด์ํ๊ฑฐ๋ ์ปดํ์ผํ์ฌ ๊ธฐ๊ณ์ด๋ก ๋ณํํ ๋ค ์คํํ๋ ๊ณผ์ ์ผ๋ก ์งํ๋ฉ๋๋ค.
Q. ๋ฐ์ดํธ ์ฝ๋๋ ๋ฌด์์ด๋ฉฐ, ์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋๊ฐ?
๋ฐ์ดํธ ์ฝ๋๋ ์๋ฐ ์์ค ํ์ผ(.java)๋ฅผ ์ปดํ์ผํ์ฌ ์์ฑ๋๋ ์ค๊ฐ ์ธ์ด์ ๋๋ค.
๋ฐ์ดํธ ์ฝ๋๋ JVM์์ ์คํ๋๊ธฐ ์ํ ์ด์ง ๋ช ๋ น์ด์ ์งํฉ์ ๋๋ค. ์ฌ๋์ด ์ฝ์ ์ ์๊ณ , JVM์ด ์ดํดํ๊ณ ์คํํ ์ ์๋ ๋ช ๋ น์ด๋ค๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
๋ฐ์ดํธ ์ฝ๋ ๋ณํํ, ํ์ธํด๋ณด๊ธฐ
CastingDTO.java
package org.example.part2.chapter3;
import java.io.Serializable;
public class CastingDTO implements Serializable {
private Object object;
public CastingDTO() {
}
public void setObject(Object object) {
this.object = object;
}
public Object getObject() {
return this.object;
}
}
๋จผ์ , CastingDTO.class์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ณด๊ธฐ ์ํด์ ์๋์ ๊ฐ์ด ์ปดํ์ผ์ ํด์ค๋๋ค.
javac CastingDTO.class // ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ณด๊ธฐ ์ํด์ ์ปดํ์ผ ํ๋ ๋ช
๋ น์ด
์ญ์ด์ ๋ธ๋ฌ(javap)๋ก ํด๋น ํด๋์ค๋ฅผ ์คํํ์ฌ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ถ๋ ฅํด์ค๋๋ค.
javap -v -p -s Car.class
ByteCode
Classfile /Users/developer/Downloads/godofjava/godofjava/build/classes/java/main/org/example/part2/chapter3/CastingDTO.class
Last modified 2025. 1. 8.; size 593 bytes
SHA-256 checksum dc5354bc08e763940b823e63cb933e557c8335d103ce41acbb99334b5020c312
Compiled from "CastingDTO.java"
public class org.example.part2.chapter3.CastingDTO implements java.io.Serializable
minor version: 0
major version: 61
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
this_class: #8 // org/example/part2/chapter3/CastingDTO
super_class: #2 // java/lang/Object
interfaces: 1, fields: 1, methods: 3, attributes: 1
Constant pool:
#1 = Methodref #2.#3 // java/lang/Object."<init>":()V
#2 = Class #4 // java/lang/Object
#3 = NameAndType #5:#6 // "<init>":()V
#4 = Utf8 java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Fieldref #8.#9 // org/example/part2/chapter3/CastingDTO.object:Ljava/lang/Object;
#8 = Class #10 // org/example/part2/chapter3/CastingDTO
#9 = NameAndType #11:#12 // object:Ljava/lang/Object;
#10 = Utf8 org/example/part2/chapter3/CastingDTO
#11 = Utf8 object
#12 = Utf8 Ljava/lang/Object;
#13 = Class #14 // java/io/Serializable
#14 = Utf8 java/io/Serializable
#15 = Utf8 Code
#16 = Utf8 LineNumberTable
#17 = Utf8 LocalVariableTable
#18 = Utf8 this
#19 = Utf8 Lorg/example/part2/chapter3/CastingDTO;
#20 = Utf8 setObject
#21 = Utf8 (Ljava/lang/Object;)V
#22 = Utf8 getObject
#23 = Utf8 ()Ljava/lang/Object;
#24 = Utf8 SourceFile
#25 = Utf8 CastingDTO.java
{
private java.lang.Object object;
descriptor: Ljava/lang/Object;
flags: (0x0002) ACC_PRIVATE
public org.example.part2.chapter3.CastingDTO();
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 5: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lorg/example/part2/chapter3/CastingDTO;
public void setObject(java.lang.Object);
descriptor: (Ljava/lang/Object;)V
flags: (0x0001) ACC_PUBLIC
Code:
stack=2, locals=2, args_size=2
0: aload_0
1: aload_1
2: putfield #7 // Field object:Ljava/lang/Object;
5: return
LineNumberTable:
line 10: 0
line 11: 5
LocalVariableTable:
Start Length Slot Name Signature
0 6 0 this Lorg/example/part2/chapter3/CastingDTO;
0 6 1 object Ljava/lang/Object;
public java.lang.Object getObject();
descriptor: ()Ljava/lang/Object;
flags: (0x0001) ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: getfield #7 // Field object:Ljava/lang/Object;
4: areturn
LineNumberTable:
line 14: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lorg/example/part2/chapter3/CastingDTO;
}
SourceFile: "CastingDTO.java"
Q. ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ก๋ํ๋ค๋๊ฒ ๋ฌด์จ ์๋ฏธ์ธ๊ฐ?
JVM์ด ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปดํ์ผ๋ .class ํ์ผ(๋ฐ์ดํธ ์ฝ๋)์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฝ์ด ๋ค์ด๋ ๊ณผ์ ์ ์๋ฏธํฉ๋๋ค.
์ด ๊ณผ์ ์ JVM ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ์ํ ์ฒซ๋ฒ์งธ ๋จ๊ณ๋ก, ํด๋์ค ๋ก๋๊ฐ ๋ด๋นํ๊ฒ ๋ฉ๋๋ค.
JVM์ ๋์ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
(1)JVM์ด ์คํ๋๋ ์๊ฐ, JVM์ OS๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ต๋๋ค.
์ด ๋ฉ๋ชจ๋ฆฌ ์์ญ์ Runtime Data Area๋ฅผ ์๋ฏธํ๋ฉฐ,
Method Area, Heap, Stack, PC Register, NativeMethod Stack์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
Q. ๊ฐ ์์ญ์ ์ ์ฅ๋๋ ๋ฐ์ดํฐ๋ ๋ฌด์์ธ๊ฐ?
Method Area : ํด๋์ค ๋ฉํ๋ฐ์ดํฐ, ์ ์ ๋ณ์, ์์ ํ ์ ์ฅ
Heap: ๊ฐ์ฒด์ ๋ฐฐ์ด ์ ์ฅ
Stack: ๊ฐ ์ค๋ ๋๋ณ๋ก ์์ฑ๋๋ฉฐ, ๋ฉ์๋ ํธ์ถ๊ณผ ๊ด๋ จ๋ ์ง์ญ ๋ณ์, ์ฐ์ฐ ์คํ ์ ์ฅ
PC Register: ํ์ฌ ์คํ ์ค์ธ ๋ช ๋ น์ ์ฃผ์ ์ ์ฅ
Native Method Stack: ๋ค์ดํฐ๋ธ ์ฝ๋(C/C++ ๋ฑ) ์คํ์ ์ฌ์ฉ
(2) ์๋ฐ ์ปดํ์ผ๋ฌ(javac)๊ฐ ์๋ฐ ์์ค ์ฝ๋(.java)๋ฅผ ํ๋ซํผ ๋ ๋ฆฝ์ ์ธ ๋ฐ์ดํธ ์ฝ๋(.class)๋ก ๋ณํํฉ๋๋ค.
์ด ๋จ๊ณ๋ JVM ์ธ๋ถ์์ ์ํ๋๊ณ , ์คํ ์์ ์ JVM ๋์์ ํฌํจ๋์ง ์์ต๋๋ค.
(3) Class Loader๋ ์๋ฐ ํ๋ก๊ทธ๋จ ์คํ ์ค ํ์ํ ํด๋์ค๋ฅผ ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ(Runtime Data Area)์ ๋ก๋ํฉ๋๋ค.
์ด ๋จ๊ณ๋ ํฌ๊ฒ ๋ก๋ฉ(Loading), ๋งํน(Linking), ์ด๊ธฐํ(initialization) ์ธ ๋จ๊ณ๋ก ๋๋๊ฒ ๋ฉ๋๋ค.
๋ก๋ฉ ๋จ๊ณ์์ .class ํ์ผ์ ์ฐพ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํฉ๋๋ค.
๋งํน ๋จ๊ณ์์ ๊ฒ์ฆ(๋ฐ์ดํธ ์ฝ๋ JVM ๋ช ์ธ์ ๋ง๋์ง ๊ฒ์ฆ), ์ค๋น(์ ์ ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ ํ ๋น), ํด๊ฒฐ(์์ ํ์ ์ฌ๋ณผ๋ฆญ ๋ ํผ๋ฐ์ค๋ฅผ ์ค์ ๋ชจ๋ฆฌ ์ฃผ์๋ก ๋ณํ) ํฉ๋๋ค.
์ด๊ธฐํ ๋จ๊ณ์์๋ ์ ์ ๋ณ์ ์ด๊ธฐํ ๋ฐ ํด๋์ค ์ด๊ธฐํ ๋ธ๋ก์ ์คํํฉ๋๋ค.
Q. ๋์ ๋ก๋ฉ์ ๋ฌด์์ด๊ณ , ์ ์ฌ์ฉํ๋๊ฐ?
๋์ ๋ก๋ฉ์ ์๋ฐ ํ๋ก๊ทธ๋จ ์คํ ์ ํ์ํ ์์ ์๋ง ํด๋์ค ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ๋งํฉ๋๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด, ํ์ํ ํด๋์ค๋ง ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ค ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ๋๊ณ , ํ์ํ ํด๋์ค๋ง ๋ก๋ํ๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ด ๋จ์ถ๋์ด ์ฑ๋ฅ ์ต์ ํ๊ฐ ๋๊ณ , ์คํ ์ค์ ์๋ก์ด ํด๋์ค๋ฅผ ๋ก๋ํ๊ฑฐ๋ ํ๋ฌ๊ทธ์ธ, ํ์ฅ ๋ชจ๋ ๋ฑ์ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ฑฐ๋ ์คํ ์ค ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ํด๋์ค๋ฅผ ๋ก๋ํ๊ฑฐ๋ ๋ค๋ฅธ ๋์์ ์ํํ๋๋ก ์ฝ๋๋ฅผ ์ ์ฐํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
Java Reflection API๋ ๋์ ๋ก๋ฉ์ ์ฌ์ฉํ๋ ๋ํ์ ์ธ ์ฌ๋ก์ ๋๋ค.
๋ฐํ์์ ํด๋์ค๋ฅผ ๋์ ์ผ๋ก ๋ก๋ํ๊ณ , ํด๋์ค์ ๋ฉ์๋, ํ๋, ์์ฑ์ ๋ฑ์ ์ ๊ทผํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปดํ์ผ ์์ ์ ํด๋์ค์ ๊ตฌ์กฐ๋ฅผ ์์ง ๋ชปํ๋๋ผ๋, ์คํ ์์ ์ ๋์ ์ผ๋ก ํด๋น ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
(4) Execution Engine์ด Runtime Data Area์ ๋ก๋๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
์คํ ๋ฐฉ์์ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์, JIT(Just-In-Time) ์ปดํ์ผ๋ฌ ๋ฐฉ์์ด ์กด์ฌํฉ๋๋ค.
์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ํ ์ค์ฉ ํด์ํ์ฌ ์คํํ๋ ๋ฐฉ์์ด๊ณ , JIT ์ปดํ์ผ๋ฌ ๋ฐฉ์์ ๋ฐ๋ณต ์คํ๋๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํํ์ฌ ์บ์ฑ์ ํ๊ธฐ ๋๋ฌธ์, ์ฑ๋ฅ ์ต์ ํ๊ฐ ๋๊ณ ์ธํฐํ๋ฆฌํฐ๋ณด๋ค ๋ ๋น ๋ฅธ ๋ฐฉ์์ ๋๋ค.
(5) ์ด ๊ณผ์ ์์ Execution Engine์ ์ํด Garbage Collector์ Thread ๋๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.
Garbage Collector๋ JVM ๋ด๋ถ์์ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ํ ์์ญ์ ๊ด๋ฆฌํ๋ฉฐ, ๋ ์ด์ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
Q. ์ Thread ๋๊ธฐํ๋ฅผ ํด์ฃผ๋๊ฐ?
Thread ๋๊ธฐํ๊ฐ ํ์ํ ์ด์ ๋ ๋ฉํฐ์ค๋ ๋ฉ ํ๊ฒฝ์์ ๊ณต์ ์์์ ๋์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ์ถฉ๋์ด๋ ๊ฒฝ์ ์ํ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
synchronized ํค์๋์ ๊ฐ์ ๋๊ธฐํ ๋งค์ปค๋์ฆ์ด (5)๋ฒ ๊ณผ์ ์์ ๋์ํ๊ฒ ๋ฉ๋๋ค.
synchronized : ๋ฉ์๋๋ ์ฝ๋ ๋ธ๋ก์ ๋ฝ(Lock)์ ๊ฑธ์ด ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผํ๋๋ก ์ ํํฉ๋๋ค.
Q. ๊ฒฝ์ ์ํ๋ ๋ฌด์์ธ๊ฐ?
์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ณต์ ์์์ ๋์์ ์ฝ๊ฑฐ๋ ์์ ํ๋ ค๊ณ ํ ๋, ์คํ ์์์ ๋ฐ๋ผ ์๊ธฐ์น ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๋ ์ํ๋ฅผ ๋งํฉ๋๋ค.
ex) ๋ ์ค๋ ๋๊ฐ ๊ฐ์ ๋ณ์์ ๊ฐ์ ๋์์ ์ฆ๊ฐ์ํค๋ ์์ ์ ์ํํ๋ ๊ฒฝ์ฐ
๐ JVM ๊ตฌ์กฐ
JVM์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
ํด๋์ค ๋ก๋(Class Loader)
์คํ ์์ง(Execution Engine)
- ์ธํฐํ๋ฆฌํฐ
- JIT ์ปดํ์ผ๋ฌ
- ๊ฐ๋น์ง ์ฝ๋ ํฐ
๋ฐํ์ ๋ฐ์ดํฐ ์์ญ(Runtime Data Area)
- ๋ฉ์๋ ์์ญ
- ํ ์์ญ
- PC Register
- ์คํ ์์ญ
- ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ
(์๋ 2๊ฐ๋ ์ด๋ฏธ์ง๋ก ๋ํ๋ด์ง ์์๋ค.)
JNI - ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์ธํฐํ์ด์ค (Native Method Interface)
๋ค์ดํฐ๋ธ ๋ฉ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (Native Method Library)
Q. PC Register๋ ๋ฌด์์ด๊ณ , ์ ์ฌ์ฉํ๋๊ฐ?
PC Register๋ JVM์ Runtime Data Area์์ ๊ฐ ์ค๋ ๋๊ฐ ์คํํ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก, ํ์ฌ ์ค๋ ๋๊ฐ ์ด๋ค ๋ช ๋ น์ด๋ฅผ ์คํํ๊ณ ์๋์ง๋ฅผ ์ถ์ ํ๊ธฐ ์ํด, ๋ช ๋ น์ด์ ์ฃผ์๋ ์คํ ์ค์ธ ๋ช ๋ น์ด์ ์์น๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ํ ์ค๋ ๋ ๋ณ๋ก ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํฉ๋๋ค.
Q. ๋ช ๋ น์ด ์คํ ํ๋ฆ์ ์ ์ดํ๋ค๋๊ฑด ์ด๋ค ์๋ฏธ์ธ๊ฐ?
JVM์ด ํ๋ก๊ทธ๋จ ์คํ ์ค ๋ช ๋ น์ด์ ์์์ ์์น๋ฅผ ์ ํํ ๊ด๋ฆฌํ์ฌ, ํ๋ก๊ทธ๋จ์ด ์ฌ๋ฐ๋ฅธ ๋ ผ๋ฆฌ์ ํ๋ฆ์ผ๋ก ์คํ๋ ์ ์๋๋ก ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ํด๋์ค ๋ก๋(Class Loader)
Class Loader๋ JVM์ ๊ตฌ์ฑ ์์ ์ค ํ๋๋ก, ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ํด๋์ค๋ฅผ ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ ์ญํ ์ ํฉ๋๋ค.
์๋ฐ์ ๋ฐํ์ ๋์ ๋ก๋ฉ์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ํ๋ก๊ทธ๋จ ์คํ ์ค ํ์ํ ํด๋์ค๋ฅผ ์ ์ฌํ๊ณ ๊ด๋ฆฌํฉ๋๋ค.
Java์๋ ๊ธฐ๋ณธ์ ์ผ๋ก 3๊ฐ์ง ์ฃผ์ ํด๋์ค ๋ก๋์ธ Bootstrap ClassLoader, Extension ClassLoader, Application ClassLoader๊ฐ
์์ต๋๋ค.
Bootstrap ClassLoader
JVM์ ๋ด์ฅ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํด๋์ค ๋ก๋์ ๋๋ค. ์ญํ ๋ก๋ Java์ ํต์ฌ ํด๋์ค๋ค์ ๋ก๋ํฉ๋๋ค.
์์๋ก java.lang, java.util, java.io ๊ฐ์ Java ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด์ ํด๋น๋ฉ๋๋ค. Java 8์ดํ์์๋ rt.jar๊ฐ JDK 9 ์ด์์์๋ ๋ชจ๋ ์์คํ (java.base)์ ํฌํจ๋ ํด๋์ค๋ฅผ ๋ก๋ํฉ๋๋ค.
๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์์ฑ๋์ด ์๊ณ , C์ C++๋ก ๊ตฌํ๋์ด ์์ต๋๋ค.
ํด๋์ค ๋ก๋ ์ฒด๊ณ์ ์ต์์์ ์กด์ฌํ๋ฉฐ, ๋ค๋ฅธ ํด๋์ค ๋ก๋์ ์ํด ํ์ฅ๋์ง ์์ต๋๋ค.
ํด๋์ค ๋ก๋ ๊ณ์ธต ๊ตฌ์กฐ์ ์์์ ์ด๋ฏ๋ก, ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ๊ทผํ๊ฑฐ๋ ์ ์ดํ ์ ์์ต๋๋ค.
Extension ClassLoader
ํ์ฅ ํด๋์ค ๋ก๋๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ, ๋ถํธ์คํธ๋ฉ ํด๋์ค ๋ก๋์ ๋ค์ ๋จ๊ณ์ ์์นํฉ๋๋ค.
JAVA_HOME/lib/ext ๋๋ ํ ๋ฆฌ๋ java.ext.dirs ์์คํ ์์ฑ์ ์ ์๋ ๊ฒฝ๋ก์ ์๋ ํ์ฅ ํด๋์ค๋ฅผ ๋ก๋ํฉ๋๋ค.
์ฃผ๋ก ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(JARํ์ผ)๋ค์ ๋ก๋ํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
๊ฐ๋ฐ์๊ฐ ํ์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ปค์คํฐ๋ง์ด์ง ํ ์ ์์ต๋๋ค.
Application Class Loader
๊ฐ๋ฐ์๊ฐ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๊ณ ์ต์ํ ํด๋์ค ๋ก๋์ ๋๋ค.
์์ฉ ํ๋ก๊ทธ๋จ์ ํด๋์ค ํจ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ํด๋์ค ํ์ผ์ ๋ก๋ํฉ๋๋ค.
๊ฐ๋ฐ์๊ฐ ์์ฑํ ์ฌ์ฉ์ ์ ์ ํด๋์ค, ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ธ๋ถ JAR ํ์ผ ๋ฑ์ ๋ก๋ํฉ๋๋ค.
๊ฐ์ฅ ํ์์ ์์นํ๋ฉฐ, ํด๋์ค ๋ก๋ ๊ณ์ธต ๊ตฌ์กฐ์ ๋ง์ง๋ง ๋จ๊ณ๋ก ๋์ํฉ๋๋ค.
ํด๋์ค ๋ก๋ ๊ณ์ธต ๊ตฌ์กฐ
ํด๋์ค ๋ก๋๋ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋ถ๋ชจ-์์ ๊ด๊ณ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ด ๊ตฌ์กฐ๋ ์์ ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค.
(1) ํด๋์ค ๋ก๋๋ ๋จผ์ ๋ถ๋ชจ ํด๋์ค ๋ก๋์๊ฒ ํด๋์ค๋ฅผ ๋ก๋ํ ์ ์๋์ง ์์ฒญํฉ๋๋ค.
(2) ๋ถ๋ชจ๊ฐ ํด๋์ค๋ฅผ ๋ก๋ํ์ง ๋ชปํ ๊ฒฝ์ฐ์๋ง ์์ ์ด ํด๋์ค๋ฅผ ๋ก๋ํฉ๋๋ค.
๊ณ์ธต ๊ตฌ์กฐ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Bootstrap ClassLoader → Extension ClassLoader → Application ClassLoader
์ฌ์ฉ์ ์ ์ ํด๋์ค ๋ก๋
ClassLoader๋ฅผ ํ์์ ๋ฐ๋ผ์ ํ์ฅํ์ฌ ์ฌ์ฉ์ ์ ์ ํด๋์ค ๋ก๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
ํน์ํ ๋ฐฉ์์ผ๋ก ํด๋์ค ๋ก๋ ์ ์ ์ฉํฉ๋๋ค.
์์๋ก๋ ๋คํธ์ํฌ ๊ฒฝ๋ก์์ ํด๋์ค ๋ก๋, ์ํธํ๋ ํด๋์ค ํ์ผ ๋ก๋๊ฐ ์์ต๋๋ค.
ํด๋์ค ํ์ผ ๋ก๋ฉ ์์๋ 3๋จ๊ณ๋ก ๋๋ฉ๋๋ค.
Loading → Linking → Initialization
(1) ๋ก๋(Loading)
ํด๋์ค ํ์ผ(.class)์ ์ฐพ์ Method Area์ ๋ก๋ํฉ๋๋ค.
(2) ๋งํฌ(LInking)
ํด๋์ค ๋ก๋ ํ, JVM์ด ํด๋์ค๋ฅผ ์คํํ ์ ์๋๋ก ์ค๋นํ๋ ๊ณผ์ ์ ๋๋ค.
- ๊ฒ์ฆ(Verification) - ๋ฐ์ดํธ์ฝ๋๊ฐ JVM ๋ช ์ธ์ ๋ง๋์ง ๊ฒ์ฆํฉ๋๋ค.
- ์ค๋น(Preparation) - ํด๋์ค์ ์ ์ ๋ณ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋นํ๊ณ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ ๊ณผ์ ์ ๋๋ค.
- ํด๊ฒฐ(Resolution) - ์์ ํ ๋ด์ ์ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ฅผ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ก ๋ณํํฉ๋๋ค.
(3) ์ด๊ธฐํ(Initialization)
์ ์ ๋ณ์ ์ด๊ธฐํ ๋ฐ ํด๋์ค ์ด๊ธฐํ ๋ธ๋ก์ ์คํํฉ๋๋ค.
Q. ์ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ ๋ฌด์์ด๊ณ , ์ ์ฌ์ฉํ๋๊ฐ?
์ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ JVM์์ ๋ฐ์ดํธ์ฝ๋ ๋ด์์ ํด๋์ค, ๋ฉ์๋, ํ๋, ์ธํฐํ์ด์ค ๋ฑ์ ์ฐธ์กฐํ ๋ ๋ฌธ์์ด ํํ๋ก ์ ์ฅ๋ ์ฐธ์กฐ ๋ฐฉ์์ ์๋ฏธํฉ๋๋ค. ์ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ํ๋์จ์ด๋ ์ด์์ฒด์ ์ ์ข ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฌ์ฉํ๋ ๋์ , ๋ฌธ์์ด ํํ๋ก ์ฐธ์กฐ๋ฅผ ์ ์ฅํด์ ํ๋ซํผ ๋ ๋ฆฝ์ฑ์ ๋ณด์ฅํ๊ณ , ์คํ ์์ ์ ํ์ํ ํด๋์ค์ ๋ฉ์๋๋ฅผ ๋์ ์ผ๋ก ๋ก๋ํ ์ ์์ต๋๋ค.
์์) JDBC ๋๋ผ์ด๋ฒ๋ฅผ ๋์ ์ผ๋ก ๋ก๋ํ๋ ๊ฒฝ์ฐ
Class.forName()
๋์ (Dynamic)์ด๊ณ ๋ฐํ์์ ํด๋์ค ์ด๋ฆ(๋ฌธ์์ด)์ ์ฌ์ฉํด ํด๋น ํด๋์ค๋ฅผ JVM์ผ๋ก ๋ก๋ํฉ๋๋ค.
Class.forName("com.mysql.cj.jdbc.Driver");
// "com.mysql.cj.jdbc.Driver" : ์ฌ๋ณผ๋ฆญ ์ฐธใ
์คํ ์์ง(Execution Engine)
๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ค์ ์คํ ๊ฐ๋ฅํ ํํ๋ก ๋ณํํ๊ณ ์คํํ๋ ์ญํ ์ ๋ด๋นํฉ๋๋ค. ์ฆ, ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ค์ ๋ก JVM ๋ด๋ถ์์ ๊ธฐ๊ณ๊ฐ ์คํํ ์ ์๋ ํํ๋ก ๋ณ๊ฒฝํด์ค๋๋ค.
์คํ ์์ง์ ์ธํฐํ๋ฆฌํฐ์ JIT ์ปดํ์ผ๋ฌ ๋ ๋ฐฉ์์ ํฉ์ณ์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
์ธํฐํ๋ฆฌํฐ(Interpreter)
๋ฐ์ดํธ ์ฝ๋ ๋ช ๋ น์ด๋ฅผ ํ๋์ฉ ์ฝ์ด์ ํด์ํ๊ณ ๋ฐ๋ก ์คํํฉ๋๋ค.
JIT ์ปดํ์ผ๋ฌ(Just-In-Time Complier)
๋ฐ์ดํธ์ฝ๋ ์ ์ฒด๋ฅผ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ปดํ์ผํ๊ณ , ์ดํ์ ์บ์ฑ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค.
๊ธฐ์กด์ ๋ฐ๋ณต๋ ๋ถ๋ถ์ด๋๋ผ๋ ์ค๋ณต ์ธํฐํ๋ฆฌํ ํ๋ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ ์ฝ์ ์ ๋ณด์ํด์ค๋๋ค.
Q. ์ ๋ ๋ฐฉ์์ ํฉ์ณ์ ์ฌ์ฉํ๋๊ฐ?
JIT ์ปดํ์ผ๋ฌ๋ ๋ฐ์ดํธ์ฝ๋ ์ ์ฒด๋ฅผ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋ณํํด์ผ ํ๋๋ฐ, ๋ณํ ๋น์ฉ์ด ๋๋ฌด ํฝ๋๋ค.
๋ฐ๋ผ์, JVM์ ์ธํฐํ๋ฆฌํฐ๋ฅผ ๋จผ์ ์ฌ์ฉํด์ ๋น ๋ฅด๊ฒ ์ฝ๋๋ฅผ ์คํํ๊ณ , ๋ฐ๋ณต ์คํ๋๊ฑฐ๋ ์ค์ํ ์ฝ๋๊ฐ ๊ฐ์ง๋๋ฉด JIT ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋น ๋ฅธ ์ด๊ธฐ ์คํ๊ณผ ๋์ ์ฅ๊ธฐ ์คํ ์ฑ๋ฅ์ ๋ชจ๋ ๋ง์กฑ์ํฌ ์ ์๊ธฐ ์ํด์ ๋ ๋ฐฉ์์ ํผํฉํ์ฌ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
Q. JVM์ ์ด๋ป๊ฒ ๋ฐ๋ณต ์คํ๋๋ ์ฝ๋๋ฅผ ๊ฐ์งํ๋๊ฐ?
JVM ๋ด๋ถ์ ์ผ๋ก ์ฝ๋ ์คํ์ ํ๋กํ์ผ๋งํ์ฌ ํซ์คํ์ ํ์งํ๊ณ JIT ์ปดํ์ผ์ ํฉ๋๋ค.
์ฌ๊ธฐ์ ๋งํ ํซ์คํ์ ๋ฐ๋ณต์ ์ผ๋ก ์คํ๋๊ฑฐ๋, ์คํ ๋น๋๊ฐ ๋์ ์ฝ๋ ์์ญ์ ์๋ฏธํฉ๋๋ค.
๊ฐ๋น์ง ์ปฌ๋ ํฐ(Garbage Collector)
JVM์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ์ฌ์ฉํด์ Heap ๋ฉ๋ชจ๋ฆฌ ์์ญ์์ ๋๋ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํ์ํฉ๋๋ค.
๊ฐ๋ฐ์๊ฐ ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํด์ฃผ์ง ์์๋ ๋๋ฏ๋ก, ๋น์ฆ๋์ค ๋ก์ง์ ๋์ฑ ์ง์คํ ์ ์์ต๋๋ค.
์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ฐธ์กฐ๊ฐ ๋์ง ์๋ ๊ฒฝ์ฐ์๋ Garbage Collector๊ฐ ์๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํ์๋ฅผ ํ๊ฒ ๋ฉ๋๋ค.
๋ฐํ์ ๋ฐ์ดํฐ ์์ญ(Runtime Data Area)
JVM์ด ํ๋ก๊ทธ๋จ ์คํ ์ค ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ก ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ๋, ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ค์ ์ ์ฅํ๋ ์์ญ์ ๋๋ค.
๋ฉ์๋ ์์ญ(Method Area)
Runtime Data Area ๋ด์์ ํด๋์ค ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋๋ค.
ํด๋์ค๊ฐ JVM์ ๋ก๋๋๋ฉด, ํด๋์ค์ ๋ฉํ๋ฐ์ดํฐ(ํด๋์ค ์ด๋ฆ, ๋ฉ์๋ ์ ๋ณด, ํ๋ ์ ๋ณด ๋ฑ)์ ์ ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๊ณ , ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ์ฌ ์ฌ์ฉํฉ๋๋ค.
JVM์ด ๋์ํ๊ณ ํด๋์ค๊ฐ ๋ก๋๋ ๋ ์ ์ฌ๋๊ณ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ ์ง์ ๊น์ง ์ ์ฅ๋ฉ๋๋ค.
Q. ํด๋์ค ๋ฉํ๋ฐ์ดํฐ๋ ์ด๋ค๊ฐ์ด ์กด์ฌํ๋๊ฐ?
ํด๋์ค ์ ์ ์ ๋ณด : ํด๋์ค์ ์ด๋ฆ, ์ ๊ทผ ์ ์ด์, ํจํค์ง ์ ๋ณด, ํด๋์ค์ ๋ถ๋ชจ ํด๋์ค ์ ๋ณด, ํด๋์ค๊ฐ ๊ตฌํํ๋ ์ธํฐํ์ด์ค ์ ๋ณด๊ฐ ์กด์ฌํฉ๋๋ค.
ํ๋ ์ ๋ณด : ์ธ์คํด์ค ๋ณ์ ์ ๋ณด(๊ฐ ํ๋ ์ด๋ฆ, ๋ฐ์ดํฐ ํ์ , ์ ๊ทผ ์ ์ด์)์ ์ ์ ๋ณ์ ์ ๋ณด๊ฐ ์กด์ฌํฉ๋๋ค.
๋ฉ์๋ ์ ๋ณด : ๋ฉ์๋ ์ด๋ฆ, ๋ฐํ ํ์ , ๋งค๊ฐ๋ณ์ ํ์ , ์ ๊ทผ ์ ์ด์ ์ ๋ณด๊ฐ ์กด์ฌํฉ๋๋ค.
ํ์ ์ ๋ณด : Class์ธ์ง Interface์ธ์ง ์ฌ๋ถ ์ ์ฅ, Type์ ์์ฑ, Super Class์ ์ด๋ฆ์ด ์กด์ฌํฉ๋๋ค.
Q. Runtime Constant Pool์ ๋ฌด์์ด๊ณ , ์ ์ฌ์ฉํ๋๊ฐ?
๊ฐ ํด๋์ค์ ์ธํฐํ์ด์ค๋ง๋ค ๋ณ๋์ constant pool ํ ์ด๋ธ์ด ์กด์ฌํ๋ฉฐ, ํด๋์ค ์์ฑ ์ ์ฐธ์กฐํด์ผ ํ ์ ๋ณด(ํด๋์ค์ ์์, ์ฌ๋ณผ๋ฆญ ์ฐธ์กฐ)๋ฅผ ์์ ํํ๋ก ๊ฐ์ง๊ณ ์๋ ์์ญ์ ๋๋ค. JVM์ Constant Pool์ ํตํด์ ํด๋น ๋ฉ์๋๋ ํ๋์ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฃผ์๋ฅผ ์ฐพ์ ์ฐธ์กฐํฉ๋๋ค.
์์ ์๋ฃํ์ ์ ์ฅํ์ฌ ์ฐธ์กฐํ๊ณ ์ค๋ณต์ ๋ง๋ ์ญํ ๋ ์ํํฉ๋๋ค.
Q. RunTime Constant Pool์ ํตํด์ ์ด๋ป๊ฒ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฃผ์๋ฅผ ์ฐพ์ ์ ์๋๊ฐ?
RunTime Constant Pool์ ์ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๊ณ , ์ด๋ฅผ ํตํด ๋ฉ์๋๋ ํ๋์ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐพ์ต๋๋ค.
์ถ๊ฐ๋ก ์์์ผ ํ ์
Runtime Constant Pool์ด ํด๋์ค๋ณ๋ก ๊ด๋ฆฌ๋๋ ๊ฒ์ ๋ง์ง๋ง, Method Area์์ ๊ด๋ฆฌ๊ฐ ๋ฉ๋๋ค.
Q. ์ค๋ณต์ ๋ง๋ ์ญํ ์ด ๋ฌด์์ ์๋ฏธํ๋๊ฐ?
๋์ผํ ์์๋ฅผ ์ฌ๋ฌ ๋ฒ ์ ์ฅํ์ง ์๊ณ , ํ ๋ฒ๋ง ์ ์ฅํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ํ ์์ญ(Heap Area)
ํ ์์ญ์ ๋ชจ๋ ์ฐ๋ ๋๊ฐ ๊ณต์ ํ๋ฉฐ, ๋ฐํ์ ์ ๋์ ์ผ๋ก ์์ฑ๋๋ ๊ฐ์ฒด์ ๋ฐฐ์ด ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
์ด ์์ญ์๋ ํด๋์ค์ ์ธ์คํด์ค, ๋ฐฐ์ด ๋ฑ Reference Type์ด ์ ์ฅ ๋ฉ๋๋ค.
ํ ๊ฐ์ฒด์ ์ฐธ์กฐ ์ฃผ์๋ JVM ์คํ์ ์ ์ฅ๋ ๋ณ์๋ฅผ ํตํด ๊ด๋ฆฌ๋ฉ๋๋ค. ๋ฐ๋ผ์, ํ ๊ฐ์ฒด๋ ์คํ์ ์ฐธ์กฐ ์ฃผ์๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผ ๋ฐ ์กฐ์์ด ๊ฐ๋ฅํฉ๋๋ค.
Q. ํ ์์ญ์ ์ ์ฅ๋ ๊ฐ์ฒด๋ ์ธ์ ๊น์ง ์ฌ์ฉ๊ฐ๋ฅํ๊ฐ?
ํ๋ก๊ทธ๋จ ์คํ ์ค ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ๋๊ฑฐ๋ ์ฌ์ฉ๋๋ ๋์ ์ ์ง๋๋ฉฐ, ์ฐธ์กฐ๊ฐ ๋์ง ์๋ ๊ฐ์ฒด๋ Garbage Collector์ ์ํด ์๋์ผ๋ก ์ ๋ฆฌ๋ฉ๋๋ค.
ํ ๋ฉ๋ชจ๋ฆฌ๋ 5๊ฐ์ง ์์ญ์ผ๋ก ๋๋์ด์ ธ ์์ต๋๋ค. ํฌ๊ฒ Young Generation๊ณผ Old Generation ์์ญ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
YongGeneration์ ์๋ช ์ฃผ๊ธฐ๊ฐ ์งง์ ๊ฐ์ฒด๋ฅผ GC ๋์์ผ๋ก ํ๋ ์์ญ์ด๊ณ , Old Generation์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๊ธด ๊ฐ์ฒด๋ฅผ GC ๋์์ผ๋ก ํ๋ ์์ญ์ด๋ค. Young Generation์์ ๋๊น์ง ์ด์๋จ์ ๊ฐ์ฒด๊ฐ Old Generation์ผ๋ก ์ด๋ํ๊ฒ ๋๋ค.
Eden ์์ญ
์๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ฅ ๋จผ์ ์ ์ฅ๋๋ ๊ณต๊ฐ์ ๋๋ค. ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ์๋ช ์ด ์งง์ ์ด ๋จ๊ณ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
Survivor ์์ญ
Eden ์์ญ์์ GC(Garbage Collection) ํ ์ด์๋์ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ ๋๋ค.
ํฌ๊ฒ S0(Survivor 0)์ S1(Survivor 1) ๋๊ฐ์ง ์์ญ์ผ๋ก ๋๋ฉ๋๋ค. ๋ ๊ฐ์ Survivor ์์ญ์ ๋ฒ๊ฐ์ ๊ฐ๋ฉฐ ์ฌ์ฉ๋ฉ๋๋ค.
Q.2๊ฐ์ง์ Survivor ์์ญ์ ์ด๋ป๊ฒ ๋์ํ๋๊ฐ?
(1) Eden → Survivor(S0)
Eden ์์ญ์์ ๊ฐ์ฒด๊ฐ Minor GC๋ฅผ ํต๊ณผํ๋ฉด, ์ด์๋จ์ ๊ฐ์ฒด๋ Survivor ์์ญ์ผ๋ก ์ด๋ํฉ๋๋ค. ์ด๋, Survivor ๊ณต๊ฐ ์ค ํ๋๋ง ํ์ฌ ํ์ฑํ๋ ์์ญ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
(2) S0 → S1 or S1 → S0
๋ค์ Minor GC๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ, ํ์ฌ ํ์ฑํ๋ Survivor ์์ญ(S0)์์ ์ด์๋์ ๊ฐ์ฒด๋ ๋ค๋ฅธ Survivor ์์ญ(S1)์ผ๋ก ์ด๋ํฉ๋๋ค.
๋ ๊ฐ์ ์์ญ์ From ์์ญ๊ณผ To ์์ญ์ผ๋ก ์ํฉ์ ๋ฐ๋ผ ๋์ํฉ๋๋ค.
(3) Survivor → Old
Survivor ์์ญ์์ GC๋ฅผ ์ฌ๋ฌ ๋ฒ ํต๊ณผํ ๊ฐ์ฒด๋ Old Generation์ผ๋ก ์ด๋ํฉ๋๋ค.
์ด๋ ํ์๋ ๊ฐ์ฒด์ ์์กด ํ์์ ๋ฐ๋ผ์ ๊ฒฐ์ ํ๊ฒ ๋ฉ๋๋ค.
Old ์์ญ
YG(Young Generation)์ Eden ๋ฐ Survivor ์์ญ์์ ์ค๋ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ ๋๋ค.
ํ๋ง๋๋ก ์๋ช ์ด ๊ธด ๊ฐ์ฒด๊ฐ ์ฌ๊ธฐ ์ ์ฅ๋ฉ๋๋ค. ์๋ช ์ด ๊ธธ๊ธฐ ๋๋ฌธ์ Major GC ๋ฐ์ ๋น๋๊ฐ ๋ฎ์ต๋๋ค.
YG์ ๋นํด ํฌ๊ธฐ๊ฐ ํฌ๊ณ , Major GC ์ ๋ ๋ง์ ์๊ฐ์ด ์์๋ฉ๋๋ค.
Permanent ์์ญ
Java 8๋ฒ์ ์ด์๋ถํฐ๋ Metaspace๋ก ๋ถ๋ฆฝ๋๋ค.
์ด๋ฆ ์ฒ๋ผ ํด๋์ค์ ์ด๋ฆ, ๋ฉ์๋, ํ๋, ์ธํฐํ์ด์ค ์ ๋ณด์ ๊ฐ์ ํด๋์ค์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ ๋๋ค.
Java 7 ์ดํ์์๋ Permanent ์์ญ์ด ํ ์์ญ์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋์์ง๋ง, Java 8 ์ดํ์๋ Permanent์ด ์ ๊ฑฐ๋๊ณ Metaspace๊ฐ ๋ค์ดํฐ๋ธ ๋ฉ๋ชจ๋ฆฌ๋ก ์ด๋ํ๊ธฐ ๋๋ฌธ์, ๋ ์ด์ ํ ์์ญ์ ์ผ๋ถ๊ฐ ์๋๋๋ค.
๋ค์ดํฐ๋ธ ๋ฉ๋ชจ๋ฆฌ๋ ์ด์์ฒด์ ๋ก๋ถํฐ ์ง์ ํ ๋น๋ฐ์ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ์ ๋๋ค.
Q. Minor GC์ Major GC๋ ๊ฐ๊ฐ ๋ฌด์์ธ๊ฐ?
Minor GC๋ Yong Generation์์ ๋ฐ์ํ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด๊ณ , ์ฃผ๋ก Eden ์์ญ์์ ์ํ๋ฉ๋๋ค.
์ํ ์๋๊ฐ ๋น ๋ฅด๊ณ , ๊ฐ์ฒด๊ฐ ์์ฃผ ์์ฑ๋๊ณ ์ ๊ฑฐ๋๋ฏ๋ก ๋น๋ฒํ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. Stop-the-world(STW) ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง๋ง, ์๊ฐ์ด ์งง์์ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ์ฃผ์ง๋ ์์ต๋๋ค.
Major GC๋ Old Generation์์ ๋ฐ์ํ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋๋ค.
YG๋ณด๋ค ์๋ช ์ด ๊ธธ๊ธฐ ๋๋ฌธ์ ์ํ์ ๋ ๋น๋ฒํฉ๋๋ค. OG๋ YG๋ณด๋ค ํฌ๊ธฐ๊ฐ ํฌ๊ณ , ๊ฐ์ฒด๊ฐ ์ค๋ ์ด์๋จ์ ๋ณต์ก์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ Minor GC์ ๋นํด ์๋๊ฐ ๋๋ฆฝ๋๋ค. ๋๋ถ๋ถ์ ์ด๋ฒคํธ์ Stop-the-world ์ด๋ฒคํธ๋ฅผ ๋๋ฐํ๊ธฐ ๋๋ฌธ์, ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฐ ํ๊ฒฉ์ ์ค ์ ์์ต๋๋ค.
Major GC๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ YG์ GC๋ ํจ๊ป ์ํ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ Full GC๋ผ๊ณ ๋ ๋ถ๋ฆ ๋๋ค.
Q. Full GC๋?
Full GC๋ JVM์ ์ ์ฒด ํ ์์ญ(Young Generation + Old Generation + Metaspace)์ ๋์์ผ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
Major GC๊ฐ ๋ฐ์ํ ๋, ํ์์ ๋ฐ๋ผ Young Generation์ GC(Minor GC)๋ ๋์์ ์ํ๋ฉ๋๋ค ์ด ๋๋ฌธ์ Major GC์ Minor GC๊ฐ ๋์์ ์ํ๋๋ ๊ฒฝ์ฐ๋ฅผ Full GC๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์คํ ์์ญ(Stack Area)
์คํ ์์ญ์ ๊ธฐ๋ณธ ์๋ฃํ ์์ฑ์ ์ ์ฅํ๋ ๊ณต๊ฐ์ผ๋ก, ์ง์ญ ๋ณ์์ ๋ฉ์๋ ํธ์ถ ์ ๋ณด(ํ๋ ์)๊ฐ ์ ์ฅ๋๋ค. ๋ฉ์๋ ํธ์ถ์ด ๋๋๋ ๊ฒฝ์ฐ์ ํด๋น ์คํ ํ๋ ์์ ์ ๊ฑฐ๋ฉ๋๋ค. ์ค๋ ๋๋ณ๋ก ๋ถ์ฌ๋๋ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด๊ธฐ๋ ํฉ๋๋ค. ์คํ์ ์ฌ์ด์ฆ๋ ๋ฐํ์์ ์ง์ ๋๊ธฐ ๋๋ฌธ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค. ๊ณ ์ ๋ ํฌ๊ธฐ์ ์คํ์์ ํ๋ก๊ทธ๋จ ์คํ์ ์คํ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ StackOverFlowError๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
LIFO ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ , ๋ฉ์๋ ํธ์ถ ์๋ง๋ค ๊ฐ๊ฐ ์คํ ํ๋ ์์ด ์์ฑ๋๊ณ ๊ทธ ๋ฉ์๋ ์์์ ์ฌ์ฉ๋๋ ๊ฐ๋ค์ ์ ์ฅํ๊ณ , ํธ์ถ๋ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์, ์ง์ญ๋ณ์, ๋ฆฌํด ๊ฐ ๋ฐ ์ฐ์ฐ ์ ์๊ธฐ๋ ๊ฐ๋ค์ ์์๋ก ์ ์ฅํด์ค๋ค. ๋ฉ์๋๊ฐ ์ข ๋ฃ๋๋ฉด ํ๋ ์์ ์ญ์ ๋ฉ๋๋ค.
๋ฐ์ดํฐ ํ์ ์ ๋ฐ๋ผ ์ ์ฅ๋๋ ๋ฐฉ์์ด ๋ค๋ฆ ๋๋ค.
์ฐ์ , ๊ธฐ๋ณธ(์์)ํ์ ๋ณ์๋ ์คํ ์์ญ์ ์ง์ ๊ฐ์ ๊ฐ๊ฒ ๋๊ณ , ์ฐธ์กฐ ํ์ ๋ณ์๋ ํ ์์ญ์ด๋ ๋ฉ์๋ ์์ญ์ ๊ฐ์ฒด ์ฃผ์๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
Q. ์คํ ํ๋ ์์ ๋ฌด์์ธ๊ฐ?
๋ฉ์๋ ํธ์ถ์ ํ๋ ์์ด ๋ง๋ค์ด ์ง๊ณ , ํ์ฌ ์คํ์ค์ธ ๋ฉ์๋ ์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ณณ์ ๋๋ค.
PC ๋ ์ง์คํฐ (Program Counter Register)
์ฐ๋ ๋ ์์์ ์์ฑ๋๊ณ , ํ์ฌ ์คํ ์ค์ธ JVM ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๊ณณ์ ๋๋ค.
์ ์ฅ๋ ์ฃผ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก JVM์ ๋ค์์ ์คํํ ๋ฐ์ดํธ์ฝ๋ ๋ช ๋ น์ด๋ฅผ ๊ฒฐ์ ํ๊ฒ ๋ฉ๋๋ค. ๊ฐ ์ค๋ ๋๋ง๋ค ๊ฐ๋ณ์ ์ธ PC ๋ ์ง์คํฐ๋ฅผ ํ ๋นํฉ๋๋ค.
์ค๋ ๋๊ฐ ์๋ฐ ๋ฉ์๋๋ฅผ ์ํ์ค์ด๋ผ๋ฉด ํ์ฌ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ PC Register์ ์ ์ฅํฉ๋๋ค. ์ถ๊ฐ๋ก, JVM์ ๋ค์ดํฐ๋ธ ๋ฉ์๋(์ด์์ฒด์ ๋๋ ํ๋์จ์ด์์ ์ง์ ์คํ๋๋ ๋ฉ์๋)๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๋ง์ฝ JVM์ด ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ์คํ ์ค์ธ ๊ฒฝ์ฐ, PC ๋ ์ง์คํฐ๋ ํน์ ๋ช ๋ น์ด ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค์ง ์๊ณ , undefined๋ก ์ค์ ์ด ๋ฉ๋๋ค.
Q. ์ undefined๋ก ์ค์ ์ด ๋๋๊ฐ?
๋ค์ดํฐ๋ธ ๋ฉ์๋๋ JVM ๋ฐ์ดํธ ์ฝ๋๊ฐ ์๋ OS๋ ํ๋์จ์ด์ ๋ช ๋ น์ด๋ก ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ (Native Method Stack)
๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ์ JVM์ด ๋ค์ดํฐ๋ธ ๋ฉ์๋(๊ธฐ๊ณ์ด๋ก ์์ฑ๋ ์ฝ๋)๋ฅผ ์คํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์คํ์ด๊ณ , ์๋ฐ ์คํ๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํ๋ฉฐ, JNI(Java Native Interface)๋ฅผ ํตํด ํธ์ถ๋๊ณ , ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ ํ ๋ค์ JVM ์คํ์ผ๋ก ๋์๊ฐ ์๋ฐ ์ฝ๋์ ์คํ์ ์ด์ด๊ฐ ์ ์์ต๋๋ค.
ํ๋ฆ ๊ณผ์ ์ ๊ฐ๋จํ ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
(1) ์๋ฐ ๋ฉ์๋ ํธ์ถ : ์๋ฐ ์ฝ๋์์ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด, ํด๋น ๋ฉ์๋์ ์คํ ํ๋ ์์ด JVM ์คํ์ ์์ ๋๋ค.
(2) ๋ค์ดํฐ๋ธ ๋ฉ์๋ ํธ์ถ: ์๋ฐ ๋ฉ์๋ ๋ด๋ถ์์ JNI๋ฅผ ํตํด ๋ค์ดํฐ๋ธ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด,์คํ ํ๋ฆ์ด JVM ์คํ์์ ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ์ผ๋ก ๋์ด๊ฐ๊ณ , ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ์ ํธ์ถ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ , ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
(3) ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ : ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ OS๋ ํ๋์จ์ด์์ ์คํ๋ฉ๋๋ค. ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ์์ ํจ์ ํธ์ถ ์ ๋ณด์ ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
๋ค์ดํฐ๋ธ ๋ฉ์๋ ์๋ฃ ํ : ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ์ด ๋๋๋ฉด, ์คํ ํ๋ฆ์ด ๋ค์ JVM ์คํ์ผ๋ก ๋์์ค๊ณ , ์ดํ JVM ์คํ์ ๋จ์ ์๋ ์์ ์ ์ด์ด์ ์ํํฉ๋๋ค.
JNI (Java Native Interface)
์๋ฐ ํ๋ก๊ทธ๋จ๊ณผ ๋ค์ดํฐ๋ธ ์ฝ๋๊ฐ์ ์ํธ์์ฉ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ์ธํฐํ์ด์ค ์ ๋๋ค. ์ด๋ JVM์ด ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฑฐ๋, ๋ค์ดํฐ๋ธ ์ฝ๋๊ฐ ์๋ฐ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
Native Method Library
Native Method Library๋ ์๋ฐ ํ๋ก๊ทธ๋จ์์ ํธ์ถํ ์ ์๋ ๋ค์ดํฐ๋ธ ๋ฉ์๋(Native Method)๊ฐ ๊ตฌํ๋์ด ์๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์์ฑ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด์์ฒด์ ์์ ์คํ ๊ฐ๋ฅํ ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผ๋์ด ์์ผ๋ฉฐ, ๋ณดํต .dll(Windows), .so(Linux), ๋๋ .dylib(macOS) ๊ฐ์ ํ์ผ ํ์์ผ๋ก ์ ๊ณต๋ฉ๋๋ค.
์ฐ๋ ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ณธ ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ
๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ์ฐ๋ ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Method ์์ญ๊ณผ Heap ์์ญ์ ๋ชจ๋ ์ฐ๋ ๋๊ฐ ๊ณต์ ํ๋ ์์ญ์ด๊ณ , Stack ์์ญ, PC Register ์์ญ, Native Method Stack ์์ญ์ ๊ฐ ์ฐ๋ ๋๋ง๋ค ์์ฑ๋๋ ๊ฐ๋ณ ์์ญ์ ๋๋ค.
'Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ถ๋ ์์์ (0) | 2025.01.11 |
---|---|
immutable ๊ฐ์ฒด๋ก ๋ง๋๋ ๋ฐฉ๋ฒ (0) | 2025.01.09 |
[Effective Java] ์์ฑ์ ๋์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ๊ณ ๋ คํ๋ผ (0) | 2024.12.11 |
์๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ (0) | 2024.10.02 |
Objects.equals() vs equals() (0) | 2024.09.25 |