Kubernetes

์ปจํ…Œ์ด๋„ˆ์—์„œ JVM์€ ์™œ ๋ฉ”๋ชจ๋ฆฌ ๋จน๋Š” ํ•˜๋งˆ์˜€์„๊นŒ?

uuuhhh 2022. 11. 10. 20:13

๐Ÿ“ Epilogue


  • ๊ฐ„๋‹จํ•œ JAR ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐ€์ง€๊ณ  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํŒŒ๋“œ ๋ฐฐํฌ๋ฅผ ์‹œ๋„ํ•˜์˜€๋‹ค !
  • ๊ทธ๋Ÿฐ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ๊ฐ€.. ์—„์ฒญ๋‚œ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ..
    • OOM Killed.. CrashLoopBackOff ์ƒํƒœ ๋ฐ˜๋ณต..
  • ํŒŒ๋“œ ์ŠคํŽ™ ๋Š˜๋ฆฌ๊ณ  ๋‹ค์‹œ ๋ฐฐํฌํ•˜๋‹ˆ ์ •์ƒ ์ƒํƒœ !
  • ๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์„œ ์˜๋ฌธ์  โ—๏ธ
    • JVM์€ ์›๋ž˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์žก์•„ ๋จน๋Š”๊ฐ€?๊ตฌ์กฐ ๋•Œ๋ฌธ?ํ•œ ๋ฒˆ ํŒŒํ—ค์ณ๋ณด์ž!

 

โ–ช๏ธŽ JVM์ด๋ž€ ?


๐Ÿ’ก JVM : ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹  (Java Virtual Machine)

 

  • OS์— ์ƒ๊ด€์—†์ด ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ 
  • ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•ด์„œ ์–ป์€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ OS๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ณ„์–ด๋กœ ๋ฐ”๊ฟ” ์‹คํ–‰

 

 

 

โ–ช๏ธŽ ์ปดํŒŒ์ผ ๊ณผ์ •


๐Ÿ’ก .java → ์†Œ์Šค ์ฝ”๋“œ (Source Code)
     .class → ๋ฐ”์ดํŠธ ์ฝ”๋“œ (Byte Code)
     ๊ธฐ๊ณ„์–ด → ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ (Binary Code)

 

  • Test.javaJavac.exe (Compiler)Test.classOS
Javac.exe (Compiler)
• JDK๋ฅผ ์„ค์น˜ํ•˜๋ฉด bin์— ์กด์žฌํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์‹คํ–‰ ํŒŒ์ผ

 

  1. Test.javaJavac.exe (Compiler)
    • Java ์†Œ์Šค ์ฝ”๋“œ๋ฅผ Java ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ ์‹คํ–‰ํ•œ๋‹ค.
  2. Javac.exe (Compiler)Test.class
    • ์ปดํŒŒ์ผํ•˜์—ฌ .java ํŒŒ์ผ(Source code)์„ .class ํŒŒ์ผ(Byte code)๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
  3. Test.classOS
    • JVM์ด ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ OS๊ฐ€ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ(๊ธฐ๊ณ„์–ด)๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

 

 

โ–ช๏ธŽ JVM ๊ตฌ์กฐ


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

 

์•„๋ฌด๋ž˜๋„ JVM์€ ์–ด๋–ค OS์—์„œ๋„ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” VM์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•Œ๋ฌธ์— ์ž์› ํ• ๋‹น๋Ÿ‰์ด ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ•˜์˜€๋‹ค.

 

  • ๊ทธ๋Ÿฌ๋ฉด ์—ฌ๊ธฐ์„œ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ํ˜„ ์ƒํ™ฉ์˜ ํ•ด๊ฒฐ๋ฒ• ๐Ÿ”จ
  1. JVM ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์ค„์ด๊ธฐ
  2. ์ปจํ…Œ์ด๋„ˆ ์ž์› ๋ฆฌ์†Œ์Šค ํ• ๋‹น ๋Š˜๋ฆฌ๊ธฐ
    • ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๊ฐ€ ์ดˆ๋ž˜๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•จ

 

 

โ–ช๏ธŽ JVM ๋ฉ”๋ชจ๋ฆฌ ์ค„์ด๊ธฐ


  • ๊ธฐ๋ณธ์ ์œผ๋กœ JVM์€ Heap ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์ด์ฆˆ๋ฅผ ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ์˜ 25% ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค. ( ≥ JDK 10 )
  • Pod ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์„ฑ
    • JVM - Heap
    • JVM - Non Heap
    • System
    • IDLE
  • Total Memory - Heap Memory - ( Non-Heap Memory + System + IDLE ) = Remain Memory

 

  • System์˜ ๊ธฐ๋ณธ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•œ ํ›„์— Remain Memory ๊ณ„์‚ฐ ๋ฐ ๊ณ ๋ คํ•˜์—ฌ ์ตœ๋Œ€ Heap Memory ์‚ฌ์ด์ฆˆ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

  • JAR์„ ์‹คํ–‰์‹œํ‚ฌ ๋•Œ JVM์˜ Heap Area์˜ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•ด์ฃผ๋Š” ์˜ต์…˜์ด ์žˆ๋‹ค.
  • -Xms256m
    • ๋ฉ”๋ชจ๋ฆฌ์˜ ์ตœ์ดˆ ํฌ๊ธฐ 256MB ์„ค์ •
  • -Xmx512m
    • ๋ฉ”๋ชจ๋ฆฌ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ 512MB ์„ค์ •

 

  • ๊ทธ๋Ÿฌ๋‚˜ K8s Container ํ™˜๊ฒฝ์—์„œ JVM์— ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์กฐ์ •ํ•˜๋Š” -Xms / -Xmx ์˜ต์…˜๋ณด๋‹ค Container ์ž์›์— ๋”ฐ๋ผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋Š” UseContainerSupport ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • K8s Pod ์ƒ์„ฑ ์‹œ Container์˜ ์ž์›์„ ์„ค์ •(requests, limits)ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • Default = True
    • ≥ OpenJDK 8 ์ง€์›

 

  • -XX:InitialRAMPercentage=40 (%)
    • JVM์˜ ์ดˆ๊ธฐ Heap ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ ์„ค์ •
    • e.g.) ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 1GB์ธ ๊ฒฝ์šฐ JVM ์ดˆ๊ธฐ Heap ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋Š” 400MB (1GB์˜ 40%)
  • -XX:MinRAMPercentage=50 (%)
    • 200MB ๋ฏธ๋งŒ์˜ ์ดˆ๊ธฐ Heap ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง„ JVM์˜ ์ตœ๋Œ€ Heap ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ ์„ค์ •
  • -XX:MaxRAMPercentage=70 (%)
    • 200MB ์ดˆ๊ณผ์˜ ์ดˆ๊ธฐ Heap ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง„ JVM์˜ ์ตœ๋Œ€ Heap ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ ์„ค์ •

 

 

 

๋ณธ์˜ ์•„๋‹ˆ๊ฒŒ ์ด์Šˆ๊ฐ€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐ์ด ๋˜์–ด์„œ ์ด์Šˆ๊ฐ€ ์‚ฌ๋ผ์กŒ๋‹คใ… ใ…œ
์ด์Šˆ ์žฌํ˜„์„ ์‹œ๋„ํ•˜์˜€์ง€๋งŒ ์•„์ง๊นŒ์ง€ ์žฌํ˜„์— ์‹คํŒจํ•œ ์ƒํƒœ..
์œผ.. ์ ์šฉํ•ด๋ณด๊ณ  ์‹ถ๋‹ค !!

 

 

 

ref. JVM Structure


JVM ๊ตฌ์กฐ์™€ ์ž๋ฐ” ๋Ÿฐํƒ€์ž„ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ (์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋  ๋•Œ JVM์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ, ๊ณผ์ •์„ ์„ค๋ช…ํ•ด์ค„ ์ˆ˜ ์žˆ๋‚˜์š”?)

[JAVA] JVM์ด๋ž€? ๊ฐœ๋… ๋ฐ ๊ตฌ์กฐ (JDK, JRE, JIT, ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ...)

 

ref. JVM Memory Setting


์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ JVM Memory ์„ค์ •

์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ์˜ java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆฌ์†Œ์Šค์™€ ๋ฉ”๋ชจ๋ฆฌ ์„ค์ •

 

ref. Other Case


JVM + Container ํ™˜๊ฒฝ์—์„œ ์ˆ˜์ƒํ•œ Memory ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€ ํ˜„์ƒ ๋ถ„์„ํ•˜๊ธฐ