๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Java

JVM ์ •๋ณตํ•˜๊ธฐ

by sangyunpark99 2025. 1. 9.

๐Ÿ“ 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์˜ ์ด๋ฆ„์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

VM์˜ Method Area์— ๋กœ๋“œ๋œ ๊ฐ ํด๋ž˜์Šค ๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ทธ๋ฆผ

 

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 ์˜์—ญ์€ ๊ฐ ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋Š” ๊ฐœ๋ณ„ ์˜์—ญ์ž…๋‹ˆ๋‹ค.