Shared Between Threads
Heap
Heap์ ๋ฐํ์์ ํด๋์ค ์ธ์คํด์ค์ ๋ฐฐ์ด์ ํ ๋นํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. Frame์ ์์ฑ๋ ํ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋๋๋ก ์ค๊ณ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด๊ณผ ๊ฐ์ฒด๋ stack์ ์ ์ฅํ ์ ์์ต๋๋ค. ํ๋ ์์ heap์ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๋ง ์ ์ฅํฉ๋๋ค. ๋ก์ปฌ ๋ณ์ ๋ฐฐ์ด(๊ฐ frame์์)์ ๊ธฐ๋ณธ ๋ณ์ ๋ฐ ์ฐธ์กฐ์ ๋ฌ๋ฆฌ ๊ฐ์ฒด๋ ํญ์ ํ์ ์ ์ฅ๋๋ฏ๋ก ๋ฉ์๋๊ฐ ์ข ๋ฃ๋ ๋ ์ ๊ฑฐ๋์ง ์์ต๋๋ค. ๋์ ๊ฐ์ฒด๋ garbage collector์ ์ํด์๋ง ์ ๊ฑฐ๋ฉ๋๋ค.
garbage collection์ ์ง์ํ๊ธฐ ์ํด ํ์ ์ธ ๋ถ๋ถ์ผ๋ก ๋๋ฉ๋๋ค.
Young Generation
์ข ์ข Eden๊ณผ Survivor๋ก ๋๋ฉ๋๋ค.
Old Generation
Tenured Generation์ด๋ผ๊ณ ๋ ํจ
Permanent Generation
Memory Management
๊ฐ์ฒด ๋ฐ ๋ฐฐ์ด์ garbage collector๊ฐ ์๋์ผ๋ก ํ์ํ๋ ๋์ ๋ช ์์ ์ผ๋ก ํ ๋น ํด์ ๋์ง ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค.
์๋ก์ด ๊ฐ์ฒด์ ๋ฐฐ์ด์ด young generation์ ์์ฑ๋ฉ๋๋ค.
Minor garbage collection์ young generation์์ ์๋ํฉ๋๋ค. ์์ง ์ด์์๋ ๊ฒ์ฒด๋ eden ๊ณต๊ฐ์์ survivor ๊ณต๊ฐ์ผ๋ก ์ด๋๋ฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ thread๋ฅผ ์ผ์ ์ค์ง์ํค๋ Major garbage collection์ ์ธ๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ด๋ํฉ๋๋ค. ์์ง ์ด์์๋ ๊ฐ์ฒด๋ young generation์์ old(tenured) generation๋ก ์ด๋๋ฉ๋๋ค.
Permanent generation๋ old generation๊ฐ ์์ง๋ ๋๋ง๋ค ์์ง๋ฉ๋๋ค. ๋ ์ค ํ๋๊ฐ ๊ฐ๋ ์ฐจ๋ฉด ๋ ๋ค ์์ง๋ฉ๋๋ค.
Non-Heap Memory
๋ ผ๋ฆฌ์ ์ผ๋ก JVM ๋ฉ์ปค๋์ฆ์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋๋ ๊ฐ์ฒด๋ Heap์ ์์ฑ๋์ง ์์ต๋๋ค.
non-heap ๋ฉ๋ชจ๋ฆฌ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค.
Permanent Generation
the method area
interned strings
Code Cache
JIT ์ปดํ์ผ๋ฌ์ ์ํด native ์ฝ๋๋ก ์ปดํ์ผ๋ ๋ฉ์๋์ ์ปดํ์ผ ๋ฐ ์ ์ฅ์ ์ฌ์ฉ
Just In Time (JIT) Compliation
Java ๋ฐ์ดํธ ์ฝ๋๋ ํด์๋์ง๋ง JVM์ ํธ์คํธ CPU์์ native ์ฝ๋๋ฅผ ์ง์ ์คํํ๋ ๊ฒ๋งํผ ๋น ๋ฅด์ง๋ ์์ต๋๋ค. ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด Oracle Hotspot VM์ ์ ๊ธฐ์ ์ผ๋ก ์คํ๋๋ ๋ฐ์ดํธ ์ฝ๋์ "ํซ" ์์ญ์ ์ฐพ๊ณ ์ด๋ฅผ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ปดํ์ผํฉ๋๋ค. Native code๋ heap์ด ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฝ๋ ์บ์์ ์ ์ฅ๋ฉ๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ผ๋ก Hotspot VM์ ์ฝ๋๋ฅผ ์ปดํ์ผํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์ถ๊ฐ ์๊ฐ๊ณผ ํด์๋ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์ถ๊ฐ ์๊ฐ์ ์ ์ถฉํ๋ ๊ฐ์ฅ ์ ์ ํ ๋ฐฉ๋ฒ์ ์ ํํ๋ ค๊ณ ํฉ๋๋ค.
Method Area
๋ฉ์๋ ์์ญ์ ๋ค์๊ณผ ๊ฐ์ ํด๋์ค๋ณ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค.
Classloader Reference
Run Time Constant Poll
Numertic constants
Field references
Method References
Attributes
Field data
Per filed
Name
Type
Modifiers
Attributes
Method data
Per method
Name
Return Type
Parameter Types (in order)
Modifiers
Attributes
Method code
Per method
Bytecodes
Operand stack size
Local variable size
Local variable table
Exception table
Per exception handler
Start point
End point
PC offset for handler code
Constant pool index for exception class being caught
๋ชจ๋ ์ค๋ ๋๋ ๋์ผํ ๋ฉ์๋ ์์ญ์ ๊ณต์ ํ๋ฏ๋ก ๋ฉ์๋ ์์ญ ๋ฐ์ดํฐ์ ๋ํ ์ก์ธ์ค์ ๋์ ์ฐ๊ฒฐ ํ๋ก์ธ์ค๋ thread safeํด์ผ ํฉ๋๋ค. ๋ ์ค๋ ๋๊ฐ ์์ง ๋ก๋๋์ง ์์ ํด๋์ค์ ํ๋๋ ๋ฉ์๋์ ์ก์ธ์คํ๋ ค๊ณ ์๋ํ๋ ๊ฒฝ์ฐ ํ ๋ฒ๋ง ๋ก๋ํด์ผ ํ๋ฉฐ ๋ ์ค๋ ๋ ๋ชจ๋ ๋ก๋๋ ๋๊น์ง ์คํ์ ๊ณ์ํด์๋ ์ ๋ฉ๋๋ค.
Class File Structure
์ปดํ์ผ๋ ํด๋์ค ํ์ผ์ ๋ค์ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info contant_pool[constant_pool_count โ 1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
magic, minor_version, major_version
magic, minor_version, major_version์ ํด๋์ค ๋ฒ์ ๋ฐ ์ด ํด๋์ค๊ฐ ์ปดํ์ผ๋ JDK ๋ฒ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ง์ ํฉ๋๋ค.
constant_pool
Symbol ํ ์ด๋ธ๊ณผ ์ ์ฌํ์ง๋ง ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๊ณ ์๋ค . ์ด์ ๋ํด์๋ ์๋์์ ์์ธํ ์ค๋ช ํฉ๋๋ค.
access_flags
์ด ํด๋์ค์ ๋ํ ์์ ์ list๋ฅผ ์ ๊ณตํฉ๋๋ค.
this_class
์ด ํด๋์ค์ ์ ๊ทํ๋ ์ด๋ฆ(์: org/jamesdbloom/foo/Bar)์ ์ ๊ณตํ๋ constant_pool์ ๋ํ ์ธ๋ฑ์ค
super_class
์์ ํด๋์ค (์ฆ, java/lang/Object)์ ๋ํ symbolic ์ฐธ์กฐ๋ฅผ ์ ๊ณตํ๋ constant_pool์ ๋ํ ์ธ๋ฑ์ค
interfaces
๊ตฌํ๋ ๋ชจ๋ ์ธํฐํ์ด์ค์ ๋ํ symbolic ์ฐธ์กฐ๋ฅผ ์ ๊ณตํ๋ constant_pool์ ๋ํ ์ธ๋ฑ์ค ๋ฐฐ์ด.
fields
๊ฐ ํ๋์ ๋ํ ์์ ํ ์ค๋ช ์ ์ ๊ณตํ๋ constant_pool์ ๋ํ ์ธ๋ฑ์ค ๋ฐฐ์ด.
methods
๊ฐ ๋ฉ์๋ ์๊ทธ๋์ฒ์ ๋ํ ์์ ํ ์ค๋ช ์ ์ ๊ณตํ๋ constant_pool์ ๋ํ ์ธ๋ฑ์ค ๋ฐฐ์ด, ๋ฉ์๋๊ฐ abstract ๋๋ native๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฐ์ดํธ์ฝ๋๋ ์กด์ฌํฉ๋๋ค.
attributes
RetentionPolicy.CLASS ๋๋ RetentionPolicy.RUNTIME์ด ์๋ annotaions์ ํฌํจํ์ฌ ํด๋์ค์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋ค์ํ ๊ฐ์ ๋ฐฐ์ด
javap ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์ปดํ์ผ๋ Java ํด๋์ค์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฐ๋จํ ํด๋์ค๋ฅผ ์ปดํ์ผํ๋ ๊ฒฝ์ฐ:
package org.jvminternals;
public class SimpleClass {
public void sayHello() {
System.out.println("Hello");
}
}
๊ทธ๋ฐ ๋ค์ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค
javap -v -p -s -sysinfo -constants classes/org/jvminternals/SimpleClass.class
public class org.jvminternals.SimpleClass
SourceFile: "SimpleClass.java"
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #6.#17 // java/lang/Object."<init>":()V
#2 = Fieldref #18.#19 // java/lang/System.out:Ljava/io/PrintStream;
#3 = String #20 // "Hello"
#4 = Methodref #21.#22 // java/io/PrintStream.println:(Ljava/lang/String;)V
#5 = Class #23 // org/jvminternals/SimpleClass
#6 = Class #24 // java/lang/Object
#7 = Utf8 <init>
#8 = Utf8 ()V
#9 = Utf8 Code
#10 = Utf8 LineNumberTable
#11 = Utf8 LocalVariableTable
#12 = Utf8 this
#13 = Utf8 Lorg/jvminternals/SimpleClass;
#14 = Utf8 sayHello
#15 = Utf8 SourceFile
#16 = Utf8 SimpleClass.java
#17 = NameAndType #7:#8 // "<init>":()V
#18 = Class #25 // java/lang/System
#19 = NameAndType #26:#27 // out:Ljava/io/PrintStream;
#20 = Utf8 Hello
#21 = Class #28 // java/io/PrintStream
#22 = NameAndType #29:#30 // println:(Ljava/lang/String;)V
#23 = Utf8 org/jvminternals/SimpleClass
#24 = Utf8 java/lang/Object
#25 = Utf8 java/lang/System
#26 = Utf8 out
#27 = Utf8 Ljava/io/PrintStream;
#28 = Utf8 java/io/PrintStream
#29 = Utf8 println
#30 = Utf8 (Ljava/lang/String;)V
{
public org.jvminternals.SimpleClass();
Signature: ()V
flags: 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
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lorg/jvminternals/SimpleClass;
public void sayHello();
Signature: ()V
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String "Hello"
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
LineNumberTable:
line 6: 0
line 7: 8
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 this Lorg/jvminternals/SimpleClass;
}
์ด ํด๋์ค ํ์ผ์ ์์ ํ, ์์ฑ์ ๋ฐ sayHello ๋ฉ์๋์ ์ธ ๊ฐ์ง ์ฃผ์ ์น์ ์ ๋ณด์ฌ์ค๋๋ค.
Constatn Pool - ์ด๋ symbol ํ ์ด๋ธ์ด ์ผ๋ฐ์ ์ผ๋ก ์ ๊ณตํ๋ ๊ฒ๊ณผ ๋์ผํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ฉฐ ์๋์์ ์์ธํ ์ค๋ช ํฉ๋๋ค
Methods โ ๊ฐ๊ฐ ๋ค ๊ฐ์ง ์์ญ ํฌํจ:
signature and access flags
byte code
LineNumberTable - ์ด๊ฒ์ ๋๋ฒ๊ฑฐ์ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ฌ ์ด๋ค ์ค์ด ์ด๋ค ๋ฐ์ดํธ ์ฝ๋ ๋ช ๋ น์ด์ ํด๋นํ๋์ง ํ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด Java ์ฝ๋์ 6๋ฒ ์ค์ sayHello ๋ฉ์๋์ ๋ฐ์ดํธ ์ฝ๋ 0์ ํด๋นํ๊ณ 7๋ฒ ์ค์ ๋ฐ์ดํธ ์ฝ๋ 8์ ํด๋นํฉ๋๋ค.
LocalVariableTable - ์ด๊ฒ์ frame์ ์ ๊ณต๋ ๋ชจ๋ ์ง์ญ ๋ณ์๋ฅผ ๋์ดํฉ๋๋ค. ๋ ์์ ์์ ์ ์ผํ ์ง์ญ ๋ณ์๋ this์ ๋๋ค.
๋ค์ ๋ฐ์ดํธ ์ฝ๋ ํผ์ฐ์ฐ์๋ ์ด ํด๋์ค ํ์ผ์์ ์ฌ์ฉ๋ฉ๋๋ค.
aload_0
์ด opcode๋
aload_<n>
ํ์์ opcode ๊ทธ๋ฃน ์ค ํ๋์ ๋๋ค. ๊ทธ๋ค์ ๋ชจ๋ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํผ์ฐ์ฐ์ ์คํ์ ๋ก๋ํฉ๋๋ค.<n>
์ ์ก์ธ์ค๋๊ณ ์์ง๋ง 0, 1, 2 ๋๋ 3๋ง ๋ ์ ์๋ ๋ก์ปฌ ๋ณ์ ๋ฐฐ์ด์ ์์น๋ฅผ โโ๋ํ๋ ๋๋ค. ๊ฐ์ฒด ์ฐธ์กฐiload_<n>
์๋ ๊ฐ์ ๋ก๋ํ๊ธฐ ์ํ ๋ค๋ฅธ ์ ์ฌํlload_<n>
,float_<n>
๋ฐdload_<n>
์ด opcode๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์i
๋int
์ฉ,l
์long
์ฉ,f
๋float
์ฉ,d
๋double
์ฉ์ ๋๋ค. ์ธ๋ฑ์ค๊ฐ 3๋ณด๋ค ๋์ ์ง์ญ ๋ณ์๋iload
,lload
,float
,dload
๋ฐaload
๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋ํ ์ ์์ต๋๋ค. ์ด๋ฌํ opcode๋ ๋ชจ๋ ๋ก๋ํ ๋ก์ปฌ ๋ณ์์ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ๋ ๋จ์ผ ํผ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ldc
์ด opcode๋ ๋ฐํ์ ์์ ํ์์ ํผ์ฐ์ฐ์ ์คํ์ผ๋ก ์์๋ฅผ ํธ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
getstatic
์ด opcode๋ ๋ฐํ์ ์์ ํ์ ๋์ด๋ ์ ์ ํ๋์์ ํผ์ฐ์ฐ์ ์คํ์ผ๋ก ์ ์ ๊ฐ์ ํธ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
invokespecial
, invokevirtual
์ด๋ฌํ opcode๋
invokedynamic
,invokeinterface
,invokespecial
,invokestatic
,invokevirtual
๊ณผ ๊ฐ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ opcode ๊ทธ๋ฃน์ ์์ต๋๋ค. ์ด ํด๋์ค ํ์ผ์์ invokespecial ๋ฐinvokevirutal
์ด ๋ชจ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ค ๊ฐ์ ์ฐจ์ด์ ์invokevirutal
์ด ๊ฐ์ฒด์ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค๋ ๊ฒ์ ๋๋ค.invokespecial
๋ช ๋ น์ด๋ ํ์ฌ ํด๋์ค์ ์ํผํด๋์ค์ ๋ฉ์๋ ๋ฐ ์ ์ฉ ๋ฉ์๋๋ฟ๋ง ์๋๋ผ ์ธ์คํด์ค ์ด๊ธฐํ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
return
์ด opcode๋
ireturn
,lreturn
,freturn
,dreturn
,areturn
๋ฐ return opcode ๊ทธ๋ฃน์ ์์ต๋๋ค. ๊ฐ opcode๋i
๊ฐint
,l
์ดlong
,f
๊ฐfloat
,d
๊ฐdouble
,a
๊ฐ ๊ฐ์ฒด ์ฐธ์กฐ์ธ ๋ค๋ฅธ ํ์ ์ ๋ฐํํ๋ typed return ๋ฌธ์ ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ฐ์ดํธ ์ฝ๋์์์ ๊ฐ์ด ๋๋ถ๋ถ์ ํผ์ฐ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ก์ปฌ ๋ณ์, ํผ์ฐ์ฐ์ ์คํ ๋ฐ ๋ฐํ์ ์์ ํ๊ณผ ์ํธ ์์ฉํฉ๋๋ค.
์์ฑ์๋ ๋ ๊ฐ์ ๋ช
๋ น์ ๊ฐ์ง๊ณ ์๋ค. ๋จผ์ this
ํผ์ฐ์ฐ์ ์คํ์ผ๋ก ํธ์ํ๊ณ ๋ค์์ผ๋ก ์ํผ ํด๋์ค์ ์์ฑ์๊ฐ ํธ์ถ๋์ด this
์์ ๊ฐ์ ์๋นํ๋ฏ๋ก ํผ์ฐ์ฐ์ ์คํ์์ ๊บผ๋
๋๋ค.

sayHello() ๋ฉ์๋๋ ์์์ ์์ธํ ์ค๋ช
ํ ๊ฒ์ฒ๋ผ ๋ฐํ์ ์์ ํ์ ์ฌ์ฉํ์ฌ ์ค์ ์ฐธ์กฐ์ ๋ํ symbolic ์ฐธ์กฐ๋ฅผ ํด๊ฒฐํด์ผ ํ๋ฏ๋ก ๋ ๋ณต์กํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ํผ์ฐ์ฐ์ getstatic
์ System
ํด๋์ค์ ์ ์ ํ๋ out
์ ๋ํ ์ฐธ์กฐ๋ฅผ ํผ์ฐ์ฐ์ ์คํ์ผ๋ก ํธ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ค์ ํผ์ฐ์ฐ์ ldc
๋ ๋ฌธ์์ด "Hello"
๋ฅผ ํผ์ฐ์ฐ์ ์คํ์ ํธ์ํฉ๋๋ค. ๋ง์ง๋ง ํผ์ฐ์ฐ์ invokevirtual
์ ์ธ์๋ก ํผ์ฐ์ฐ์ ์คํ์์ "Hello"
๋ฅผ ๊บผ๋ด๊ณ ํ์ฌ ์ค๋ ๋์ ๋ํ ์ ํ๋ ์์ ๋ง๋๋ System.out
์ println
๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.

JVM์ ๋ถํธ์คํธ๋ฉ ํด๋์ค๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ธฐ ํด๋์ค๋ฅผ ๋ก๋ํ์ฌ ์์๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ public static void main(String[])
์ด ํธ์ถ๋๊ธฐ ์ ์ ํด๋์ค๊ฐ ์ฐ๊ฒฐ๋๊ณ ์ด๊ธฐํ๋ฉ๋๋ค. ์ด ๋ฉ์๋๋ฅผ ์คํํ๋ฉด ํ์์ ๋ฐ๋ผ ์ถ๊ฐ ํด๋์ค ๋ฐ ์ธํฐํ์ด์ค์ ๋ก๋, ์ฐ๊ฒฐ ๋ฐ ์ด๊ธฐํ๊ฐ ์ฐจ๋ก๋ก ์คํ๋ฉ๋๋ค.
Faster Class Loading
ํด๋์ค ๋ฐ์ดํฐ ๊ณต์ (CDS)๋ผ๋ ๊ธฐ๋ฅ์ด HotSpot JMV ๋ฒ์ 5.0๋ถํฐ ๋์ ๋์์ต๋๋ค. JVM ์ค์น ํ๋ก์ธ์ค ์ค์ ์ค์น ํ๋ก๊ทธ๋จ์ (rt.jar์ ๊ฐ์) ์ฃผ์ JVM ํด๋์ค ์งํฉ์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ๊ณต์ ์์นด์ด๋ธ๋ก ๋ก๋ํฉ๋๋ค. CDS๋ ์ด๋ฌํ ํด๋์ค๋ฅผ ๋ก๋ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ค์ฌ JVM ์์ ์๋๋ฅผ ๊ฐ์ ํ๊ณ ์ด๋ฌํ ํด๋์ค๋ฅผ JVM์ ์๋ก ๋ค๋ฅธ ์ธ์คํด์ค ๊ฐ์ ๊ณต์ ํ ์ ์๋๋ก ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ ๋๋ค.
Where Is The Method Area
JVM(Java Virtual Machine) ์ฌ์ Java SE 7 Edition์๋ "๋ฉ์๋ ์์ญ์ด ๋ ผ๋ฆฌ์ ์ผ๋ก heap์ ์ผ๋ถ์ด์ง๋ง ๊ฐ๋จํ ๊ตฌํ์์๋ garbage collect ๋๋ ์์ถ์ ์ ํํ์ง ์์ ์ ์์ต๋๋ค. ". Oracle JVM์ฉ jconsole๊ณผ ๋ฌ๋ฆฌ ๋ฉ์๋ ์์ญ(๋ฐ ์ฝ๋ ์บ์)์ด non-heap ์๋ ๊ฒ์ผ๋ก ํ์๋ฉ๋๋ค. OpenJDK ์ฝ๋๋ CodeCache๊ฐ ObjectHeap์ ๋ํ VM์ ๋ณ๋์ ํ๋์์ ๋ณด์ฌ์ค๋๋ค.
Classloader Reference
๋ก๋๋๋ ๋ชจ๋ ํด๋์ค์๋ ์ด๋ฅผ ๋ก๋ํ ํด๋์ค ๋ก๋์ ๋ํ ์ฐธ์กฐ๊ฐ ํฌํจ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋์ค ๋ก๋์๋ ๋ก๋ํ ๋ชจ๋ ํด๋์ค์ ๋ํ ์ฐธ์กฐ๋ ํฌํจ๋ฉ๋๋ค.
Run Time Constant Pool
JVM์ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ์ง๋ง symbol ํ ์ด๋ธ๊ณผ ์ ์ฌํ ๋ฐํ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ธ ํ์ ๋ณ ์์ ํ์ ์ ์งํฉ๋๋ค. Java์ ๋ฐ์ดํธ ์ฝ๋์๋ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ฉฐ, ์ข ์ข ์ด ๋ฐ์ดํฐ๋ ๋ฐ์ดํธ ์ฝ๋์ ์ง์ ์ ์ฅํ๊ธฐ์๋ ๋๋ฌด ํฝ๋๋ค. ๋์ ์์ ํ์ ์ ์ฅ๋๊ณ ๋ฐ์ดํธ ์ฝ๋์๋ ์์ ํ์ ๋ํ ์ฐธ์กฐ๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ฐํ์ ์์ ํ์ ์์์ ์ค๋ช ํ ๋๋ก ๋์ ์ฐ๊ฒฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
๋ค์์ ํฌํจํ์ฌ ์ฌ๋ฌ ํ์ ์ ๋ฐ์ดํฐ๊ฐ ์์ ํ์ ์ ์ฅ๋ฉ๋๋ค.
numeric literals
string literals
class references
field references
method references
์๋ฅผ ๋ค์ด ๋ค์ ์ฝ๋:
Object foo = new Object();
๋ค์๊ณผ ๊ฐ์ด ๋ฐ์ดํธ ์ฝ๋๋ก ์์ฑ๋ฉ๋๋ค.
0: new #2 // Class java/lang/Object
1: dup
2: invokespecial #3 // Method java/ lang/Object "<init>"( ) V
new
opcode(ํผ์ฐ์ฐ์ ์ฝ๋) ๋ค์์๋ #2
ํผ์ฐ์ฐ์๊ฐ ์ต๋๋ค. ์ด ํผ์ฐ์ฐ์๋ ์์ ํ์ ๋ํ ์ธ๋ฑ์ค์ด๋ฏ๋ก ์์ ํ์ ๋ ๋ฒ์งธ ํญ๋ชฉ์ ์ฐธ์กฐํฉ๋๋ค. ๋ ๋ฒ์งธ ํญ๋ชฉ์ ํด๋์ค ์ฐธ์กฐ์ด๋ฉฐ, ์ด ํญ๋ชฉ์ ๊ฐ์ด // Class java/lang/Object
์ธ ์์ UTF8 string
๋ก ํด๋์ค ์ด๋ฆ์ ํฌํจํ๋ ์์ ํ์ ๋ค๋ฅธ ํญ๋ชฉ์ ์ฐจ๋ก๋ก ์ฐธ์กฐํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด symbolic ๋งํฌ๋ฅผ ์ฌ์ฉํ์ฌ java.lang.Object
์ ๋ํ ํด๋์ค๋ฅผ ์กฐํํ ์ ์์ต๋๋ค. new
opcode๋ ํด๋์ค ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ํด๋น ๋ณ์๋ฅผ ์ด๊ธฐํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ํด๋์ค ์ธ์คํด์ค์ ๋ํ ์ฐธ์กฐ๊ฐ ํผ์ฐ์ฐ์ ์คํ์ ์ถ๊ฐ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ dup
opcode๋ ํผ์ฐ์ฐ์ ์คํ์์ ์์ ์ฐธ์กฐ์ ์ถ๊ฐ ๋ณต์ฌ๋ณธ์ ์์ฑํ๊ณ ์ด๋ฅผ ํผ์ฐ์ฐ์ ์คํ์ ์ต์์์ ์ถ๊ฐํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ธ์คํด์ค ์ด๊ธฐํ ๋ฉ์๋๋ invokespecial
์ ์ํด 2ํ์์ ํธ์ถ๋ฉ๋๋ค. ์ด ํผ์ฐ์ฐ์๋ ์์ ํ์ ๋ํ ์ฐธ์กฐ๋ ํฌํจํฉ๋๋ค. ์ด๊ธฐํ ๋ฉ์๋๋ ๋ฉ์๋์ ๋ํ ์ธ์๋ก ํผ์ฐ์ฐ์ ํ์์ ์ต์์ ์ฐธ์กฐ๋ฅผ ์๋น(ํ)ํฉ๋๋ค. ๋ง์ง๋ง์๋ ์์ฑ๋๊ณ ์ด๊ธฐํ๋ ์ ๊ฐ์ฒด์ ๋ํ ํ๋์ ์ฐธ์กฐ๊ฐ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฐ๋จํ ํด๋์ค๋ฅผ ์ปดํ์ผํ๋ ๊ฒฝ์ฐ:
package org.jvminternals;
public class SimpleClass {
public void sayHello() {
System.out.println("Hello");
}
}
์์ฑ๋ ํด๋์ค ํ์ผ์ ์์ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Constant pool:
#1 = Methodref #6.#17 // java/lang/Object."<init>":()V
#2 = Fieldref #18.#19 // java/lang/System.out:Ljava/io/PrintStream;
#3 = String #20 // "Hello"
#4 = Methodref #21.#22 // java/io/PrintStream.println:(Ljava/lang/String;)V
#5 = Class #23 // org/jvminternals/SimpleClass
#6 = Class #24 // java/lang/Object
#7 = Utf8 <init>
#8 = Utf8 ()V
#9 = Utf8 Code
#10 = Utf8 LineNumberTable
#11 = Utf8 LocalVariableTable
#12 = Utf8 this
#13 = Utf8 Lorg/jvminternals/SimpleClass;
#14 = Utf8 sayHello
#15 = Utf8 SourceFile
#16 = Utf8 SimpleClass.java
#17 = NameAndType #7:#8 // "<init>":()V
#18 = Class #25 // java/lang/System
#19 = NameAndType #26:#27 // out:Ljava/io/PrintStream;
#20 = Utf8 Hello
#21 = Class #28 // java/io/PrintStream
#22 = NameAndType #29:#30 // println:(Ljava/lang/String;)V
#23 = Utf8 org/jvminternals/SimpleClass
#24 = Utf8 java/lang/Object
#25 = Utf8 java/lang/System
#26 = Utf8 out
#27 = Utf8 Ljava/io/PrintStream;
#28 = Utf8 java/io/PrintStream
#29 = Utf8 println
#30 = Utf8 (Ljava/lang/String;)V
์์ ํ์๋ ๋ค์ ์ ํ์ด ํฌํจ๋ฉ๋๋ค
Integer
4๋ฐ์ดํธ int ์์
Long
8๋ฐ์ดํธ long ์์
Float
4๋ฐ์ดํธ float ์์
Double
8๋ฐ์ดํธ double ์์
String
์ค์ ๋ฐ์ดํธ๋ฅผ ํฌํจํ๋ ์์ ํ์ ๋ค๋ฅธ Utf8 ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๋ ๋ฌธ์์ด ์์
Utf8
Utf8๋ก ์ธ์ฝ๋ฉ๋ ๋ฌธ์ ์ํ์ค๋ฅผ ๋ํ๋ด๋ ๋ฐ์ดํธ ์คํธ๋ฆผ
Class
๋ด๋ถ JVM ํ์์ ์ ๊ทํ๋ ํด๋์ค ์ด๋ฆ์ ํฌํจํ๋ ์์ ํ์ ๋ค๋ฅธ Utf8 ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๋ ํด๋์ค ์์(๋์ ์ฐ๊ฒฐ ํ๋ก์ธ์ค์์ ์ฌ์ฉ๋จ)
NameAndType
์์ ํ์ ๋ค๋ฅธ ํญ๋ชฉ์ ๊ฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ฝ๋ก ์ผ๋ก ๊ตฌ๋ถ๋ ๊ฐ ์์ ๋๋ค. ์ฒซ ๋ฒ์งธ ๊ฐ(์ฝ๋ก ์)์ ๋ฉ์๋ ๋๋ ํ๋ ์ด๋ฆ์ธ Utf8 ๋ฌธ์์ด ํญ๋ชฉ์ ๊ฐ๋ฆฌํต๋๋ค. ๋ ๋ฒ์งธ ๊ฐ์ ์ ํ์ ๋ํ๋ด๋ Utf8 ํญ๋ชฉ์ ๊ฐ๋ฆฌํต๋๋ค. ํ๋์ ๊ฒฝ์ฐ ์ ๊ทํ๋ ํด๋์ค ์ด๋ฆ์ด๊ณ ๋ฉ์๋์ ๊ฒฝ์ฐ ๋งค๊ฐ๋ณ์๋น ํ๋์ ์ ๊ทํ๋ ํด๋์ค ์ด๋ฆ list์ ๋๋ค.
Fielddref, Methodref, InterfaceMethodref
์์ ํ์ ๋ค๋ฅธ ํญ๋ชฉ์ ๊ฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ ์ผ๋ก ๊ตฌ๋ถ๋ ๊ฐ ์์ ๋๋ค. ์ฒซ ๋ฒ์งธ ๊ฐ(์ ์)์ ํด๋์ค ํญ๋ชฉ์ ๊ฐ๋ฆฌํต๋๋ค. ๋ ๋ฒ์งธ ๊ฐ์ NameAndType ํญ๋ชฉ์ ๊ฐ๋ฆฌํต๋๋ค.
Exception Table
์์ธ ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ ์์ธ๋ณ ํธ๋ค๋ฌ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค.
์์์
์ข ์
ํด๋ค๋ฌ ์ฝ๋์ PC offset
catch๋๋ ์์ธ ํด๋์ค์ ๋ํ ์์ ํ ์ธ๋ฑ์ค
๋ฉ์๋๊ฐ try-catch ๋๋ try-finally ์์ธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ์ํ ๊ฒฝ์ฐ ์์ธ ํ ์ด๋ธ์ด ์์ฑ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ํธ๋ค๋ฌ๊ฐ ์ ์ฉ๋๋ ๋ฒ์, ์ฒ๋ฆฌ๋๋ ์์ธ ์ ํ ๋ฐ ํธ๋ค๋ฌ ์ฝ๋๊ฐ ์๋ ์์น๋ฅผ ํฌํจํ์ฌ ๊ฐ ์์ธ ํธ๋ค๋ฌ ๋๋ finally ๋ธ๋ก์ ๋ํ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค.
์์ธ๊ฐ ๋ฐ์ํ๋ฉด JVM์ ํ์ฌ ๋ฉ์๋์์ ์ผ์นํ๋ ํธ๋ค๋ฌ๋ฅผ ์ฐพ์ต๋๋ค. ์๋ฌด๊ฒ๋ ์์ผ๋ฉด ๋ฉ์๋๋ ํ์ฌ ์คํ ํ๋ ์์ ๊ฐ์๊ธฐ ํํ์ฌ ์ข ๋ฃํ๊ณ ์์ธ๋ ํธ์ถ ๋ฉ์๋(์ ํ์ฌ ํ๋ ์)์์ ๋ค์ throw๋ฉ๋๋ค. ๋ชจ๋ ํ๋ ์์ด ํ๋๊ธฐ ์ ์ ์์ธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ๋ฐ๊ฒฌ๋์ง ์์ผ๋ฉด ์ค๋ ๋๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ค๋ ๋๊ฐ ๊ธฐ๋ณธ ์ค๋ ๋์ธ ๊ฒฝ์ฐ์ ๊ฐ์ด ๋ฐ๋ชฌ์ด ์๋ ๋ง์ง๋ง ์ค๋ ๋์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด JVM ์์ฒด๊ฐ ์ข ๋ฃ๋ ์๋ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์์ธ ํธ๋ค๋ฌ๋ ๋ชจ๋ ์ ํ์ ์์ธ์ ์ผ์นํ๋ฏ๋ก ์์ธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ํญ์ ์คํ๋ฉ๋๋ค. ์์ธ๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฒฝ์ฐ ๋ฉ์๋ ๋์์ finally ๋ธ๋ก์ด ์ฌ์ ํ ์คํ๋๋ฉฐ, ์ด๋ return ๋ฌธ์ด ์คํ๋๊ธฐ ์ง์ ์ finally ํธ๋ค๋ฌ ์ฝ๋๋ก ์ ํํ์ฌ ๋ฌ์ฑ๋ฉ๋๋ค.
Symbol Table
์ ํ๋ณ ๋ฐํ์ ์์ ํ ์ธ์๋ Hotspot JVM์๋ permanent generation์ ๋ณด๊ด๋ symbol ํ
์ด๋ธ์ด ์์ต๋๋ค. symbol ํ
์ด๋ธ์ symbol์ ๋ํ ํด์ ํ
์ด๋ธ ๋งคํ symbol ํฌ์ธํฐ(์ฆ, Hashtable<Symbol*, Symbol>
)์ด๋ฉฐ ๊ฐ ํด๋์ค์ ๋ฐํ์ ์์ ํ์ ์๋ symbol๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ symbol์ ๋ํ ํฌ์ธํฐ๋ฅผ ํฌํจํฉ๋๋ค.
Reference counting์ symbol ํ ์ด๋ธ์์ symbol๊ฐ ์ ๊ฑฐ๋๋ ์๊ธฐ๋ฅผ ์ ์ดํ๋ โโ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ํด๋์ค๊ฐ ์ธ๋ก๋๋๋ฉด ๋ฐํ์ ์์ ํ์ ๋ณด๊ด๋ ๋ชจ๋ symbol์ ์ฐธ์กฐ ํ์๊ฐ ๊ฐ์ํฉ๋๋ค. symbol ํ ์ด๋ธ์ ์๋ symbol์ ์ฐธ์กฐ ํ์๊ฐ 0์ด ๋๋ฉด symbol ํ ์ด๋ธ์ symbol์ด ๋ ์ด์ ์ฐธ์กฐ๋์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ํด๋น symbol์ด symbol ํ ์ด๋ธ์์ ์ธ๋ก๋๋ฉ๋๋ค. symbol ํ ์ด๋ธ๊ณผ ๋ฌธ์์ด ํ ์ด๋ธ(์๋ ์ฐธ์กฐ) ๋ชจ๋์ ๋ํด ํจ์จ์ฑ์ ๋์ด๊ณ ๊ฐ ํญ๋ชฉ์ด ํ ๋ฒ๋ง ํ์๋๋๋ก ํ๊ธฐ ์ํด ๋ชจ๋ ํญ๋ชฉ์ด ํ์คํ๋ ํ์์ผ๋ก ์ ์ง๋ฉ๋๋ค.
Interned Strings (String Table)
Java ์ธ์ด ์ฌ์์์๋ ๋์ผํ ์ํ์ค์ ์ ๋์ฝ๋ ์ฝ๋ ํฌ์ธํธ๋ฅผ ํฌํจํ๋ ๋์ผํ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ด ๋์ผํ String
์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํด์ผ ํ๋ค๊ณ ์๊ตฌํฉ๋๋ค. ๋ํ String.intern()
์ด String
์ ์ธ์คํด์ค์์ ํธ์ถ๋๋ฉด string์ด ๋ฆฌํฐ๋ด์ธ ๊ฒฝ์ฐ ์ฐธ์กฐ ๋ฐํ๊ณผ ๋์ผํ ์ฐธ์กฐ๊ฐ ๋ฐํ๋์ด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์์ด true์
๋๋ค.
("j" + "v" + "m").intern() == "jvm"
Hotspot JVM์์ interned string์ symbols(์: Hashtable<oop, Symbol>
)์ ๋ํ Hashtable ๋งคํ ๊ฐ์ฒด ํฌ์ธํฐ์ธ string ํ
์ด๋ธ์ ๋ณด๊ด๋๋ฉฐ permanent generation์ ๋ณด๊ด๋ฉ๋๋ค. symbol ํ
์ด๋ธ(์ ์ฐธ์กฐ)๊ณผ string ํ
์ด๋ธ ๋ชจ๋์ ๋ํด ํจ์จ์ฑ์ ๋์ด๊ณ ๊ฐ ํญ๋ชฉ์ด ํ ๋ฒ๋ง ํ์๋๋๋ก ํ๊ธฐ ์ํด ๋ชจ๋ ํญ๋ชฉ์ด ํ์คํ๋ ํ์์ผ๋ก ์ ์ง๋ฉ๋๋ค.
String ๋ฆฌํฐ๋ด์ ์ปดํ์ผ๋ฌ์ ์ํด ์๋์ผ๋ก interned๋๊ณ ํด๋์ค๊ฐ ๋ก๋๋ ๋ symbol ํ
์ด๋ธ์ ์ถ๊ฐ๋ฉ๋๋ค. ๋ํ String
ํด๋์ค์ ์ธ์คํด์ค๋ String.intern()
์ ํธ์ถํ์ฌ ๋ช
์์ ์ผ๋ก interned
ํ ์ ์์ต๋๋ค. String.intern()
์ด ํธ์ถ๋ ๋ symbol
ํ
์ด๋ธ์ ์ด๋ฏธ ๋ฌธ์์ด์ด ํฌํจ๋์ด ์์ผ๋ฉด this
์ ๋ํ ์ฐธ์กฐ๊ฐ ๋ฐํ๋๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ string
์ด string
ํ
์ด๋ธ์ ์ถ๊ฐ๋๊ณ ํด๋น ์ฐธ์กฐ๊ฐ ๋ฐํ๋ฉ๋๋ค
Last updated
Was this helpful?