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๊ฐ€ ์ž๋™์œผ๋กœ ํšŒ์ˆ˜ํ•˜๋Š” ๋Œ€์‹  ๋ช…์‹œ์ ์œผ๋กœ ํ• ๋‹น ํ•ด์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ƒˆ๋กœ์šด ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์ด young generation์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  2. Minor garbage collection์€ young generation์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ์‚ด์•„์žˆ๋Š” ๊ฒ์ฒด๋Š” eden ๊ณต๊ฐ„์—์„œ survivor ๊ณต๊ฐ„์œผ๋กœ ์ด๋™๋ฉ๋‹ˆ๋‹ค.

  3. ์ผ๋ฐ˜์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ thread๋ฅผ ์ผ์‹œ ์ค‘์ง€์‹œํ‚ค๋Š” Major garbage collection์€ ์„ธ๋Œ€ ๊ฐ„์— ๊ฐ์ฒด๋ฅผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋Š” young generation์—์„œ old(tenured) generation๋กœ ์ด๋™๋ฉ๋‹ˆ๋‹ค.

  4. 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];
}
component
description

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

์ƒ์ˆ˜ ํ’€์—๋Š” ๋‹ค์Œ ์œ ํ˜•์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค

Types
Description

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?