JVM


JVM ๊ตฌ์„ฑ์š”์†Œ

  • ์œ ์ €๋ชจ๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค, ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™œ์šฉ, ๋จธ์‹ ์œผ๋กœ์„œ ์—ฐ์‚ฐ, os์˜ ์ผ๋ถ€๊ธฐ๋Šฅ
  • jvm ๊ตฌ์„ฑ์š”์†Œ
    • ํด๋ž˜์Šค ๋กœ๋”(Class Loader)
      • ์ž๋ฐ” ํด๋ž˜์Šค ํŒŒ์ผ(.class)์„ ๋กœ๋“œํ•˜๊ณ  ๋งํฌํ•˜๋Š” ์—ญํ• 
      • ๋กœ๋”ฉ, ๋งํ‚น, ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋จ
      • ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํด๋ž˜์Šค ๋กœ๋”, ํ™•์žฅ ํด๋ž˜์Šค ๋กœ๋”, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค ๋กœ๋”๋กœ ๊ตฌ์„ฑ
      • ํด๋ž˜์Šค ๋กœ๋”ฉ ๋งํ‚น๋“ฑ์ด ๋Ÿฐํƒ€์ž„์— ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.
    • ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ(Runtime Data Area)
      • ๋ฉ”์„œ๋“œ ์˜์—ญ(Method Area): ํด๋ž˜์Šค ๊ตฌ์กฐ, ๋ฉ”์„œ๋“œ ๋ฐ์ดํ„ฐ, ์ƒ์ˆ˜, ์ •์  ๋ณ€์ˆ˜ ๋“ฑ ์ €์žฅ
      • ํž™(Heap): ๊ฐ์ฒด์™€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„
      • ์Šคํƒ(Stack): ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๋ณ„๋„๋กœ ์กด์žฌํ•˜๋ฉฐ ์ง€์—ญ ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฆฌํ„ด ๊ฐ’ ๋“ฑ ์ €์žฅ
      • PC ๋ ˆ์ง€์Šคํ„ฐ(Program Counter Register): ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น์–ด ์ฃผ์†Œ ์ €์žฅ
      • ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ(Native Method Stack): ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ์Šคํƒ
    • ์‹คํ–‰ ์—”์ง„(Execution Engine)
      • ์ธํ„ฐํ”„๋ฆฌํ„ฐ(Interpreter): ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„์”ฉ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰
      • JIT ์ปดํŒŒ์ผ๋Ÿฌ(Just-In-Time Compiler): ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ์„ฑ๋Šฅ ํ–ฅ์ƒ
      • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(Garbage Collector): ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ž๋™ ์ •๋ฆฌ
    • ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์ธํ„ฐํŽ˜์ด์Šค(JNI, Java Native Interface)
      • ์ž๋ฐ” ์ฝ”๋“œ๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ C, C++ ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ
    • ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Native Method Libraries)
      • C, C++ ๋“ฑ์œผ๋กœ ์ž‘์„ฑ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ์Œ

ํด๋ž˜์Šค๋กœ๋”

.class file(์‹คํ–‰ ๋ฐ”์ด๋„ˆ๋ฆฌ)

ClassFile {
    u4             magic;              // ๋งค์ง๋„˜๋ฒ„(0xCAFEBABE), JVM์ด ์œ ํšจํ•œ ํด๋ž˜์Šค ํŒŒ์ผ์ธ์ง€ ์‹๋ณ„
    u2             minor_version;      // ํด๋ž˜์Šค ํŒŒ์ผ ํฌ๋งท์˜ ๋งˆ์ด๋„ˆ ๋ฒ„์ „
    u2             major_version;      // ํด๋ž˜์Šค ํŒŒ์ผ ํฌ๋งท์˜ ๋ฉ”์ด์ € ๋ฒ„์ „
    u2             constant_pool_count; // ์ƒ์ˆ˜ ํ’€ ํ•ญ๋ชฉ ์ˆ˜ + 1
    cp_info        constant_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]; // ํด๋ž˜์Šค์˜ ์ถ”๊ฐ€ ์†์„ฑ ์ •๋ณด
}
  • ์ถ”๊ฐ€์ ์œผ๋กœ .class๋ฅผ ๋ณด๊ณ  ์‹ค์ œ ๋„ค์ดํ‹ฐ๋ธŒ ๋จธ์‹ ์ฝ”๋“œ๋กœ interprete, ๋ฐ˜๋ณต๋˜๋Š” ์• ๋“ค์„ ๋ฏธ๋ฆฌ ๋ฒˆ์—ญํ•ด๋†“๋Š”(์ปดํŒŒ์ผ) ์• ๋“ค์ด jit compiler
  • ์ด๋ฆ„์„ ์•Œ๊ณ  ์žˆ๋Š” ํŠน์ • ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ •์˜(byte stream)์„ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰
  • ๊ฐ€์ ธ์˜จ๋‹ค๋Š” ๊ฒƒ์€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๋Š”๊ฒƒ์„ ํฌํ•จ
    • ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํด๋ž˜์Šค ๋กœ๋”
      • (๋น„์œ ํ•˜์ž๋งŒ, ์‹ค์ œ cpu์˜ ๋ถ€ํŠธ๋กœ๋”๊ฐ€ ํ•„์š”ํ•œ์ผ์„ ๋งˆ์น˜๊ณ , os์ฝ”๋“œ์˜ ์ง„์ž…์ง€์ ์„ ์‹คํ–‰์‹œํ‚ค๊ณ  ์ข…๋ฃŒ๋˜๋Š”๋ฐ ๋งˆ์ฐฌ๊ฐ€์ง€)
      • jvm์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ทจ๊ธ‰๋˜๋Š”๊ฒƒ๋“ค(rt.jar, tools.jar)์„ ๋กœ๋“œ
    • ํ”Œ๋žซํผ ํด๋ž˜์Šค ๋กœ๋” (๊ธฐ์กด ํ™•์žฅ ํด๋ž˜์Šค ๋กœ๋”)
      • ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋“œ
    • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค ๋กœ๋”
  • Java ํด๋ž˜์Šค ๋กœ๋”ฉ
    • java๋Š” ์‹คํ–‰๊ณผ์ •์— ๋งํ‚น ๊ณผ์ •์ด ํฌํ•จ๋˜์–ด์žˆ์Œ
    • ๊ธฐ์กด์˜ ์ปดํŒŒ์ผ - ๋งํฌ - ๋Ÿฐํƒ€์ž„๋ณด๋‹ค๋Š”
    • ์‹ค์ œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋กœ๋”ฉํ•˜๊ณ , ๋งํฌ ๋Ÿฐํƒ€์ž„์ด ์‹คํ–‰๋‹จ๊ณ„์— ๋ถ„๋ฅ˜๋˜์–ด์žˆ์Œ
    • ์‹ค์งˆ์ ์œผ๋กœ๋Š” Loading -> Linking -> Using -> Unloading(GC)
    • ํ•ด์„ (Resolution)๋‹จ๊ณ„๋Š” ๋™์  ๋ฐ”์ธ๋”ฉ(ํ˜น์€ lazy binding)์„ ์ง€์›ํ•  ๋ชฉ์ ์œผ๋กœ ์ดˆ๊ธฐํ™” ํ›„๋กœ ์ง€์—ฐ๋  ์ˆ˜์žˆ์Œ
ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ํ•˜๋Š” ์ผ
  • ํด๋ž˜์Šค ๊ฒ€์ฆ
    • ๊ทœ์น™๊ณผ ์ œ์•ฝ์„ ๋งŒ์กฑํ•˜๋Š”์ง€
      • ํŒŒ์ผํ˜•์‹
      • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
      • ๋ฐ”์ดํŠธ์ฝ”๋“œ
      • ์‹ฌ๋ฒŒ์ฐธ์กฐ
    • ๋ณด์•ˆ์œ„ํ˜‘์— ๋Œ€ํ•œ ๊ฒ€์ฆ ํฌํ•จ
  • ์ค€๋น„ ๋ฐ ํ•ด์„
    • java.lang.Class ์ธ์Šคํ„ด์Šค(๋ฉ”ํƒ€๋ฐ์ดํ„ฐ)๊ฐ€ ํž™ ์˜์—ญ์— ์ƒ์„ฑ, ํด๋ž˜์Šค ๋ณ€์ˆ˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
      • ๋กœ๋“œ๋˜๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” Using๋‹จ๊ณ„์—์„œ ํž™์‚ฌ์šฉ
      • final์„ ์–ธ๋œ ๋ณ€์ˆ˜ ์ •๋ฆฌ
    • ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์ „ ์ƒํƒœ
      • ํ•„๋“œ ์ดˆ๊นƒ๊ฐ’์€ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์‹œ ์ •์˜
      • ์ •์ ํ•„๋“œ์— ์ดˆ๊ธฐ๊ฐ’ ํ• ๋‹น
    • ํ•ด์„์€ ์ƒ์ˆ˜ํ’€์˜ ์‹ฌ๋ฒŒ ์ฐธ์กฐ๋ฅผ ์ง์ ‘ ์ฐธ์กฐ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ณผ์ •
  • Heap ์˜์—ญ์— ๊ฐ์ฒด ์ƒ์„ฑ
    • jvm์€ ๊ฐ์ฒด ์ €์žฅ์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณด ํ›„ 0์œผ๋กœ ์ดˆ๊ธฐํ™” (๊ฐ์ฒด ํ—ค๋” ์ œ์™ธ)
    • ๊ฐ์ฒด ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๊ตฌ์„ฑ์„ค์ • ์‹ค์‹œ
      • ๊ธฐ๋ณธ์ ์œผ๋กœ object header, instance data, padding์œผ๋กœ ๋˜์–ด์žˆ์Œ
        • object header(์˜ klass word)๋ฅผ ํ†ตํ•ด ์•„๊นŒ ๋กœ๋“œํ•œ metadata์— ์ ‘๊ทผ
      • ํด๋ž˜์Šค ์ด๋ฆ„ ๋ฐ ๋ฉ”ํƒ€ ์ •๋ณด ํ™•์ธ ๋ฐฉ๋ฒ•
      • ๊ฐ์ฒด์— ๋Œ€ํ•œ ํ•ด์‹œ์ฝ”๋“œ
      • GC์„ธ๋Œ€ ๋‚˜์ด
    • ์ƒ์„ฑ์ž ํ˜ธ์ถœ

๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ

Image

ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ

  • ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ๋Š” ์ž‘์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์Šค๋ ˆ๋“œ์˜ โ€˜๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ค„ ๋ฒˆํ˜ธ ํ‘œ์‹œ๊ธฐโ€™๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค.
  • ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ธํ„ฐํ”ผ๋ฅดํ„ฐ๋Š” ์ด ์นด์šดํ„ฐ ๊ฐ’์„ ๋ฐ”๊ฟ” ๋‹ค์Œ์— ์‹คํ–‰ํ•  ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋ช…๋ น์–ด๋ฅผ ์„ ํƒํ•˜๋Š”์‹์œผ๋กœ ๋™์ž‘
  • ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด ํ๋ฆ„, ๋ถ„๊ธฐ, ์ˆœํ™˜, ์ ํ”„๋“ฑ์„ ํ‘œํ˜„
  • ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋‚˜ ์Šค๋ ˆ๋“œ๋ณต์›๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์ด ํ‘œ์‹œ๊ธฐ๋ฅผ ํ™œ์šฉํ•ด ๋™์ž‘
  • jvm์˜ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์€ cpu์ฝ”์–ด๋ฅผ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ต๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํŠน์ • ์‹œ๊ฐ์— ํ•œ ์ฝ”์–ด๋Š” ํ•œ ์Šค๋ ˆ๋“œ์˜ ๋ช…๋ น์–ด๋งŒ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์Šค๋ ˆ๋“œ ์ „ํ™˜ ํ›„ ์ด์ „์— ์‹คํ–‰ํ•˜๋‹ค ๋ฉˆ์ถ˜ ์ง€์ ์„ ์ •ํ™•ํ•˜๊ฒŒ ๋ณต์›ํ•˜๋ ค๋ฉด ์Šค๋ ˆ๋“œ ๊ฐ๊ฐ์—๋Š” ๊ณ ์œ ํ•œ ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • ๋”ฐ๋ผ์„œ ๊ฐ ์Šค๋ ˆ๋“œ์˜ ์นด์šดํ„ฐ๋Š” ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๋…๋ฆฝ๋œ ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค. ์ด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํ”„๋ผ์ด๋น— ๋ฉ”๋ชจ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.
  • ์Šค๋ ˆ๋“œ๊ฐ€ ์ž๋ฐ” ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์ค‘์ผ ๋•Œ๋Š” ์‹คํ–‰์ค‘์ธ ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ์— ๊ธฐ๋ก๋œ๋‹ค.
  • ํ•œ ํŽธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์ค‘์ผ ๋•Œ ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ ๊ฐ’์€ undefined๋‹ค ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ oom ์กฐ๊ฑด์ด ๋ช…์‹œ๋˜์ง€ ์•Š์€ ์œ ์ผํ•œ ์˜์—ญ์ด๊ธฐ๋„ ํ•˜๋‹ค.

์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹  ์Šคํƒ

  • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šค๋ ˆ๋“œ ํ”„๋ผ์ด๋น—ํ•˜๋ฉฐ, ์Šค๋ ˆ๋“œ์™€ ์ˆ˜๋ช…์ฃผ๊ธฐ๊ฐ€ ๊ฐ™๋‹ค.
  • ๊ฐ€์ƒ๋จธ์‹ ์Šคํƒ์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์„ ์„ค๋ช…ํ•ด์ค€๋‹ค.
  • ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์‹œ ์Šคํƒํ”„๋ ˆ์ž„๋งŒ๋“ค๊ณ , ์ง€์—ญ๋ณ€์ˆ˜ ํ…Œ์ด๋ธ”, ํ”ผ์—ฐ์‚ฐ์ž ์Šคํƒ, ๋™์  ๋งํฌ, ๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜๊ฐ’๋“ฑ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ๊ทธ๋‹ค์Œ ์Šคํƒํ”„๋ ˆ์ž„์„ ๊ฐ€์ƒ๋จธ์‹  ์Šคํƒ์— ํ‘ธ์‹œํ•˜๊ณ , ๋ฉ”์„œ๋“œ๊ฐ€ ๋๋‚˜๋ฉด ํŒํ•˜๋Š”์ผ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • ์ง€์—ญ ๋ณ€์ˆ˜ ํ…Œ์ด๋ธ”์—๋Š” jvm์ด ์ปดํŒŒ์ผํƒ€์ž„์— ์•Œ์ˆ˜์žˆ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋ณธ๋ฐ์ดํ„ฐํƒ€์ž…, ๊ฐ์ฒด ์ฐธ์กฐ, ๋ฐ˜ํ™˜์ฃผ์†Œ ํƒ€์ž…์„ ์ €์žฅํ•œ๋‹ค.
  • ์ด๊ฑธ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์„ ์ง€์—ญ ๋ณ€์ˆ˜ ์Šฌ๋กฏ์ด๋ผ ํ•˜๊ณ  ์Šฌ๋กฏ์˜ ํฌ๊ธฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 32๋น„ํŠธ์ด๋‹ค.
  • ์ง€์—ญ ๋ณ€์ˆ˜ ํ…Œ์ด๋ธ”์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๊ณต๊ฐ„์€ ์ปดํŒŒ์ผ ๊ณผ์ •์— ํ• ๋‹น๋œ๋‹ค. ์ž๋ฐ” ๋ฉ”์„œ๋“œ๋Š” ์Šคํƒํ”„๋ ˆ์ž„์—์„œ ์ง€์—ญ๋ณ€์ˆ˜์šฉ์œผ๋กœ ํ• ๋‹น๋ฐ›์•„์•ผ ํ•  ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๊ฐ€ ์ด๋ฏธ ์™„๋ฒฝํ•˜๊ฒŒ ๊ฒฐ์ •๋˜์–ด์žˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ

  • jvm ์Šคํƒ๊ณผ ๋น„์Šท!
  • ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์‹คํ–‰๋œ๋‹ค. (๋ณดํ†ต ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋ฉ”์„œ๋“œ, jni๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ๋จ, ์ฆ‰ jvm์ด ์ง์„ญ ์‹คํ–‰ํ• ์ˆ˜์—†๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ)

์ž๋ฐ” ํž™

  • ๋ชจ๋“  ์Šค๋ ˆ๋“œ ๊ณต์œ 
  • ๋‹ค๋ฅธ ์–ธ์–ด์˜ ํž™๊ณผ ๋™์ผ
  • ๊ฑฐ์˜ ๋ชจ๋“ (์‚ฌ์‹ค์ƒ ๋ชจ๋“ )๊ฐ์ฒด๊ฐ€ ํž™์— ์ €์žฅ๋จ.
  • gc๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๊ธฐ์—, gcํž™์ด๋ผ๊ณ  ํ•จ
  • ๊ฐ์ฒด ํ• ๋‹น ํšจ์œจ์„ ๋†’์ด๊ณ ์ž ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ํ• ๋‹น ๋ฒ„ํผ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ๋‚˜๋‰œ๋‹ค. (๊ทธ๋ž˜๋„ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ํž™์— ์ €์žฅ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋งˆ์ฐฌ๊ฐ€์ง€, ์ผ๋ถ€ ๋ฉ”๋ชจ๋ฆฌํšŒ์ˆ˜์™€ ํ• ๋‹น์„ ์กฐ๊ธˆ ๋” ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ์œ„ํ•ด ์ผ์ •ํ•œ ์„ธ๋ถ€์˜์—ญ์ด ์žˆ์„ ๋ฟ)
  • ํž™์€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋–จ์–ด์ง„ ๋ฉ”๋ชจ๋ฆฌ์— ์œ„์น˜ํ•ด๋„ ์ƒ๊ด€์—†์œผ๋‚˜ ๋…ผ๋ฆฌ์ ์œผ๋กœ๋Š” ์—ฐ์†๋˜์–ด์•ผ ํ•œ๋‹ค.

๋ฉ”์„œ๋“œ ์˜์—ญ

  • ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์˜์—ญ์œผ๋กœ, JVM์ด ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋จ
  • ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€, ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ ๋ฐ์ดํ„ฐ, ๋ฉ”์„œ๋“œ์™€ ์ƒ์„ฑ์ž ์ฝ”๋“œ, ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค ์ดˆ๊ธฐํ™”์— ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ ๋“ฑ์„ ํฌํ•จ
  • ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ํด๋ž˜์Šค ํŒŒ์ผ์„ ๋กœ๋“œํ•  ๋•Œ, ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ด ์˜์—ญ์— ์ €์žฅ
  • JDK 8๊นŒ์ง€๋Š” ์ด ์˜์—ญ์„ โ€œ์˜๊ตฌ ์ƒ์„ฑ(Permanent Generation)โ€ ๋˜๋Š” โ€œPermGen"์ด๋ผ๊ณ  ๋ถˆ๋ €์Œ
  • JDK 8 ์ดํ›„์—๋Š” ๋ฉ”์„œ๋“œ ์˜์—ญ์˜ ๊ตฌํ˜„์ด โ€œ๋ฉ”ํƒ€์ŠคํŽ˜์ด์Šค(Metaspace)โ€œ๋กœ ๋ณ€๊ฒฝ๋จ
  • ๋ฉ”ํƒ€์ŠคํŽ˜์ด์Šค๋Š” ๊ธฐ์กด PermGen๊ณผ ๋‹ฌ๋ฆฌ OS๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋” ์ด์ƒ JVM ํž™ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹˜
  • ์ด ๋ณ€๊ฒฝ์œผ๋กœ OutOfMemoryError: PermGen Space ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ๋จ
  • ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ๋ฉ”์„œ๋“œ์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ, static ๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜ ์ •๋ณด ๋“ฑ์ด ์ €์žฅ๋จ
  • ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€์€ ๋ฆฌํ„ฐ๋Ÿด ์ƒ์ˆ˜, ํ•„๋“œ ์ฐธ์กฐ, ๋ฉ”์„œ๋“œ ์ฐธ์กฐ ๋“ฑ์„ ํฌํ•จํ•˜๋ฉฐ ์‹ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ฅผ ์‹ค์ œ ์ฐธ์กฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ
  • ํด๋ž˜์Šค์˜ ์ •์  ๋ณ€์ˆ˜๋Š” ์—ฌ๊ธฐ์— ์ €์žฅ๋˜์ง€๋งŒ, Java 8 ์ดํ›„์—๋Š” static ๋ณ€์ˆ˜์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ํž™์— ์ €์žฅ๋จ
  • JIT์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผํ•œ ์ฝ”๋“œ๋ฅผ ์บ์‹ฑํ•œ๋‹ค.

๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€

  • ํด๋ž˜์Šค ๋ฒ„์ „, ํ•„๋“œ, ๋ฉ”์„œ๋“œ, ์ธํ„ฐํŽ˜์ด์Šค๋“ฑ ํด๋ž˜์ŠคํŒŒ์ผ์— ํฌํ•จ๋œ ์ •๋ณด ๋ฐ ๋ฆฌํ„ฐ๋Ÿด, ์‹ฌ๋ณผ์ฐธ์กฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ
  • ํด๋ž˜์Šค๋กœ๋”๊ฐ€ ํด๋ž˜์Šค ๋กœ๋“œ์‹œ ์ƒ๊ธฐ ์ •๋ณด๋ฅผ ์ €์žฅ
  • ๋™์ ์œผ๋กœ ์šด์˜๋˜๋ฉฐ ๋Ÿฐํƒ€์ž„์— ์ƒˆ๋กœ์šด ์ƒ์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์Œ

JVM ์Šคํƒ ๊ตฌ์กฐ

  • ์ง€์—ญ๋ณ€์ˆ˜ ํ…Œ์ด๋ธ”, ํ”ผ์—ฐ์‚ฐ์ž ์Šคํƒ, ๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜๊ฐ’๋“ฑ์„ ์ €์žฅ
  • ๋ณดํ†ต ์ง€์—ญ๋ณ€์ˆ˜ ํ…Œ์ด๋ธ”์„ ์Šคํƒ์œผ๋กœ ์ง€์นญ
  • ์ง€์—ญ๋ณ€์ˆ˜ ํ…Œ์ด๋ธ”์€ ์Šฌ๋กฏ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ๊ธฐ๋ณธํ˜• ๋ณ€์ˆ˜ ํ•˜๋‚˜๊ฐ€ ์Šฌ๋กฏํ•œ๊ฐœ๋ฅผ ์‚ฌ์šฉ
  • java ์Šคํƒ์˜ ํฌ๊ธฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰์ด ์•„๋‹Œ ์Šฌ๋กฏ์˜ ๊ฐœ์ˆ˜
  • jvm์ด ํ—ˆ์šฉํ•˜๋Š” ์Šคํƒ์˜ ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ• ๊ฒฝ์šฐ stackoverflow

์Šคํƒ ํ”„๋ ˆ์ž„ ๊ตฌ์กฐ

๊ตฌ์„ฑ ์š”์†Œ ์„ค๋ช…
์ง€์—ญ ๋ณ€์ˆ˜ ๋ฐฐ์—ด(Local Variable Array) โ€ข ๋ฉ”์„œ๋“œ์˜ ์ง€์—ญ ๋ณ€์ˆ˜ ์ €์žฅ
โ€ข ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ๋„ ์—ฌ๊ธฐ ์ €์žฅ
โ€ข ์ธ๋ฑ์Šค 0๋ถ€ํ„ฐ ์‹œ์ž‘
โ€ข ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค 0์€ โ€™thisโ€™ ์ฐธ์กฐ
โ€ข ๊ฐ ์Šฌ๋กฏ์€ 32๋น„ํŠธ ํฌ๊ธฐ
โ€ข long, double์€ ๋‘ ์Šฌ๋กฏ ์ฐจ์ง€
ํ”ผ์—ฐ์‚ฐ์ž ์Šคํƒ(Operand Stack) โ€ข ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ค‘ ์ž„์‹œ ์ž‘์—… ๊ณต๊ฐ„
โ€ข ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋ช…๋ น์–ด์˜ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ push/pop
โ€ข ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ์ธ์ž๊ฐ’ ์ „๋‹ฌ์— ์‚ฌ์šฉ
โ€ข JVM์€ ์Šคํƒ ๊ธฐ๋ฐ˜ ํ•ด์„๊ธฐ
๋™์  ๋งํฌ(Dynamic Linking) โ€ข ์ƒ์ˆ˜ ํ’€์˜ ์‹ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ฅผ ์‹ค์ œ ์ฐธ์กฐ๋กœ ๋ณ€ํ™˜
โ€ข ์‹คํ–‰ ์‹œ ๋ฉ”์„œ๋“œ๋‚˜ ํ•„๋“œ ์ฐธ์กฐ ํ•ด๊ฒฐ
โ€ข ๋Ÿฐํƒ€์ž„์— ํด๋ž˜์Šค ๊ฐ„ ์—ฐ๊ฒฐ ์„ค์ •
๋ฐ˜ํ™˜ ์ฃผ์†Œ(Return Address) โ€ข ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์™„๋ฃŒ ํ›„ ๋Œ์•„๊ฐˆ ์ฃผ์†Œ
โ€ข ํ˜ธ์ถœ์ž์˜ ์Šคํƒ ํ”„๋ ˆ์ž„ ์œ„์น˜ ์ •๋ณด
โ€ข ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ƒ/์˜ˆ์™ธ์ ์œผ๋กœ ์ข…๋ฃŒ๋œ ๋’ค ์‚ฌ์šฉ
๋ถ€๊ฐ€ ์ •๋ณด(Additional Information) โ€ข ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ •๋ณด
โ€ข ๋””๋ฒ„๊น… ์ •๋ณด
โ€ข JVM ๊ตฌํ˜„์— ๋”ฐ๋ผ ์ถ”๊ฐ€ ์ •๋ณด ํฌํ•จ ๊ฐ€๋Šฅ

JVM ํž™ ๊ตฌ์กฐ

  • GC๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ
  • ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค ๋ฐ ๋ฐฐ์—ด์ด ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„
  • ์„ค์ •์—๋”ฐ๋ผ ํฌ๊ธฐ ๋ณ€๊ฒฝ ๊ณ ์ • ๊ฐ€๋Šฅ
  • ์„ธ๋Œ€๋ณ„ ์ปฌ๋ ‰์…˜ ์ด๋ก  (Generational collection thory)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„ ๋ฐ ์šด์˜
    • Eden, Survivor
    • New/Old Generation
    • ์˜๊ตฌ ์„ธ๋Œ€ (Metaspace)

JVM GC

  • Heap์˜์—ญ์—์„œ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐœ์ฒด๋ฅผ ์ˆ˜์ง‘ ๋ฐ ์ œ๊ฑฐํ•ด ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜
  • Minor/Major(Full) GC
    • GC์ˆ˜ํ–‰์‹œ ํ”„๋กœ๊ทธ๋žจ ์ผ์‹œ ์ •์ง€
    • stop-the-world
  • GC ์†๋„
    • Minor GC ๋ณดํ†ต 1์ดˆ์ด๋‚ด
    • Full GC 1์ดˆ์ด์ƒ ์ง€์—ฐ๋˜๊ธฐ๋„ ํ•จ -> ๋ฌธ์ œ๋Š” db์ปค๋„ฅ์…˜์ด ๋Š๊ธฐ๊ฑฐ๋‚˜ ํ•˜๋Š” ์šด์˜๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ

GC๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ๋ฌธ์ œ์˜ ํ•ต์‹ฌ 3์š”์†Œ

  • ํšŒ์ˆ˜ ๋Œ€์ƒ์„ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ
  • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜๋Š” ์‹œ์ 
  • ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜ ๋ฐฉ๋ฒ•

์„ธ๋Œ€ ๋‹จ์œ„ ์ปฌ๋ ‰์…˜ ์ด๋ก 

๋ฐ”ํƒ•์ด ๋˜๋Š” ๊ฐ€์„ค

  • ๋Œ€๋‹ค์ˆ˜ ๊ฐ์ฒด๋Š” ์ผ์ฐ ์‚ฌ๋ผ์ง(์•ฝํ•œ ์„ธ๋Œ€ ๊ฐ€์„ค)
  • gc๊ณผ์ •์—์„œ ์‚ด์•„๋‚จ์€ ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚ ์ˆ˜๋ก (์•ž์œผ๋กœ๋„) ์ƒ์กด ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง(๊ฐ•ํ•œ์„ธ๋Œ€ ๊ฐ€์„ค)
  • ๋‹ค๋ฅธ์„ธ๋Œ€์— ์†ํ•œ ๊ฐ์ฒด๊ฐ„ ์ฐธ์กฐ๋Š” ๊ฐ™์€์„ธ๋Œ€์— ์†ํ•œ ๊ฐ์ฒด๊ฐ„ ์ฐธ์กฐ๋ณด๋‹ค ํ›จ์”ฌ ์ ์Œ (์„ธ๋Œ€ ๊ฐ„ ์ฐธ์กฐ ๊ฐ€์„ค)
  • ํ•ซ์ŠคํŒŸ vm์—์„œ ์—๋ด๊ณผ ์ƒ์กด์ž ๊ณต๊ฐ„๋น„์œจ์€ ๋ณดํ†ต 8:1
    • IBM ์—ฐ๊ตฌ์— ๋”ฐ๋ฅด๋ฉด ๋ณดํ†ต ์ฒซ GC์— ๋Œ€๋žต 98% ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ
    • 10% ๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™” ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ํ™œ์šฉ (Overhead)

jvm heap ์˜์—ญ ์„ธ๋Œ€๋ณ„ space jvmgc์„ธ๋Œ€ ์ถœ์ฒ˜ : https://medium.com/@khurshidbek-bakhromjonov/java-memory-management-understanding-the-jvm-heap-method-area-stack-24a4d4fa2363

Young generation

  • eden
    • ๊ฐ์ฒด ์ƒ์„ฑ์งํ›„ ์ €์žฅ๋˜๋Š” ์˜์—ญ
    • Minor GC ๋ฐœ์ƒ์‹œ Survivor ์˜์—ญ์œผ๋กœ ์ด๋™
    • Copy & Scavenge ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • Survivor 0,1
    • Minor GC ๋ฐœ์ƒ์‹œ Eden, S0์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” S1 (S0, S1 ์„œ๋กœ ๊ต๋Œ€)
    • S1์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” Old๋กœ
    • age bit ์‚ฌ์šฉ (์ฐธ์กฐ ๊ณ„์ˆ˜)

Old generation

  • Young generation ์˜์—ญ์—์„œ ์†Œ๋ฉธํ•˜์ง€ ์•Š๊ณ  ๋‚จ์€ ๊ฐœ์ฒด๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์˜์—ญ
  • Full GC ๋ฐœ์ƒ์‹œ ๊ฐœ์ฒด ํšŒ์ˆ˜ (๋น„์šฉ์ด ํฌ๊ณ  ๋””ํ…Œ์ผํ•จ, ์‹ค์ œ๋กœ ์ •๋ง ์‚ฌ์šฉ๋˜๋Š”์ง€ ์ฐพ์Œ)
  • Mark & Compact ์•Œ๊ณ ๋ฆฌ์ฆ˜

Permanent

  • Metaspace
    • ๋กœ๋“œ๋˜๋Š” ํด๋ž˜์Šค, ๋ฉ”์†Œ๋“œ ๋“ฑ์— ๊ด€ํ•œ ๋ฉ”ํƒ€ ์ •๋ณด ์ €์žฅ
    • java heap์ด ์•„๋‹Œ native๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์‚ฌ์šฉ
    • ๋ฆฌํ”Œ๋ ‰์…˜ ํด๋ž˜์Šค ๋กœ๋“œ์‹œ ์‚ฌ์šฉ

GC ์•Œ๊ณ ๋ฆฌ์ฆ˜

Mark and sweep

  • 1๋‹จ๊ณ„ ๋งˆํฌ(ํšŒ์ˆ˜๋Œ€์ƒ ํŒ๋‹จ)
  • 2๋‹จ๊ณ„ ํšŒ์ˆ˜
  • ๋‹จ์ 
    • ํšจ์œจ์ด ์ผ์ •ํ•˜์ง€ ์•Š์Œ (ํž™์ด ๋งŽ์ด ์ฑ„์›Œ์ ธ์žˆ์„๊ฒฝ์šฐ ํŠนํžˆ)
    • ๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™” ๋ฐœ์ƒ

Mark and copy

  • ๊ฐ€์šฉ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋‘˜๋กœ ๋‚˜๋ˆˆํ›„ ํ•œ์ชฝ๋งŒ ์‚ฌ์šฉ (S0, S1)
  • ์‚ด์•„๋‚จ์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์˜ฎ๊ธธ๋•Œ ์˜ฎ๊น€ (Copy)
    • ์ฆ‰ ์‚ด์•„๋‚จ์€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹ค๋ฅธ ์˜์—ญ์œผ๋กœ ๋ณต์‚ฌํ•˜๊ณ 
    • ์‚ฌ์šฉํ–ˆ๋˜ ๊ณต๊ฐ„์„ ๋ชจ๋‘ ๋น„์šด๋‹ค.
  • ๋‹จ์ 
    • ๊ฐ€์šฉ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ฆ
    • Andrew Appen์˜ ์ œ์•ˆ์œผ๋กœ ๊ฐœ์„  (์œ„์˜ ์—ฐ๊ตฌ)

Mark and compact

  • ์ƒ์กดํ•œ ๊ฐ์ฒด๋ฅผ ๋ชจ์Œ (copy ๊ณผ์ •์—์„œ compact)
  • ๋‹จ์ 
    • ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋ถ€๋‹ด์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ (์‚ฌ์‹ค์ƒ ๋ชจ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณตํ†ต)
    • ์ธ์Šคํ„ด์Šค ์ด๋™ ๊ณผ์ •์—์„œ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์˜ ์—ฐ์‚ฐ์ด ์ผ์‹œ์ •์ง€ (Stop the world!) (์‚ฌ์‹ค์ƒ ๋ชจ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณตํ†ต)

๋„๋‹ฌ ๊ฐ€๋Šฅ์„ฑ ๋ถ„์„

  • ๋„๋‹ฌ ๊ฐ€๋Šฅ์„ฑ ๋ถ„์„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๊ธฐ์ดˆํ•ด ํšŒ์ˆ˜ ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค๋ฅผ ํŒ๋‹จ
  • GC ๋ฃจํŠธ ๊ฐ์ฒด๋“ค์„ ๊ธฐ์ ์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์„ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹

GC ๋ฃจํŠธ ๊ฐ์ฒด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค

  • jvm stack frame ์ง€์—ญ๋ณ€์ˆ˜ ํ…Œ์ด๋ธ”์—์„œ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด
  • Synchronized ํ‚ค์›Œ๋“œ๋กœ ์ž ๊ฒจ์žˆ๋Š” ๊ฐ์ฒด
  • JNI๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด
  • ๋ฉ”์„œ๋“œ ์˜์—ญ์—์„œ ํด๋ž˜์Šค ์ •์  ํ•„๋“œ๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด
  • ๋ฉ”์„œ๋“œ ์˜์—ญ์—์„œ ์ƒ์ˆ˜๋กœ ์ฐธ์กฐ๋˜๋Š” ๊ฐ์ฒด
  • JVM ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ฐธ์กฐ

Garbage First GC

ํด๋ž˜์‹ GC ์ข…๋ฅ˜ ์ผ๋ถ€

  • Serial
    • ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ์ž‘๋™, ํšŒ์ˆ˜๊ฐ€ ๋๋‚ผ๋•Œ๊นŒ์ง€ ๋ชจ๋‘ ๋ฉˆ์ถค
    • ๊ฐ„๋‹จํ•˜๊ณ  ํšจ์œจ์ ์ด๋ฉฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์ค€์—์„œ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ์ ์Œ
  • ParNew
    • ์‹œ๋ฆฌ์–ผ ์ปฌ๋ ‰ํ„ฐ๋ฅผ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ
  • Parallel scavenge
    • ์‚ฌ์šฉ์ž ์ฝ”๋“œ ์ฒ˜๋ฆฌ ์‹คํ–‰ ํšจ์œจ ๊ทน๋Œ€ํ™”๋ฅผ ๋ชฉํ‘œ๋กœ ์„ค๊ณ„
  • CMS GC
    • java 14๊นŒ์ง€ ์‚ฌ์šฉ๋˜์—ˆ์Œ
  • G1 GC
    • 4gb ์ด์ƒ ๋Œ€์šฉ๋Ÿ‰ heap ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ํŠนํ™”๋œ GC
    • Heap์„ ์˜์—ญ (1~32mb)๋‹จ์œ„๋กœ ๋ถ„ํ• ํ•œ ํ›„ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์Šค์บ” G1 GC
  • jdk 9๋ถ€ํ„ฐ
  • ์„œ๋ฒ„์šฉ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์ง‘์ค‘ํ•œ GC
  • JVM ํž™์„ ์„ธ๋Œ€๋‹จ์œ„๊ฐ€ ์•„๋‹Œ ๋…๋ฆฝ ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„ํ–ˆ์Œ
  • ํž™์˜ ๋ชจ๋“  ์˜์—ญ์„ ํšŒ์ˆ˜ ์ง‘ํ•ฉ (Collection set)์— ํฌํ•จ์‹œ์ผœ ์˜์—ญ๋‹จ์œ„ ์ฒ˜๋ฆฌ
    • ๊ฐ€์žฅ ์“ฐ๋ ˆ๊ธฐ๊ฐ€ ๋งŽ์€ ์˜์—ญ์„ ํŒŒ์•…
    • ํšŒ์ˆ˜์‹œ ๊ฐ€์žฅ ๋“์ด ๋˜๋Š” ์˜์—ญ ํŒŒ์•…

๊ฐ์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ๊ณผ ํ•ด์‹œ์ฝ”๋“œ

  • Object Header
    • klass word : ๋ฉ”ํƒ€์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” ํด๋ž˜์Šค ์ •๋ณด์— ๋Œ€ํ•œ ์ฐธ์กฐ์ž
    • Mark word
      • Hashcode๋Š” Object.hashCode() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— ๊ณ„์‚ฐ
        • ์ž๋ฐ”๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ๋ชปํ•˜๋‹ˆ๊นŒ ์‚ฌ์šฉ
        • ๊ฐ™์€ ์ธ์Šคํ„ด์Šค์ธ์ง€ ์‹๋ณ„ ๋“ฑ
      • age๋Š” GC์—์„œ ์‚ด์•„๋‚จ์€ ํšŸ์ˆ˜
      • Lock flag๋Š” ๊ฐ์ฒด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ฒฝ์Ÿ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ
์ƒํƒœ ์„ค๋ช…
Unlocked ๊ฐ์ฒด๊ฐ€ ์ž ๊ธˆ๋˜์ง€ ์•Š์€ ์ƒํƒœ (Mark Word์— ๊ฐ์ฒด ํ•ด์‹œ ์ฝ”๋“œ ์ €์žฅ)
Lightweight Lock (Thin Lock) spinlock, ๊ฒฝ๋Ÿ‰ ๋ฝ์ด ์ ์šฉ๋œ ์ƒํƒœ (์Šค๋ ˆ๋“œ๊ฐ€ Mark Word๋ฅผ ์ž์‹ ์˜ Lock Record๋กœ ๋ณ€๊ฒฝ)
Inflated Lock (Fat Lock) ์ค‘๊ฐ„ ์ด์ƒ์˜ ๊ฒฝ์Ÿ์ด ๋ฐœ์ƒํ•ด OS์˜ ๋ชจ๋‹ˆํ„ฐ(lock)๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์ƒํƒœ
Biased Lock ํŽธํ–ฅ ๋ฝ์ด ํ™œ์„ฑํ™”๋œ ์ƒํƒœ (ํŠน์ • ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ)
Heavyweight Lock ๋ฎคํ…์Šค ๋™๊ธฐํ™”
Monitor Locked OS ๊ธฐ๋ฐ˜ ๋ชจ๋‹ˆํ„ฐ ๋ฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ์ƒํƒœ
  • Instance Data
  • Padding

Object ํด๋ž˜์Šค

  • java์˜ ๋ชจ๋“  ํด๋ž˜์Šค๋Š” object์˜ ํŒŒ์ƒํ˜•์‹
  • equals()
    • ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ ์ฐธ์กฐ์ž์™€ this๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์ด ๊ฐ™์€ ๊ฐ’์ธ์ง€ ๊ฐ’๋งŒ ๋น„๊ต
    • ์ฆ‰ ๋™๋“ฑ์„ฑ ๋น„๊ต
  • hashCode()
    • ๊ฐ์ฒด ์‹๋ณ„์„ ์œ„ํ•œ ๊ณ ์œ  ํ•ด์‹œ๊ฒฐ๊ณผ ๊ฐ’(Unique)
    • jvm์˜ ํž™์˜์—ญ์—์„œ ์ฃผ์†Œ๊ฐ€ ๊ณ„์† ๋‹ฌ๋ผ์ง€๊ธฐ๋•Œ๋ฌธ์—, ์ฃผ์†Œ๊ฐ’์ด ์•„๋‹Œ hashCode๋กœ ์ธ์Šคํ„ด์Šค ์‹๋ณ„
    • ๋™์ผ์„ฑ ๋น„๊ต์— ์‚ฌ์šฉ
  • toString()
    • ํด๋ž˜์Šค๋ช…@ํ•ด์‹œ์ฝ”๋“œ
  • getClass()

JVM Concurrent

JVM๊ณผ ์Šค๋ ˆ๋“œ

  • ์Šค๋ ˆ๋“œ์˜์ข…๋ฅ˜๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ๋‚˜๋ˆŒ์ˆ˜ ์žˆ์Œ
    • ํ”Œ๋žซํผ ์Šค๋ ˆ๋“œ
    • ์ปค๋„ ์Šค๋ ˆ๋“œ
    • ๊ฐ€์ƒ ์Šค๋ ˆ๋“œ
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ์–ธ์–ด๋Š” ๊ตณ์ด ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†๋Š”๋ฐ, jvm์€ ์‹ค์ œ ํ”Œ๋žซํผ ์Šค๋ ˆ๋“œ์™€ ์ปค๋„์Šค๋ ˆ๋“œ๊ด€๋ จํ•ด์„œ ๋ณผ ๊ฒƒ๋“ค์ด ์žˆ์Œ
  • ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ํ• ๋‹น
  • ์˜ˆ๋ฅผ๋“ค์–ด ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ณผ๋•Œ
    • tcb๋ฅผ ์ €์žฅ/๋ณต์›ํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ์™€
    • java thread๋ฅผ jvm๊ด€๋ จ ๋น„์šฉ๋“ค๋„ ๊ฐ™์ด ๋ด์•ผํ•จ

๊ฐ์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ๊ณผ ํ•ด์‹œ์ฝ”๋“œ

  • object header์ค‘ lock flag๋ฅผ ๋‹ค์‹œ ๋ณผ ์‹œ๊ฐ„
    • lock flag๋Š” ๋ˆ„๊ฐ€ ์„ ์ •ํ•˜๋Š”๊ฐ€?
    • ๊ฒฝ์Ÿ ์ƒํ™ฉ์‹œ ๋ฝ์„ ํš๋“ค ๋ชปํ•˜๋ฉด ํ•ด๋‹น๊ฐ’์ด ๋ณ€ํ•˜๊ณ  ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋“ค์ด blocked๋จ

JVM ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์™€ ์ž‘์—…๋ฉ”๋ชจ๋ฆฌ(working memory)

  • ์ž‘์—…๋ฉ”๋ชจ๋ฆฌ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜์˜ ์‚ฌ๋ณธ์ด ์ €์žฅ๋˜๋ฉฐ

  • ์Šค๋ ˆ๋“œ ๋‚ด๋ถ€์— ์—ฐ์‚ฐ์€ ์ž‘์—… ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ๋ฐ˜์˜

  • ์Šค๋ ˆ๋“œ๋Š” jvm ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€

  • ์ฝ๊ธฐ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ฝ์–ด ์ž‘์—… ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ „์†ก

  • ์ ์žฌ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ „์†กํ•œ ๊ฐ’์„ ์ž‘์—…๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ

  • ์ €์žฅ ์ž‘์—… ๋ฉ”๋ชจ๋ฆฌ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ „์†ก

  • ์“ฐ๊ธฐ ์ž‘์—…๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ’์„ ๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ์— ์”€

  • ์ผ๋ฐ˜ ๋ณ€์ˆ˜์˜ ๋™๊ธฐํ™” ์‹œ์ 

    • ๋ช…์‹œ์  (synchronized, volatile)
    • Thread.start(), join()
    • Lock, Atomic class
    • ํด๋ž˜์Šค ๋กœ๋”ฉ ๊ณผ์ •์—์„œ ์ •์  ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”์‹œ
    • ๊ธฐํƒ€ jvm์ด ์ •ํ•œ ์ตœ์ ํ™”, ๋™๊ธฐํ™” ๊ธฐ์ค€์„ ์ถฉ์กฑ ์‹œ
  • volatile

    • ๋ฉ‘ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ ‘๊ทผํ•˜๋Š” ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๊ฐ€์‹œ์„ฑ์„ ์ œ๊ณต (๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ ๋™๊ธฐํ™”)

๊ฐ€์ƒ ์Šค๋ ˆ๋“œ

  • ์‹ค์ œ๋กœ ํ•œ (์ปค๋„)์Šค๋ ˆ๋“œ์—์„œ ๋ถ„๋ฆฌ๋œ ์—ฌ๋Ÿฌ ๋‹จ์œ„์ฝ”๋“œ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฐœ๋…
    • ์Šค์œ„์นญ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•จ
  • ๋งˆ์น˜ ๊ฐ๊ฐ์ด ๊ฐœ๋ณ„ ์Šค๋ ˆ๋“œ๋กœ ๋ณด์ด์ง€๋งŒ, ์‚ฌ์‹ค ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋กœ ์ฒ˜๋ฆฌ๋˜๋„๋ก
  • ์ƒํ˜ธ ์˜์กด์„ฑ์ด ์ „ํ˜€ ์—†๋Š” ์ฝ”๋“œ์—ฌ์•ผํ•จ

๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ OS์ˆ˜์ค€ ์ปค๋„ ๊ฐ์ฒด

  • ์ปค๋„ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•จ (๋™๊ธฐํ™” ๊ฐ์ฒด)
    • event
    • mutex
    • semaphore
    • ํฌ์ธํ„ฐ ํ˜น์€ ์นด์šดํ„ฐ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ƒ๊ฐํ• ์ˆ˜์žˆ์Œ
  • ์ปค๋„ ๊ฐ์ฒด๋Š” ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐฏ์ˆ˜๊ฐ€ ์ œํ•œ์ ์ด๋ฉฐ spinlock์— ๋น„ํ•ด ๋ฌด๊ฑฐ์›€ (์œ„์˜๊ฒƒ๋“ค)

๋™๊ธฐํ™” ๋ฉ”์„œ๋“œ

  • ์ž„๊ณ„์˜์—ญ ๊ธฐ๋ฐ˜ ๋™๊ธฐํ™” ๊ธฐ๋ฒ•์œผ๋กœ ๋ฉ”์„œ๋“œ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์ž„๊ณ„์˜์—ญ์œผ๋กœ ์„ค์ •
  • ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœํ•˜๋”๋ผ๋„ ๋™์‹œ ์‹คํ–‰์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ

๋ชจ๋‹ˆํ„ฐ๋ฝ ๋™์ž‘ ์ˆœ์„œ

  • ์Šค๋ ˆ๋“œ๊ฐ€ synchronized ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์‹œ ๋ชจ๋‹ˆํ„ฐ๋ฝ์„ ์š”์ฒญ
  • ํƒ€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋ฝ์„ ์ด๋ฏธ ์ ์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉด ์Šค๋ ˆ๋“œ ์ƒํƒœ๋ฅผ blocked์ƒํƒœ๋กœ ์ „ํ™˜
  • ๊ธฐ์กด ๋ชจ๋‹ˆํ„ฐ ๋ฝ ์ ์œ  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ตฌ๊ฐ„์„ ๋ฒ—์–ด๋‚˜(์ž„๊ณ„์˜์—ญ์„)๋ฉด ๋ชจ๋‹ˆํ„ฐ๋ฝ์„ ํ•ด์ œํ•˜๊ณ  blocked์ƒํƒœ๋กœ ๋Œ€๊ธฐ์ค‘์ธ ์Šค๋ ˆ๋“œ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฝ์„ ์–ป๊ณ  ๋™๊ธฐํ™” ๊ตฌ๊ฐ„์— ์ง„์ž