πŸ“š [Java] - JVM(Java Virtual Machine) κ³Ό GC(Garbage Collection)

CodeByHanΒ·2025λ…„ 11μ›” 11일

μžλ°”

λͺ©λ‘ 보기
12/13

μ˜ˆμ „μ— GC(Garbage Collection) 에 λŒ€ν•΄ κ°„λ‹¨νžˆ μ •λ¦¬ν•œ 적이 μžˆμ§€λ§Œ, λ‚΄μš©μ΄ λ‹€μ†Œ μ–•μ•˜λ˜ 것 κ°™μ•„ μ΄λ²ˆμ— λ‹€μ‹œ 깊이 있게 정리해보렀 ν•œλ‹€. GCλŠ” μžλ°” λ©”λͺ¨λ¦¬ κ΄€λ¦¬μ—μ„œ 맀우 μ€‘μš”ν•œ κ°œλ…μ΄κΈ° λ•Œλ¬Έμ΄λ‹€.

πŸ“Œ JVM(Java Virtual Machine)

μžλ°”μ˜ Garbage Collection(GC) 은 JVM이 λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ 핡심 λ©”μ»€λ‹ˆμ¦˜μ΄λ‹€.
이 κ°œλ…μ„ μ œλŒ€λ‘œ μ΄ν•΄ν•˜λ €λ©΄ λ¨Όμ € JVM의 ꡬ쑰와 λ©”λͺ¨λ¦¬ μ˜μ—­μ— λŒ€ν•΄ μ•Œμ•„λ‘˜ ν•„μš”κ°€ μžˆλ‹€.

μš°μ„  JVM λ™μž‘ ꡬ쑰에 λŒ€ν•΄ 정리할렀고 ν•œλ‹€.

  1. κ°œλ°œμžκ°€ μ†ŒμŠ€μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄, μ»΄νŒŒμΌλŸ¬κ°€ 이λ₯Ό λ°”μ΄νŠΈμ½”λ“œ(Bytecode) 둜 λ³€ν™˜ν•œλ‹€.

  2. 이후 클래슀 λ‘œλ”(Class Loader) κ°€ 동적 λ‘œλ”©(Dynamic Loading) 을 톡해 ν•„μš”ν•œ ν΄λž˜μŠ€λ“€μ„ Runtime Data Area(ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ μ‹€μ œ λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλ˜λŠ” μ˜μ—­)에 λ‘œλ“œν•˜κ³  λ§ν¬ν•œλ‹€.

  3. Runtime Data Area에 λ‘œλ“œλœ λ°”μ΄νŠΈμ½”λ“œλŠ” Execution Engine(μ‹€ν–‰ μ—”μ§„) 에 μ˜ν•΄ ν•΄μ„λ˜μ–΄ μ‹€ν–‰λœλ‹€.

  4. 이 κ³Όμ •μ—μ„œ Execution Engine 은 Garbage Collector(GC) λ₯Ό λ™μž‘μ‹œμΌœ λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ κ΄€λ¦¬ν•˜κ³ , λ™μ‹œμ— μŠ€λ ˆλ“œ 동기화(Thread Synchronization) λ“±μ˜ μž‘μ—…λ„ μˆ˜ν–‰ν•œλ‹€.

JVM ꡬ쑰

이처럼 JVM은 μ•„λž˜μ™€ 같이 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

  • 클래슀 λ‘œλ”(Class Loader)

  • μ‹€ν–‰ μ—”μ§„(Execution Engine)

    • 인터프리터(Interpreter)
    • JIT 컴파일러(Just-in-Time)
    • κ°€λΉ„μ§€ μ½œλ ‰ν„°(Garbage collector)
  • λŸ°νƒ€μž„ 데이터 μ˜μ—­ (Runtime Data Area)

    • λ©”μ†Œλ“œ μ˜μ—­
    • νž™ μ˜μ—­
    • PC Register
    • μŠ€νƒ μ˜μ—­
    • λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œ
  • JNI - λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œ μΈν„°νŽ˜μ΄μŠ€ (Native Medthod Interface)

  • λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œ 라이브러리 (Native Method Library)


클래슀 λ‘œλ”(Class Loader)

클래슀 λ‘œλ”(Class Loader)λŠ” λ‘œλ”©, 링크, μ΄ˆκΈ°ν™” λ‹¨κ³„λ‘œ λ‚˜λ‰˜μ–΄μ Έ μžˆλ‹€.

λ‘œλ”©

  • μžλ°” λ°”μ΄νŠΈ μ½”λ“œ(.class)λ₯Ό λ©”μ„œλ“œ μ˜μ—­μ— μ €μž₯
    • λ‘œλ“œλœ 클래슀λ₯Ό λΉ„λ‘―ν•œ 그의 λΆ€λͺ¨ 클래슀 정보
    • 클래슀 파일과 Class, Interface, Enum의 κ΄€λ ¨ μ—¬λΆ€
    • λ³€μˆ˜λ‚˜ λ©”μ„œλ“œλ“±μ˜ 정보

링크

  • 검증: 읽어듀인 ν΄λž˜μŠ€κ°€ JVM λͺ…세에 λͺ…μ‹œλœ λŒ€λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλŠ”μ§€ κ²€
  • μ€€λΉ„: ν΄λž˜μŠ€κ°€ ν•„μš”λ‘œ ν•˜λŠ” λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ή
  • 뢄석:ν΄λž˜μŠ€μ˜Β μƒμˆ˜Β ν’€Β λ‚΄Β λͺ¨λ“ Β μ‹¬λ³Όλ¦­Β λ ˆνΌλŸ°μŠ€λ₯ΌΒ λ‹€μ΄λ ‰νŠΈΒ λ ˆνΌλŸ°μŠ€λ‘œΒ λ³€κ²½

μ΄ˆκΈ°ν™”

  • ν΄λž˜μŠ€Β λ³€μˆ˜λ“€μ„Β μ μ ˆν•œΒ κ°’μœΌλ‘œΒ μ΄ˆκΈ°ν™”(Β staticΒ ν•„λ“œλ“€μ„Β μ„€μ •λœΒ κ°’μœΌλ‘œΒ μ΄ˆκΈ°ν™”Β λ“±Β )

μ‹€ν–‰ μ—”μ§„(Execution Engine)

μžλ°” λ°”μ΄νŠΈ μ½”λ“œ(.class)λŠ” 기계가 λ°”λ‘œ μˆ˜ν–‰ν•  수 μžˆλŠ” μ–Έμ–΄λ³΄λ‹€λŠ” 가상 머신이 이해할 수 μžˆλŠ” 쀑간 레벨둜 컴파일 된 μ½”λ“œμ΄κΈ° λ•Œλ¬Έμ— μ‹€ν–‰ μ—”μ§„(Execution Engine)이 기계가 μ‹€ν–‰ ν•  수 μžˆλŠ” ν˜•νƒœλ‘œ λ³€κ²½ν•΄μ€€λ‹€.

μ‹€ν–‰ μ—”μ§„(Execution Engine)은 인터프리터와 JIT 컴파일러 두가지 방식을 ν˜Όν•©ν•˜μ—¬ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•œλ‹€.

인터프리터(Interpreter)

  • λ°”μ΄νŠΈ μ½”λ“œ λͺ…λ Ήμ–΄λ₯Ό ν•˜λ‚˜μ”© μ½μ–΄μ„œ ν•΄μ„ν•˜κ³  λ°”λ‘œ μ‹€ν–‰ν•œλ‹€.
  • JVMμ•ˆμ—μ„œ λ°”μ΄νŠΈ μ½”λ“œλŠ” 기본적으둜 인터프리터 λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜μ§€λ§Œ 같은 λ©”μ„œλ“œλΌλ„ μ—¬λŸ¬λ²ˆ 호좜이 λœλ‹€λ©΄ 맀번 ν•΄μ„ν•˜κ³  μˆ˜ν–‰ν•΄μ•Ό λ˜μ„œ 전체적인 μ†λ„λŠ” λŠλ¦¬λ‹€.

πŸ€” C, C++ 같은 μ–Έμ–΄λŠ” 컴파일러λ₯Ό 톡해 κΈ°κ³„μ–΄λ‘œ 직접 λ³€ν™˜λ˜λ―€λ‘œ, 인터프리터 없이 μ‹€ν–‰ 속도가 λΉ λ₯΄λ‹€.

JIT 컴파일러(Just-In-Time Compiler)

인터프리터(Interpreter)의 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ λ„μž…λœ λ°©μ‹μœΌλ‘œ 반볡 μ½”λ“œκ°€ 발견되면 λ°”μ΄νŠΈ μ½”λ“œ 전체λ₯Ό 컴파일 ν•˜μ—¬ Native Code둜 λ³€κ²½ν•˜κ³  μ΄ν›„μ—λŠ” ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό 더 이상 μΈν„°ν”„λ¦¬νŠΈ ν•˜μ§€ μ•Šκ³  캐싱 ν•΄λ‘μ—ˆλ‹€κ°€ Native Code둜 직접 μ‹€ν–‰ν•˜λŠ” 방식이닀.

μ‹€ν–‰ 속도가 인터프리터(Interpreter)보닀 λΉ λ₯΄λ‹€.

πŸ€” Native Codeλž€, CPUκ°€ 직접 μ‹€ν–‰ν•  수 μžˆλŠ” 기계어 μ½”λ“œ(Machine Code)λ₯Ό μ˜λ―Έν•œλ‹€.

Garbage Collector

JVM(Java Virtual Machine)은 Garbage Collectorλ₯Ό 톡해 Heap λ©”λͺ¨λ¦¬ μ˜μ—­μ—μ„œ 더이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ νšŒμˆ˜ν•΄μ€€λ‹€. 이 뢀뢄은 λ’€μ—μ„œ 더 μžμ„Έν•˜κ²Œ 정리할렀고 ν•œλ‹€.


λŸ°νƒ€μž„ 데이터 μ˜μ—­ (Runtime Data Area)

JVM(Java Virtual Machine)의 λ©”λͺ¨λ¦¬ μ˜μ—­μœΌλ‘œ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λ•Œ, μ‚¬μš©λ˜λŠ” 데이터듀을 μ μž¬ν•˜λŠ” μ˜μ—­μ΄λ‹€.

Method Area

  • 클래슀 정보, λ©”μ„œλ“œ μ½”λ“œ, μƒμˆ˜, static λ³€μˆ˜ 등을 μ €μž₯ν•˜λŠ” μ˜μ—­
  • JVM이 μ‹€ν–‰λ˜λŠ” λ™μ•ˆ κ³΅μœ λ˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­
  • Runtime Constant Pool도 ν¬ν•¨λ˜μ–΄ μžˆμ–΄, ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€μ˜ μƒμˆ˜, λ¬Έμžμ—΄, λ©”μ„œλ“œ μ°Έμ‘° 등을 μ €μž₯

Heap

  • JVMμ—μ„œ μƒμ„±λ˜λŠ” λͺ¨λ“  객체와 배열이 μ €μž₯λ˜λŠ” μ˜μ—­
  • GC(Garbage Collector)κ°€ κ΄€λ¦¬ν•˜λŠ” μ£Όμš” μ˜μ—­
  • 객체의 생λͺ…주기에 따라 λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλ˜κ³ , 더 이상 μ°Έμ‘°λ˜μ§€ μ•ŠμœΌλ©΄ GC에 μ˜ν•΄ νšŒμˆ˜λœλ‹€.

Heapμ˜μ—­μ€ λ©”μ„œλ“œ μ˜μ—­κ³Ό ν•¨κ»˜ λͺ¨λ“  μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•˜λ©°, JVM이 κ΄€λ¦¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨ μƒμ—μ„œ 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ λŸ°νƒ€μž„ μ‹œ λ™μ μœΌλ‘œ ν• λ‹Ήν•˜μ—¬ μ‚¬μš©ν•˜λŠ” μ˜μ—­μ΄λ‹€.

즉, new μ—°μ‚°μžλ‘œ μƒμ„±λ˜λŠ” ν΄λž˜μŠ€μ™€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, λ°°μ—΄ νƒ€μž„λ“± Reference Type이 μ €μž₯λ˜λŠ” 곳이닀.

μœ μ˜ν•  점은, νž™(Heap) μ˜μ—­μ— μƒμ„±λœ 객체와 배열은 λͺ¨λ‘ μ°Έμ‘° νƒ€μž…(Reference Type) μœΌλ‘œμ„œ, JVM μŠ€νƒ(Stack) μ˜μ—­μ˜ λ³€μˆ˜λ‚˜ λ‹€λ₯Έ 객체의 ν•„λ“œμ—μ„œ μ°Έμ‘°λœλ‹€λŠ” 점이닀.

즉, νž™μ— μƒμ„±λœ 객체의 μ°Έμ‘° μ£Όμ†ŒλŠ” μŠ€νƒμ΄ κ°€μ§€κ³  있으며, μŠ€νƒμ— μžˆλŠ” μ°Έμ‘° λ³€μˆ˜λ₯Ό ν†΅ν•΄μ„œλ§Œ νž™ μ˜μ—­μ˜ μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•˜κ³  μ‘°μž‘ν•  수 μžˆλ‹€.

λ‹€μ‹œ 말해, νž™μ˜ κ°μ²΄λŠ” μŠ€νƒμ˜ μ°Έμ‘° νƒ€μž… λ³€μˆ˜μ™€ μ—°κ²°λ˜μ–΄ μžˆλŠ” ꡬ쑰이닀.

예λ₯Ό λ“€μ–΄ 그림을 보면, μŠ€νƒμ—λŠ” name, party, birth, weight λ„€ 개의 λ³€μˆ˜κ°€ μ‘΄μž¬ν•œλ‹€.

이 쀑 birth(200406)와 weight(3.5)λŠ” κΈ°λ³Έ νƒ€μž…μœΌλ‘œ μŠ€νƒ μ•ˆμ— 값이 직접 μ €μž₯λ˜μ–΄ μžˆμ§€λ§Œ,

nameκ³Ό partyλŠ” μ°Έμ‘° νƒ€μž…μœΌλ‘œ 각각 100λ²ˆμ§€μ™€ 200λ²ˆμ§€μ˜ μ£Όμ†Œκ°’λ§Œ κ°€μ§€κ³  μžˆλ‹€.

이 μ£Όμ†Œλ₯Ό 따라가면 νž™ μ˜μ—­μ˜ "심두리"(100λ²ˆμ§€)와 "κ°•μ•„μ§€"(200λ²ˆμ§€) 객체λ₯Ό 찾을 수 μžˆλ‹€.

즉, μŠ€νƒμ˜ name λ³€μˆ˜λ₯Ό ν†΅ν•΄μ„œλ§Œ νž™μ— μžˆλŠ” "심두리" 객체λ₯Ό μ‘°μž‘ν•  수 있고, party λ³€μˆ˜ μ—­μ‹œ "κ°•μ•„μ§€" 객체λ₯Ό μ°Έμ‘°ν•˜κ³  μžˆλŠ” 것이닀.

그런데 λ§Œμ•½ name λ³€μˆ˜λ₯Ό μ œκ±°ν•˜κ±°λ‚˜ λ‹€λ₯Έ 객체λ₯Ό μ°Έμ‘°ν•˜κ²Œ 되면 νž™μ˜ "심두리" κ°μ²΄λŠ” 더 이상 μ–΄λ–€ λ³€μˆ˜μ—μ„œλ„ μ°Έμ‘°λ˜μ§€ μ•Šκ²Œ λœλ‹€.

μ΄λ ‡κ²Œ μ°Έμ‘°ν•˜λŠ” μŠ€νƒ λ³€μˆ˜λ‚˜ ν•„λ“œκ°€ 사라진 κ°μ²΄λŠ” 의미 μ—†λŠ” 데이터가 λ˜μ–΄ μ“°λ ˆκΈ° 객체(Garbage Object) 둜 μ·¨κΈ‰λœλ‹€.

μ΄λ•Œ JVM은 κ°€λΉ„μ§€ 컬렉터(Garbage Collector) λ₯Ό μ‹€ν–‰ν•˜μ—¬ 이런 μ“°λ ˆκΈ° 객체λ₯Ό νž™ μ˜μ—­μ—μ„œ μžλ™μœΌλ‘œ μ œκ±°ν•¨μœΌλ‘œμ¨ λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό μ •λ¦¬ν•˜κ³  효율적으둜 κ΄€λ¦¬ν•œλ‹€.

πŸ€” GCλ₯Ό μ˜λ„μ μœΌλ‘œ System.gc()λ₯Ό μ‚¬μš©ν•˜μ—¬ 호좜 κ°€λŠ₯ν•˜μ§€λ§Œ, μ˜€λ²„ν—€λ“œκ°€ ꡉμž₯히 ν¬λ―€λ‘œ Garbage Collectorμ—κ²Œ λ©”λͺ¨λ¦¬ ν•΄μ œλ₯Ό λ―Ώκ³  λ§‘κΈ°λŠ”κ±Έ μΆ”μ²œ

이처럼 Heapμ˜μ—­μ€ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(GC) λŒ€μƒμ΄ λ˜λŠ” 곡간이고, 효율적인 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(GC)을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ 크게 Young Generation, Old Generation으둜 λ‚˜λˆˆλ‹€.

Young Generation

생λͺ… μ£ΌκΈ°κ°€ 짧은 객체λ₯Ό κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(GC) λŒ€μƒμœΌλ‘œ ν•˜λŠ” μ˜μ—­

  • Eden: newλ₯Ό 톡해 μƒˆλ‘œ μƒμ„±λœ 객체가 μœ„μΉ˜, 정기적인 μ“°λ ˆκΈ° μˆ˜μ§‘ ν›„ 살아남은 객체듀을 Survivor둜 디동
  • Survivor 0 / 1: 각 μ˜μ—­μ΄ μ±„μ›Œμ§€κ²Œ 되면, 살아남은 κ°μ²΄λŠ” λΉ„μ›Œμ§„ Survivor둜 순차적 이동
  • Minor GCκ°€ λ°œμƒ

Old Generation

생λͺ… μ£ΌκΈ°κ°€ κΈ΄ 객체λ₯Ό GCλŒ€μƒμœΌλ‘œ ν•˜λŠ” μ˜μ—­, Young Generationμ—μ„œ λ§ˆμ§€λ§‰κΉŒμ§€ 살아남은 객체가 이동

  • Major GC(Full GC)κ°€ λ°œμƒ

πŸ€” μ™œ ꡳ이 Young Generationκ³Ό Old Generation으둜 λ‚˜λˆ΄μ„κΉŒ?
GC μ„€κ³„μžλ“€μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λΆ„μ„ν•œ κ²°κ³Ό, λŒ€λΆ€λΆ„μ˜ 객체가 수λͺ…이 μ§§λ‹€λŠ” 사싀을 λ°œκ²¬ν–ˆλ‹€. GCλŠ” μ‹€ν–‰ μžμ²΄κ°€ λΉ„μš©μ΄ λ“œλŠ” μž‘μ—…μ΄λ―€λ‘œ, λ©”λͺ¨λ¦¬ 전체λ₯Ό νƒμƒ‰ν•˜κΈ°λ³΄λ‹€λŠ” νŠΉμ • μ˜μ—­λ§Œ κ²€μ‚¬ν•˜μ—¬ ν•΄μ œν•˜λŠ” 것이 νš¨μœ¨μ μ΄λ‹€. λ”°λΌμ„œ μƒλŒ€μ μœΌλ‘œ 금방 μ‚¬λΌμ§€λŠ” 객체가 λ§Žμ€ Young Generationμ—μ„œ μš°μ„ μ μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•˜λ„λ‘ μ„€κ³„λ˜μ—ˆλ‹€.

κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(GC)μ—μ„œ μ‚¬μš©ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜

1. Reference Counting

κ·Έλ¦Όμ—μ„œ Root SpaceλŠ” μŠ€νƒ λ³€μˆ˜λ‚˜ μ „μ—­ λ³€μˆ˜μ²˜λŸΌ νž™μ— μžˆλŠ” 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹œμž‘μ  역할을 ν•˜λŠ” 곡간이닀.

Reference Counting λ°©μ‹μ—μ„œλŠ” νž™μ— μžˆλŠ” 각 객체가 μ°Έμ‘°λ˜λŠ” 횟수(reference count)λ₯Ό κ°€μ§€κ³  μžˆλ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€. 이 μˆ«μžλŠ” ν•΄λ‹Ή 객체에 μ ‘κ·Όν•  수 μžˆλŠ” κ²½λ‘œκ°€ λͺ‡ κ°œμΈμ§€λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. λ§Œμ•½ μ°Έμ‘° νšŸμˆ˜κ°€ 0이 되면, 더 이상 객체에 μ ‘κ·Όν•  수 μ—†μœΌλ―€λ‘œ λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλœλ‹€. Swiftκ°€ 이 방식을 μ‚¬μš©ν•΄ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•œλ‹€.

ν•˜μ§€λ§Œ Reference Counting은 μˆœν™˜ μ°Έμ‘°(Circular Reference) 문제λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, Root Spaceμ—μ„œ λͺ¨λ“  νž™ 객체에 λŒ€ν•œ μ°Έμ‘°λ₯Ό λŠμ–΄λ„, μ„œλ‘œ μ°Έμ‘°ν•˜κ³  μžˆλŠ” 객체듀이 μžˆλ‹€λ©΄ κ·Έλ“€μ˜ reference countλŠ” 0이 λ˜μ§€ μ•Šκ³  κ·ΈλŒ€λ‘œ λ‚¨λŠ”λ‹€. κ·Έλ¦Ό 속 λ…Έλž€μƒ‰ 고리 μ•ˆμ˜ 객체듀이 이런 κ²½μš°λ‹€. 결과적으둜 더 이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” κ°μ²΄μž„μ—λ„ λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλ˜μ§€ μ•Šμ•„ λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν•œλ‹€.

2. Mark and Sweep

Mark and Sweep μ•Œκ³ λ¦¬μ¦˜μ€ Root Spaceμ—μ„œ μ‹œμž‘ν•΄ 객체에 μ ‘κ·Όν•  수 μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό κΈ°μ€€μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•œλ‹€.

Root Spaceμ—μ„œ μ—°κ²°λœ 객체λ₯Ό 탐색(Mark)ν•˜κ³ , μ—°κ²°λ˜μ§€ μ•Šμ€ κ°μ²΄λŠ” 제거(Sweep)ν•œλ‹€. Root Spaceμ—μ„œ 닿을 수 μžˆλŠ” κ°μ²΄λŠ” Reachable, 닿을 수 μ—†λŠ” κ°μ²΄λŠ” Unreachable둜 κ΅¬λΆ„λœλ‹€.

Mark and Sweep 방식을 μ‚¬μš©ν•˜λ©΄ Reference Counting λ°©μ‹μ—μ„œ λ¬Έμ œκ°€ λ˜λŠ” μˆœν™˜ μ°Έμ‘° 객체도 μ•ˆμ „ν•˜κ²Œ μ œκ±°ν•  수 μžˆλ‹€. μ‹€μ œλ‘œ Java와 JavaScriptκ°€ 이 방식을 μ‚¬μš©ν•΄ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•œλ‹€.

ν•˜μ§€λ§Œ 단점도 μžˆλ‹€. Reference Counting처럼 객체가 ν•„μš” μ—†μ–΄μ§„ μ¦‰μ‹œ μ§€μ›Œμ§€μ§€ μ•Šκ³ , GCλ₯Ό νŠΉμ • μ‹œμ μ— μ‹€ν–‰ν•΄μ•Ό ν•œλ‹€λŠ” 점이닀. 즉, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ GCκ°€ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ, μ„±λŠ₯κ³Ό μ‚¬μš©μž κ²½ν—˜μ„ κ³ λ €ν•΄ 적절히 GCλ₯Ό μ‹€ν–‰ν•˜λŠ” μ „λž΅μ΄ ν•„μš”ν•˜λ‹€.

  • Mark and Sweep은 μ˜λ„μ μœΌλ‘œ GCλ₯Ό μ‹€ν–‰ν•΄μ•Όν•œλ‹€.
  • Mark and Sweep은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό GC 싀행이 병행 λœλ‹€.

Mark and Sweepκ³Ό JVM GC νŠΉμ§• μš”μ•½

Mark and Sweep λ°©μ‹μ—μ„œλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό GCκ°€ λ™μ‹œμ— 싀행될 수 μžˆλ‹€.

Serial GC

  • 단일 μŠ€λ ˆλ“œλ‘œ GC μ‹€ν–‰ β†’ STW μ‹œκ°„μ΄ κΈΈλ‹€.
  • μž‘μ€ νž™κ³Ό μ‹±κΈ€ μ½”μ–΄ ν™˜κ²½μ— 적합.
  • Compaction μˆ˜ν–‰.

Parallel GC

  • μ—¬λŸ¬ μŠ€λ ˆλ“œλ‘œ GC μ‹€ν–‰ β†’ STW μ‹œκ°„ 단좕
  • λ©€ν‹° μ½”μ–΄ ν™˜κ²½μ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 처리 속도 ν–₯상.
  • Java 8 κΈ°λ³Έ GC

CMS GC (Concurrent-Mark-Sweep)

  • λŒ€λΆ€λΆ„μ˜ GC μž‘μ—…μ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό λ™μ‹œμ— μˆ˜ν–‰ β†’ STW μ΅œμ†Œν™”
  • λ©”λͺ¨λ¦¬μ™€ CPUλ₯Ό 많이 μ‚¬μš©, Compaction κΈ°λ³Έ 제곡 X β†’ μž₯κΈ° 운영 μ‹œ λ©”λͺ¨λ¦¬ λ‹¨νŽΈν™” κ°€λŠ₯
  • Java 9λΆ€ν„° deprecated, Java 14 이후 μ‚¬μš© 쀑단.
  • 단계: Initial Mark β†’ Concurrent Mark β†’ Remark β†’ Concurrent Sweep

G1 GC (Garbage First)

  • νž™μ„ μ—¬λŸ¬ Region으둜 λ‚˜λˆ„μ–΄ Young/Old Generation으둜 관리
  • ν•„μš”μ— 따라 Region 개수λ₯Ό λ™μ μœΌλ‘œ μ‘°μ • β†’ STW μ΅œμ†Œν™”
  • Java 9 이상 κΈ°λ³Έ GC

πŸ€” GC 싀행을 μœ„ν•΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ©ˆμΆ”λŠ” 것을 Stop The World(STW)라고 ν•œλ‹€.

Stack

  • 각 μŠ€λ ˆλ“œλ§ˆλ‹€ μƒμ„±λ˜λŠ” μŠ€λ ˆλ“œ μ „μš© μ˜μ—­

  • λ©”μ„œλ“œ 호좜 μ‹œ μƒμ„±λ˜λŠ” ν”„λ ˆμž„(Frame) 을 μ €μž₯ν•˜κ³ , μ§€μ—­ λ³€μˆ˜, λ§€κ°œλ³€μˆ˜, μ—°μ‚° 쀑간 κ°’ 등을 관리

  • λ©”μ„œλ“œκ°€ μ’…λ£Œλ˜λ©΄ ν•΄λ‹Ή ν”„λ ˆμž„μ€ 제거됨

PC Register

  • 각 μŠ€λ ˆλ“œλ§ˆλ‹€ λ…λ¦½μ μœΌλ‘œ 쑴재

  • ν˜„μž¬ μ‹€ν–‰ 쀑인 JVM λͺ…λ Ήμ–΄ μ£Όμ†Œ(Program Counter) λ₯Ό 가리킴.

  • λ©”μ„œλ“œ 호좜과 볡귀 μ‹œ JVM이 μ–΄λ””μ„œ μ‹€ν–‰ 쀑인지 μΆ”μ ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©

Native Method Stacks

  • C/C++둜 μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ(Native Method)λ₯Ό μœ„ν•œ μŠ€νƒ μ˜μ—­

  • JVM λ‚΄λΆ€μ—μ„œ Javaκ°€ μ•„λ‹Œ μ™ΈλΆ€ 라이브러리λ₯Ό ν˜ΈμΆœν•  λ•Œ μ‚¬μš©

  • μŠ€λ ˆλ“œλ§ˆλ‹€ λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•˜λ©°, 둜컬 λ³€μˆ˜μ™€ 호좜 정보λ₯Ό 관리


μ°Έκ³ 

profile
λ…Έλ ₯은 λ°°μ‹ ν•˜μ§€ μ•Šμ•„ πŸ”₯

0개의 λŒ“κΈ€