๐Ÿš€ JVM ํŠœ๋‹: ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ JVM ์„ค์ • ๋Œ€๋ชจํ—˜! ๐ŸŽข

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ JVM ํŠœ๋‹: ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ JVM ์„ค์ • ๋Œ€๋ชจํ—˜! ๐ŸŽข

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์ž๋ฐ” ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์•„์ฃผ ํŠน๋ณ„ํ•œ ์—ฌํ–‰์„ ๋– ๋‚˜๋ณผ ๊ฑฐ์˜ˆ์š”. ๋ฐ”๋กœ JVM(Java Virtual Machine) ํŠœ๋‹์˜ ์„ธ๊ณ„๋กœ์š”! ๐ŸŒโœจ JVM์€ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๊ฐ€์ƒ์˜ ์ปดํ“จํ„ฐ์ธ๋ฐ, ์ด JVM์„ ์ž˜ ๋‹ค๋ฃจ๋ฉด ์šฐ๋ฆฌ์˜ ํ”„๋กœ๊ทธ๋žจ์ด ๋”์šฑ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ๋งˆ์น˜ ์ž๋™์ฐจ์˜ ์—”์ง„์„ ํŠœ๋‹ํ•ด์„œ ๋” ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐ŸŽ๏ธ๐Ÿ’จ

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์ด๋ผ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์•„์‹œ๋‚˜์š”? ์ด๊ณณ์€ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๊ฑฐ๋ž˜ํ•˜๋Š” ํ”Œ๋žซํผ์ธ๋ฐ์š”, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค๋ ฅ๋„ ํ•˜๋‚˜์˜ ๋ฉ‹์ง„ ์žฌ๋Šฅ์ด ๋  ์ˆ˜ ์žˆ์ฃ . JVM ํŠœ๋‹ ๋Šฅ๋ ฅ์„ ํ‚ค์šฐ๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์žฌ๋Šฅ์ด ํ•œ์ธต ๋” ๋น›๋‚˜๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”! ๐Ÿ˜Ž

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ JVM ํŠœ๋‹ ์—ฌํ–‰์„ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ์•ˆ์ „๋ฒจํŠธ ๊ฝ‰ ๋งค์„ธ์š”. ์ด ์—ฌํ–‰์ด ๋๋‚˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ JVM์˜ ์ง„์ •ํ•œ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋˜์–ด ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐ŸŽ“๐Ÿ†

๐Ÿง  JVM์˜ ๊ธฐ๋ณธ ๊ฐœ๋…: ์šฐ๋ฆฌ์˜ ์—ฌํ–‰ ์ง€๋„

JVM ํŠœ๋‹ ์—ฌํ–‰์„ ๋– ๋‚˜๊ธฐ ์ „์—, ๋จผ์ € JVM์ด ๋ฌด์—‡์ธ์ง€ ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณผ๊นŒ์š”? JVM์€ Java Virtual Machine์˜ ์•ฝ์ž๋กœ, ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์ƒ ๋จธ์‹ ์ด์—์š”. ๐Ÿ–ฅ๏ธ

JVM์˜ ์ฃผ์š” ์—ญํ• :

  • ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰
  • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ (๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ํฌํ•จ)
  • ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ
  • ๋ณด์•ˆ ๊ด€๋ฆฌ

JVM์€ ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ์‚ด๊ณ  ์žˆ๋Š” ์ง‘๊ณผ ๊ฐ™์•„์š”. ์ง‘ ์•ˆ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ํŽธํ•˜๊ฒŒ ์ƒํ™œํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์‹œ์„ค๊ณผ ๊ทœ์น™์ด ์žˆ์ฃ . JVM๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜ˆ์š”. ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด ํŽธํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ '์‚ด' ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฑฐ์ฃ . ๐Ÿ ๐Ÿ’ป

๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ! JVM์€ ๋‹จ์ˆœํžˆ ์ฃผ์–ด์ง„ ๋Œ€๋กœ๋งŒ ๋™์ž‘ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ์—์š”. ์šฐ๋ฆฌ๊ฐ€ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์„ค์ •๋“ค์ด ์žˆ๋‹ต๋‹ˆ๋‹ค.

์ด์ œ ์šฐ๋ฆฌ๋Š” ์ด JVM์ด๋ผ๋Š” ์ง‘์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ์กฐ์ •ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์ง‘์„ ๋ฆฌ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ๐Ÿ”ง๐Ÿ—๏ธ

JVM ๊ตฌ์กฐ ๋‹ค์ด์–ด๊ทธ๋žจ JVM ํด๋ž˜์Šค ๋กœ๋” ์‹คํ–‰ ์—”์ง„ ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ

์œ„ ๊ทธ๋ฆผ์€ JVM์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋กœ๋”, ์‹คํ–‰ ์—”์ง„, ๊ทธ๋ฆฌ๊ณ  ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์ฃ . ์ด ์„ธ ๋ถ€๋ถ„์ด ์กฐํ™”๋กญ๊ฒŒ ์ž‘๋™ํ•ด์•ผ ์šฐ๋ฆฌ์˜ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด ์ž˜ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์–ด์š”. ๐ŸŽญ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ JVM ํŠœ๋‹ ์—ฌํ–‰์„ ์œ„ํ•œ ์ง€๋„๋ฅผ ์†์— ์ฅ์—ˆ์–ด์š”. ์ด์ œ๋ถ€ํ„ฐ๋Š” ์ด ์ง€๋„๋ฅผ ๋”ฐ๋ผ JVM์˜ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์„ ํƒํ—˜ํ•˜๋ฉด์„œ, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋” ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ์„์ง€ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's go! ๐Ÿš€

๐Ÿงฐ JVM ํŠœ๋‹์˜ ๊ธฐ๋ณธ ๋„๊ตฌ๋“ค: ์šฐ๋ฆฌ์˜ ์—ฌํ–‰ ์žฅ๋น„

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์ธ JVM ํŠœ๋‹ ์—ฌํ–‰์„ ๋– ๋‚˜๊ธฐ ์ „์—, ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๊ธฐ๋ณธ ๋„๊ตฌ๋“ค์„ ์ฑ™๊ฒจ๋ณผ๊นŒ์š”? ๋งˆ์น˜ ๋“ฑ์‚ฐ์„ ๊ฐ€๊ธฐ ์ „์— ๋“ฑ์‚ฐํ™”, ๋ฐฐ๋‚ญ, ๋ฌผํ†ต ๋“ฑ์„ ์ค€๋น„ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์—์š”! ๐ŸŽ’โ›ฐ๏ธ

JVM ํŠœ๋‹์„ ์œ„ํ•œ ๊ธฐ๋ณธ ๋„๊ตฌ๋“ค:

  • JVM ์˜ต์…˜
  • ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ
  • ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ
  • ๋ฒค์น˜๋งˆํ‚น ๋„๊ตฌ

1. JVM ์˜ต์…˜ ๐ŸŽ›๏ธ

JVM ์˜ต์…˜์€ ์šฐ๋ฆฌ๊ฐ€ JVM์˜ ๋™์ž‘์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋งˆ๋ฒ•์˜ ์ฃผ๋ฌธ๊ณผ ๊ฐ™์•„์š”. ์ด ์˜ต์…˜๋“ค์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋™์ž‘, ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ JVM์˜ ๋™์ž‘์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.

์ฃผ์š” JVM ์˜ต์…˜ ์นดํ…Œ๊ณ ๋ฆฌ:

  • ํž™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ์˜ต์…˜ (-Xms, -Xmx ๋“ฑ)
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๊ด€๋ จ ์˜ต์…˜ (-XX:+UseG1GC, -XX:+UseConcMarkSweepGC ๋“ฑ)
  • ์Šค๋ ˆ๋“œ ๊ด€๋ จ ์˜ต์…˜ (-XX:ThreadStackSize ๋“ฑ)
  • JIT ์ปดํŒŒ์ผ๋Ÿฌ ๊ด€๋ จ ์˜ต์…˜ (-XX:+TieredCompilation ๋“ฑ)

์ด ์˜ต์…˜๋“ค์€ ๋งˆ์น˜ ์š”๋ฆฌ์‚ฌ๊ฐ€ ์Œ์‹์˜ ๋ง›์„ ์กฐ์ ˆํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์–‘๋…๊ณผ ๊ฐ™์•„์š”. ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ '๋ง›'์ด ํ›จ์”ฌ ์ข‹์•„์งˆ ๊ฑฐ์˜ˆ์š”! ๐Ÿณ๐Ÿ‘จโ€๐Ÿณ

2. ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ ๐Ÿ‘€

๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋Š” ์šฐ๋ฆฌ์˜ JVM์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์˜ˆ์š”. ๋งˆ์น˜ ์˜์‚ฌ๊ฐ€ ํ™˜์ž์˜ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์˜๋ฃŒ ๊ธฐ๊ธฐ์™€ ๊ฐ™์ฃ !

์ฃผ์š” ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ:

  • JConsole: JDK์— ํฌํ•จ๋œ ๊ธฐ๋ณธ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ
  • VisualVM: ๋” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ
  • Java Mission Control (JMC): Oracle์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ณ ๊ธ‰ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ

์ด๋Ÿฐ ๋„๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด CPU ์‚ฌ์šฉ๋Ÿ‰, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ์Šค๋ ˆ๋“œ ์ƒํƒœ ๋“ฑ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์ž๋™์ฐจ์˜ ๊ณ„๊ธฐํŒ์„ ๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐Ÿš—๐Ÿ’จ

3. ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ ๐Ÿ•ต๏ธ

ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋Š” ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ๋” ์ž์„ธํžˆ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์˜ˆ์š”. ์–ด๋–ค ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ์š”ํ•˜๋Š”์ง€, ์–ด๋–ค ๋ถ€๋ถ„์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋“ฑ์„ ์•Œ๋ ค์ค˜์š”.

์ฃผ์š” ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ:

  • YourKit Java Profiler
  • JProfiler
  • Eclipse Memory Analyzer (MAT)

์ด ๋„๊ตฌ๋“ค์€ ๋งˆ์น˜ ํƒ์ •์ด ๋ฒ”์ธ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ์™€ ๊ฐ™์•„์š”. ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ์˜ '๋ฒ”์ธ'์„ ์ฐพ์•„๋‚ด๋Š” ๋ฐ ํฐ ๋„์›€์„ ์ค„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ”๐Ÿ•ต๏ธโ€โ™€๏ธ

4. ๋ฒค์น˜๋งˆํ‚น ๋„๊ตฌ ๐Ÿ‹๏ธ

๋ฒค์น˜๋งˆํ‚น ๋„๊ตฌ๋Š” ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ๊ฐ๊ด€์ ์œผ๋กœ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์˜ˆ์š”. ๋‹ค๋ฅธ ์„ค์ •์ด๋‚˜ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ฃ .

์ฃผ์š” ๋ฒค์น˜๋งˆํ‚น ๋„๊ตฌ:

  • JMH (Java Microbenchmark Harness)
  • Apache JMeter
  • Gatling

์ด ๋„๊ตฌ๋“ค์€ ๋งˆ์น˜ ์šด๋™ ์„ ์ˆ˜๋“ค์ด ์ž์‹ ์˜ ๊ธฐ๋ก์„ ์ธก์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์˜ '๊ธฐ๋ก'์„ ์ •ํ™•ํ•˜๊ฒŒ ์ธก์ •ํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋” ์ข‹์€ '๊ธฐ๋ก'์„ ๋‚ผ ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•˜๊ฒŒ ํ•ด์ค„ ๊ฑฐ์˜ˆ์š”! ๐Ÿƒโ€โ™‚๏ธโฑ๏ธ

JVM ํŠœ๋‹ ๋„๊ตฌ ๋‹ค์ด์–ด๊ทธ๋žจ JVM ํŠœ๋‹ ๋„๊ตฌ JVM ์˜ต์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ ๋ฒค์น˜๋งˆํ‚น ๋„๊ตฌ

์œ„ ๊ทธ๋ฆผ์€ JVM ํŠœ๋‹์— ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์š” ๋„๊ตฌ๋“ค์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋“ค์ด ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์‹ค์ œ๋กœ ์ด ๋„๊ตฌ๋“ค์€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ๋•Œ ๊ฐ€์žฅ ํฐ ํšจ๊ณผ๋ฅผ ๋ฐœํœ˜ํ•ด์š”. ๐Ÿ”—๐Ÿค

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ JVM ํŠœ๋‹ ์—ฌํ–‰์„ ์œ„ํ•œ ์žฅ๋น„๋ฅผ ๋ชจ๋‘ ์ฑ™๊ฒผ์–ด์š”. ์ด ๋„๊ตฌ๋“ค์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด, JVM์˜ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ๋“ฑ์‚ฐ์„ ํ•  ๋•Œ ์ ์ ˆํ•œ ์žฅ๋น„๊ฐ€ ์žˆ์œผ๋ฉด ๋” ๋†’์€ ์‚ฐ์„ ๋” ์‰ฝ๊ฒŒ ์˜ค๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐Ÿ”๏ธ

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด ๋„๊ตฌ๋“ค์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์ ๋“ค์„ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์šฐ๋ฆฌ์˜ JVM ํŠœ๋‹ ์—ฌํ–‰์ด ์ ์  ๋” ํฅ๋ฏธ์ง„์ง„ํ•ด์ง€๊ณ  ์žˆ์–ด์š”! ๊ณ„์†ํ•ด์„œ ํ•จ๊ป˜ ๊ฐ€๋ณด์‹ค๊นŒ์š”? ๐Ÿš€๐ŸŒŸ

๐ŸŽฏ JVM ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ: ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ๋ชฉ์ ์ง€

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ JVM ํŠœ๋‹ ์—ฌํ–‰์˜ ์ฒซ ๋ฒˆ์งธ ๋ชฉ์ ์ง€์— ๋„์ฐฉํ–ˆ์–ด์š”. ๋ฐ”๋กœ JVM ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์˜ˆ์š”! ์ด๊ณณ์€ ๋งˆ์น˜ ๊ฑฐ๋Œ€ํ•œ ์ฐฝ๊ณ ์™€ ๊ฐ™์•„์š”. ์šฐ๋ฆฌ์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋“ค์ด ์ด ์ฐฝ๊ณ ์— ์ €์žฅ๋˜๊ณ  ๊ด€๋ฆฌ๋˜์ฃ . ๐Ÿญ๐Ÿ“ฆ

JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์˜ ์ฃผ์š” ์˜์—ญ:

  • ํž™ (Heap)
  • ์Šคํƒ (Stack)
  • ๋ฉ”์„œ๋“œ ์˜์—ญ (Method Area)
  • PC ๋ ˆ์ง€์Šคํ„ฐ (PC Register)
  • ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ (Native Method Stack)

1. ํž™ (Heap) ๐Ÿ”๏ธ

ํž™์€ JVM ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ€์žฅ ํฐ ์˜์—ญ์ด์—์š”. ๊ฐ์ฒด๋“ค์ด ์ €์žฅ๋˜๋Š” ๊ณณ์ด์ฃ . ๋งˆ์น˜ ๊ฑฐ๋Œ€ํ•œ ์ฐฝ๊ณ ์™€ ๊ฐ™์•„์š”. ์ด ์ฐฝ๊ณ ๋Š” ๋‘ ๊ฐœ์˜ ์ฃผ์š” ๊ตฌ์—ญ์œผ๋กœ ๋‚˜๋‰˜์–ด ์žˆ์–ด์š”.

  • Young Generation: ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค์ด ์ €์žฅ๋˜๋Š” ๊ณณ
  • Old Generation: Young Generation์—์„œ ์˜ค๋ž˜ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์ด ์ด๋™ํ•˜๋Š” ๊ณณ

ํž™ ๋ฉ”๋ชจ๋ฆฌ ํŠœ๋‹์˜ ํ•ต์‹ฌ์€ ์ด ๋‘ ์˜์—ญ์˜ ํฌ๊ธฐ๋ฅผ ์ ์ ˆํžˆ ์กฐ์ ˆํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์ฐฝ๊ณ ์˜ ๊ณต๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ !

ํž™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ์ฃผ์š” JVM ์˜ต์…˜:

  • -Xms: ์ดˆ๊ธฐ ํž™ ํฌ๊ธฐ ์„ค์ •
  • -Xmx: ์ตœ๋Œ€ ํž™ ํฌ๊ธฐ ์„ค์ •
  • -XX:NewRatio: Young๊ณผ Old Generation์˜ ๋น„์œจ ์„ค์ •
  • -XX:SurvivorRatio: Eden๊ณผ Survivor ์˜์—ญ์˜ ๋น„์œจ ์„ค์ •

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”:

java -Xms1g -Xmx2g -XX:NewRatio=2 -jar MyApp.jar

์ด ์„ค์ •์€ ์ดˆ๊ธฐ ํž™ ํฌ๊ธฐ๋ฅผ 1GB, ์ตœ๋Œ€ ํž™ ํฌ๊ธฐ๋ฅผ 2GB๋กœ ์„ค์ •ํ•˜๊ณ , Old Generation์„ Young Generation์˜ 2๋ฐฐ ํฌ๊ธฐ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์ฐฝ๊ณ ์˜ ํฌ๊ธฐ์™€ ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ ! ๐Ÿ—๏ธ

2. ์Šคํƒ (Stack) ๐Ÿ“š

์Šคํƒ์€ ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ํ• ๋‹น๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด์—์š”. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋“ค์ด ์—ฌ๊ธฐ์— ์ €์žฅ๋˜์ฃ . ๋งˆ์น˜ ์ฑ…์ƒ ์œ„์— ์Œ“์ธ ์ข…์ด ๋”๋ฏธ์™€ ๊ฐ™์•„์š”. ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ข…์ด๊ฐ€ ์œ„์— ์Œ“์ด๊ณ , ๋ฉ”์„œ๋“œ๊ฐ€ ๋๋‚˜๋ฉด ๊ทธ ์ข…์ด๊ฐ€ ์น˜์›Œ์ง€๋Š” ๊ฑฐ์ฃ .

์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ ํŠœ๋‹์˜ ํ•ต์‹ฌ์€ ๊ฐ ์Šค๋ ˆ๋“œ์— ํ• ๋‹น๋˜๋Š” ์Šคํƒ์˜ ํฌ๊ธฐ๋ฅผ ์ ์ ˆํžˆ ์กฐ์ ˆํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ๋„ˆ๋ฌด ์ž‘์œผ๋ฉด StackOverflowError๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ๋„ˆ๋ฌด ํฌ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚ญ๋น„๋  ์ˆ˜ ์žˆ์–ด์š”.

์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ์ฃผ์š” JVM ์˜ต์…˜:

  • -Xss: ๊ฐ ์Šค๋ ˆ๋“œ์— ํ• ๋‹น๋˜๋Š” ์Šคํƒ ํฌ๊ธฐ ์„ค์ •

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”:

java -Xss256k -jar MyApp.jar

์ด ์„ค์ •์€ ๊ฐ ์Šค๋ ˆ๋“œ์˜ ์Šคํƒ ํฌ๊ธฐ๋ฅผ 256KB๋กœ ์„ค์ •ํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ๊ฐ ์ฑ…์ƒ์˜ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ ! ๐Ÿ“

3. ๋ฉ”์„œ๋“œ ์˜์—ญ (Method Area) ๐Ÿ“–

๋ฉ”์„œ๋“œ ์˜์—ญ์€ ํด๋ž˜์Šค ๊ตฌ์กฐ๋‚˜ ๋ฉ”์„œ๋“œ ๋ฐ์ดํ„ฐ, ์ •์  ๋ณ€์ˆ˜ ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณณ์ด์—์š”. Java 8๋ถ€ํ„ฐ๋Š” ์ด ์˜์—ญ์ด Metaspace๋ผ๊ณ  ๋ถˆ๋ฆฌ๊ฒŒ ๋˜์—ˆ์ฃ . ์ด ์˜์—ญ์€ ๋งˆ์น˜ ๋„์„œ๊ด€์˜ ์ฑ…์žฅ๊ณผ ๊ฐ™์•„์š”. ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ํด๋ž˜์Šค ์ •๋ณด๊ฐ€ ์—ฌ๊ธฐ์— ์ •๋ฆฌ๋˜์–ด ์žˆ์ฃ .

๋ฉ”์„œ๋“œ ์˜์—ญ ํŠœ๋‹์˜ ํ•ต์‹ฌ์€ ์ด ์˜์—ญ์˜ ํฌ๊ธฐ๋ฅผ ์ ์ ˆํžˆ ์กฐ์ ˆํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ๋„ˆ๋ฌด ์ž‘์œผ๋ฉด OutOfMemoryError๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ๋„ˆ๋ฌด ํฌ๋ฉด ๋‹ค๋ฅธ ์˜์—ญ์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด์งˆ ์ˆ˜ ์žˆ์–ด์š”.

๋ฉ”์„œ๋“œ ์˜์—ญ ๊ด€๋ จ ์ฃผ์š” JVM ์˜ต์…˜ (Java 8 ์ด์ƒ):

  • -XX:MetaspaceSize: ์ดˆ๊ธฐ Metaspace ํฌ๊ธฐ ์„ค์ •
  • -XX:MaxMetaspaceSize: ์ตœ๋Œ€ Metaspace ํฌ๊ธฐ ์„ค์ •

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”:

java -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m -jar MyApp.jar

์ด ์„ค์ •์€ ์ดˆ๊ธฐ Metaspace ํฌ๊ธฐ๋ฅผ 64MB, ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ 256MB๋กœ ์„ค์ •ํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ๋„์„œ๊ด€์˜ ์ฑ…์žฅ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ ! ๐Ÿ“š

4. PC ๋ ˆ์ง€์Šคํ„ฐ (PC Register) ๐Ÿ–ฅ๏ธ

PC ๋ ˆ์ง€์Šคํ„ฐ๋Š” ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๋ฉฐ, ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์–ด์š”. ์ด ์˜์—ญ์€ ์•„์ฃผ ์ž‘๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํŠœ๋‹ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์€ ๊ฑฐ์˜ ์—†์–ด์š”. ๋งˆ์น˜ ์ฑ…์„ ์ฝ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ฑ…๊ฐˆํ”ผ์™€ ๊ฐ™์ฃ !

5. ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ (Native Method Stack) ๐ŸŒ‰

๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ์€ ์ž๋ฐ”๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ์Šคํƒ์ด์—์š”. C๋‚˜ C++ ๊ฐ™์€ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋˜์ฃ . ์ด ์˜์—ญ๋„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํŠœ๋‹ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์€ ๋งŽ์ง€ ์•Š์•„์š”.

JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ๋‹ค์ด์–ด๊ทธ๋žจ JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ํž™ (Heap) Young Generation Old Generation ์Šคํƒ (Stack) ๋ฉ”์„œ๋“œ ์˜์—ญ PC ๋ ˆ์ง€์Šคํ„ฐ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ

์œ„ ๊ทธ๋ฆผ์€ JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ฐ ์˜์—ญ์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์ฃ ? ์ด ๊ตฌ์กฐ๋ฅผ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์žˆ์œผ๋ฉด JVM ํŠœ๋‹์„ ํ•  ๋•Œ ํฐ ๋„์›€์ด ๋  ๊ฑฐ์˜ˆ์š”! ๐Ÿง ๐Ÿ’ก

์ž, ์ด์ œ JVM ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ๊ธฐ๋ณธ์ ์ธ ์ดํ•ด๋ฅผ ํ–ˆ์–ด์š”. ์ด๊ฒƒ์€ ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ์‚ด๊ณ  ์žˆ๋Š” ์ง‘์˜ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๊ฐ ๋ฐฉ์ด ์–ด๋–ค ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋Š”์ง€, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๊ณต๊ฐ„์„ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๊ฒŒ ๋œ ๊ฑฐ์ฃ ! ๐Ÿ 

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์ œ๋กœ JVM ํŠœ๋‹์„ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์ ๋“ค์„ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์šฐ๋ฆฌ์˜ JVM ํŠœ๋‹ ์—ฌํ–‰์ด ์ ์  ๋” ๊นŠ์–ด์ง€๊ณ  ์žˆ์–ด์š”! ๊ณ„์†ํ•ด์„œ ํ•จ๊ป˜ ๊ฐ€๋ณด์‹ค๊นŒ์š”? ๐Ÿš€๐ŸŒŸ

๊ทธ๋ฆฌ๊ณ  ์žŠ์ง€ ๋งˆ์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค๋ ฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ๋„ ํ•˜๋‚˜์˜ ๋ฉ‹์ง„ ์žฌ๋Šฅ์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ JVM ํŠœ๋‹ ๋Šฅ๋ ฅ์„ ๊ณต์œ ํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ๊ต๋ฅ˜ํ•ด๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๋Š” ๊ฒƒ ์€ ์ •๋ง ๋ฉ‹์ง„ ๊ฒฝํ—˜์ด ๋  ๊ฑฐ์˜ˆ์š”! ๐ŸŒฑ๐Ÿ’ช

๐Ÿงน ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜: JVM์˜ ์ฒญ์†Œ๋ถ€

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ JVM ํŠœ๋‹ ์—ฌํ–‰์—์„œ ์•„์ฃผ ์ค‘์š”ํ•œ ์žฅ์†Œ์— ๋„์ฐฉํ–ˆ์–ด์š”. ๋ฐ”๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection, GC)์ด์—์š”! ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ JVM์˜ ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์œผ๋กœ, ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋“ค์„ ์ฐพ์•„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•˜๋Š” ์—ญํ• ์„ ํ•ด์š”. ๋งˆ์น˜ ์šฐ๋ฆฌ ์ง‘์„ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€ํ•ด์ฃผ๋Š” ์ฒญ์†Œ๋ถ€์™€ ๊ฐ™์ฃ ! ๐Ÿงนโœจ

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ์ฃผ์š” ๋ชฉํ‘œ:

  • ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด ์‹๋ณ„
  • ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜
  • ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™” ์ตœ์†Œํ™”
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰์„ ์ตœ์†Œํ•œ์œผ๋กœ ๋ฐฉํ•ด

1. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๊ธฐ๋ณธ ๊ณผ์ • ๐Ÿ”„

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ํฌ๊ฒŒ ๋‘ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ ธ์š”:

  1. Mark(ํ‘œ์‹œ): ์‚ฌ์šฉ ์ค‘์ธ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  2. Sweep(์ œ๊ฑฐ): ํ‘œ์‹œ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ์—ฌ๊ธฐ์— "Compact" ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ, ๋‚จ์€ ๊ฐ์ฒด๋“ค์„ ํ•œ ๊ณณ์œผ๋กœ ๋ชจ์•„ ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”๋ฅผ ์ค„์ด๊ธฐ๋„ ํ•ด์š”.

2. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๐Ÿง 

JVM์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ์–ด์š”. ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์ด ์žˆ์ฃ . ์ฃผ์š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ดํŽด๋ณผ๊นŒ์š”?

  • Serial GC: ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ GC. ์ž‘์€ ํž™๊ณผ ๋‹จ์ผ ํ”„๋กœ์„ธ์„œ ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•ด์š”.
  • Parallel GC: ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณ‘๋ ฌ๋กœ GC๋ฅผ ์ˆ˜ํ–‰ํ•ด์š”. ๋‹ค์ค‘ ํ”„๋กœ์„ธ์„œ ๋˜๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ•˜๋“œ์›จ์–ด์—์„œ ์œ ์šฉํ•ด์š”.
  • CMS (Concurrent Mark Sweep) GC: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ์™€ ๋™์‹œ์— ์ž‘๋™ํ•˜์—ฌ ์ผ์‹œ ์ค‘์ง€ ์‹œ๊ฐ„์„ ์ค„์—ฌ์š”. ๋ฐ˜์‘ ์‹œ๊ฐ„์ด ์ค‘์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•ด์š”.
  • G1 (Garbage First) GC: ํฐ ํž™ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์งง์€ GC ์ผ์‹œ ์ค‘์ง€ ์‹œ๊ฐ„์„ ๋‹ฌ์„ฑํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์–ด์š”. Java 9๋ถ€ํ„ฐ์˜ ๊ธฐ๋ณธ GC์˜ˆ์š”.

๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งˆ์น˜ ๋‹ค๋ฅธ ์ฒญ์†Œ ๋„๊ตฌ์™€ ๊ฐ™์•„์š”. ์ž‘์€ ์›๋ฃธ์—๋Š” ๋น—์ž๋ฃจ๋กœ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํฐ ์ €ํƒ์—๋Š” ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์ฃ ! ๐Ÿ ๐Ÿค–

3. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ํŠœ๋‹ ๐Ÿ› ๏ธ

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ํŠœ๋‹์˜ ์ฃผ์š” ๋ชฉํ‘œ๋Š” GC๋กœ ์ธํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ์‹œ ์ค‘์ง€ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ , ์ „์ฒด์ ์ธ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋†’์ด๋Š” ๊ฑฐ์˜ˆ์š”. ์ด๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”:

  • ์ ์ ˆํ•œ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ
  • ํž™ ํฌ๊ธฐ ์กฐ์ •
  • Young๊ณผ Old ์˜์—ญ์˜ ๋น„์œจ ์กฐ์ •
  • GC ๋กœ๊น… ํ™œ์„ฑํ™” ๋ฐ ๋ถ„์„

์ฃผ์š” GC ๊ด€๋ จ JVM ์˜ต์…˜:

  • -XX:+UseSerialGC: Serial GC ์‚ฌ์šฉ
  • -XX:+UseParallelGC: Parallel GC ์‚ฌ์šฉ
  • -XX:+UseConcMarkSweepGC: CMS GC ์‚ฌ์šฉ
  • -XX:+UseG1GC: G1 GC ์‚ฌ์šฉ
  • -XX:NewRatio=n: Young๊ณผ Old ์˜์—ญ์˜ ๋น„์œจ ์„ค์ •
  • -XX:SurvivorRatio=n: Eden๊ณผ Survivor ์˜์—ญ์˜ ๋น„์œจ ์„ค์ •
  • -XX:+PrintGCDetails: ์ƒ์„ธํ•œ GC ๋กœ๊ทธ ์ถœ๋ ฅ

์˜ˆ๋ฅผ ๋“ค์–ด, G1 GC๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ƒ์„ธํ•œ GC ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”:

java -XX:+UseG1GC -XX:+PrintGCDetails -jar MyApp.jar

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด G1 GC๊ฐ€ ๋™์ž‘ํ•˜๋ฉด์„œ ์ƒ์„ธํ•œ GC ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์ฒญ์†Œ๋ถ€์—๊ฒŒ ํŠน๋ณ„ํ•œ ์ฒญ์†Œ ๋„๊ตฌ๋ฅผ ์ฃผ๊ณ , ์ฒญ์†Œ ์ผ์ง€๋„ ๊ผผ๊ผผํžˆ ์ž‘์„ฑํ•˜๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ ! ๐Ÿ“

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๊ณผ์ • ๋‹ค์ด์–ด๊ทธ๋žจ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๊ณผ์ • Mark Sweep Compact

์œ„ ๊ทธ๋ฆผ์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๊ธฐ๋ณธ ๊ณผ์ •์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. Mark, Sweep, ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์ ์œผ๋กœ Compact ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์ฃ . ์ด ๊ณผ์ •์„ ํ†ตํ•ด JVM์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์š”. ๐Ÿงผ๐Ÿšฟ

4. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๐Ÿ‘€

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํšจ๊ณผ์ ์œผ๋กœ ํŠœ๋‹ํ•˜๋ ค๋ฉด ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•ด์•ผ ํ•ด์š”. ์ด๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”:

  • jstat: JVM ํ†ต๊ณ„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ
  • jconsole: JVM ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ทธ๋ž˜ํ”ฝ ๋„๊ตฌ
  • VisualVM: ๋” ๊ฐ•๋ ฅํ•œ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ
  • GC ๋กœ๊ทธ ๋ถ„์„ ๋„๊ตฌ (์˜ˆ: GCViewer)

์ด๋Ÿฐ ๋„๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด GC์˜ ๋นˆ๋„, ์ง€์† ์‹œ๊ฐ„, ํšŒ์ˆ˜๋œ ๋ฉ”๋ชจ๋ฆฌ ์–‘ ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์ฒญ์†Œ๋ถ€์˜ ํ™œ๋™์„ CCTV๋กœ ์ง€์ผœ๋ณด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ ! ๐Ÿ“น

5. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ํŠœ๋‹ ํŒ ๐Ÿ’ก

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์„ฑ์„ ์ดํ•ดํ•˜์„ธ์š”. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ํŒจํ„ด, ๋ฐ˜์‘ ์‹œ๊ฐ„ ์š”๊ตฌ์‚ฌํ•ญ ๋“ฑ์„ ํŒŒ์•…ํ•ด์•ผ ํ•ด์š”.
  2. ํ•œ ๋ฒˆ์— ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์„ธ์š”. ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์„ค์ •๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ทธ ์˜ํ–ฅ์„ ๊ด€์ฐฐํ•˜์„ธ์š”.
  3. GC ๋กœ๊ทธ๋ฅผ ํ•ญ์ƒ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”. ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์›์ธ์„ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋ผ์š”.
  4. ๋ฒค์น˜๋งˆํฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”. ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ๊ณผ ์œ ์‚ฌํ•œ ์กฐ๊ฑด์—์„œ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ด์š”.
  5. ์ตœ์‹  JVM ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ƒˆ๋กœ์šด ๋ฒ„์ „์—๋Š” GC ์„ฑ๋Šฅ ๊ฐœ์„ ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ํŠœ๋‹์€ ๋งˆ์น˜ ํผ์ฆ์„ ๋งž์ถ”๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์—ฌ๋Ÿฌ ์กฐ๊ฐ๋“ค์„ ์ ์ ˆํžˆ ์กฐํ•ฉํ•ด ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ์ฐพ์•„๋‚ด๋Š” ๊ฑฐ์ฃ . ๐Ÿงฉ ๋•Œ๋กœ๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ณ  ์ธ๋‚ด์‹ฌ์ด ํ•„์š”ํ•˜์ง€๋งŒ, ๊ฒฐ๊ณผ๋Š” ๋ถ„๋ช… ๋งŒ์กฑ์Šค๋Ÿฌ์šธ ๊ฑฐ์˜ˆ์š”!

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

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” JVM ํŠœ๋‹์˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์ธก๋ฉด๋“ค์„ ์‚ดํŽด๋ณผ ๊ฑฐ์˜ˆ์š”. JIT ์ปดํŒŒ์ผ๋Ÿฌ, ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ ๋“ฑ ๋” ๊นŠ์ด ์žˆ๋Š” ์ฃผ์ œ๋“ค๋กœ ์šฐ๋ฆฌ์˜ ์—ฌํ–‰์„ ๊ณ„์†ํ•ด ๋‚˜๊ฐˆ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ์šฐ๋ฆฌ์˜ JVM ํŠœ๋‹ ๋ชจํ—˜์€ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค! ๐Ÿš€๐ŸŒŸ

๊ทธ๋ฆฌ๊ณ  ์žŠ์ง€ ๋งˆ์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„์˜ JVM ํŠœ๋‹ ๊ฒฝํ—˜์„ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์—์„œ ๊ณต์œ ํ•ด๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ์ง€์‹์„ ๋‚˜๋ˆ„๊ณ  ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ๊ฐ’์ง„ ๊ฒฝํ—˜์ด ๋  ๊ฑฐ์˜ˆ์š”. ํ•จ๊ป˜ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ผ์›์ด ๋˜์–ด๋ณด์„ธ์š”! ๐ŸŒฑ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ

๐Ÿš€ JIT ์ปดํŒŒ์ผ๋Ÿฌ: JVM์˜ ํ„ฐ๋ณด ๋ถ€์Šคํ„ฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ JVM ํŠœ๋‹ ์—ฌํ–‰์—์„œ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์žฅ์†Œ์— ๋„์ฐฉํ–ˆ์–ด์š”. ๋ฐ”๋กœ JIT(Just-In-Time) ์ปดํŒŒ์ผ๋Ÿฌ์˜ˆ์š”! JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” JVM์˜ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ํ•ต์‹ฌ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋กœ, ๋งˆ์น˜ ์ž๋™์ฐจ์˜ ํ„ฐ๋ณด ๋ถ€์Šคํ„ฐ์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•ด์š”. ๐ŸŽ๏ธ๐Ÿ’จ

JIT ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ฃผ์š” ์—ญํ• :

  • ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜
  • ๋Ÿฐํƒ€์ž„ ์ค‘ ์ฝ”๋“œ ์ตœ์ ํ™” ์ˆ˜ํ–‰
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ

1. JIT ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ž‘๋™ ์›๋ฆฌ ๐Ÿ”

JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ ์ž‘๋™ํ•ด์š”:

  1. ํ”„๋กœํŒŒ์ผ๋ง: ์ฝ”๋“œ์˜ ์‹คํ–‰ ๋นˆ๋„์™€ ํŒจํ„ด์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ปดํŒŒ์ผ: ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ(ํ•ซ์ŠคํŒŸ)๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.
  3. ์ตœ์ ํ™”: ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋ฅผ ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•์œผ๋กœ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  4. ์บ์‹ฑ: ์ตœ์ ํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ฝ”๋“œ ์บ์‹œ์— ์ €์žฅํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์€ ๋งˆ์น˜ ์š”๋ฆฌ์‚ฌ๊ฐ€ ์ž์ฃผ ๋งŒ๋“œ๋Š” ์š”๋ฆฌ์˜ ๋ ˆ์‹œํ”ผ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์–ตํ•ด๋‘๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”. ๋‹ค์Œ์— ๊ฐ™์€ ์š”๋ฆฌ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋” ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒ ์ฃ ! ๐Ÿ‘จโ€๐Ÿณ๐Ÿณ

2. JIT ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ตœ์ ํ™” ๊ธฐ๋ฒ• ๐Ÿ› ๏ธ

JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์–‘ํ•œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ด์š”. ์ฃผ์š” ๊ธฐ๋ฒ•๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ์š”?

  • ์ธ๋ผ์ด๋‹: ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ๋ณธ๋ฌธ์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฃจํ”„ ์–ธ๋กค๋ง: ๋ฃจํ”„์˜ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ํƒˆ์ถœ ๋ถ„์„: ๊ฐ์ฒด๊ฐ€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํž™ ํ• ๋‹น์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋ถ„๊ธฐ ์˜ˆ์ธก: ์กฐ๊ฑด๋ฌธ์˜ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ ์Šคํ†จ์„ ์ค„์ž…๋‹ˆ๋‹ค.
  • ์ฃฝ์€ ์ฝ”๋“œ ์ œ๊ฑฐ: ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ตœ์ ํ™” ๊ธฐ๋ฒ•๋“ค์€ ๋งˆ์น˜ ์ž๋™์ฐจ ๊ฒฝ์ฃผ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋‹ค์–‘ํ•œ ์ „๋žต๊ณผ ๊ฐ™์•„์š”. ์ฝ”๋„ˆ๋ง์„ ์ตœ์ ํ™”ํ•˜๊ณ , ์—ฐ๋ฃŒ ํšจ์œจ์„ ๋†’์ด๊ณ , ๋ถˆํ•„์š”ํ•œ ๋ฌด๊ฒŒ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐Ÿ

3. JIT ์ปดํŒŒ์ผ๋Ÿฌ ํŠœ๋‹ ๐ŸŽ›๏ธ

JIT ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋™์ž‘์„ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ JVM ์˜ต์…˜๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”:

  • -XX:CompileThreshold: ๋ฉ”์„œ๋“œ๊ฐ€ JIT ์ปดํŒŒ์ผ๋˜๊ธฐ ์œ„ํ•œ ํ˜ธ์ถœ ํšŸ์ˆ˜ ์ž„๊ณ„๊ฐ’ ์„ค์ •
  • -XX:+TieredCompilation: ํ‹ฐ์–ด๋“œ ์ปดํŒŒ์ผ๋ ˆ์ด์…˜ ํ™œ์„ฑํ™” (๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋จ)
  • -XX:CICompilerCount: JIT ์ปดํŒŒ์ผ๋Ÿฌ ์Šค๋ ˆ๋“œ์˜ ์ˆ˜ ์„ค์ •
  • -XX:+PrintCompilation: JIT ์ปดํŒŒ์ผ ์ •๋ณด ์ถœ๋ ฅ

์˜ˆ๋ฅผ ๋“ค์–ด, JIT ์ปดํŒŒ์ผ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”:

java -XX:+PrintCompilation -jar MyApp.jar

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด JIT ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ์–ธ์ œ ์ปดํŒŒ์ผํ•˜๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์ž๋™์ฐจ ์—”์ง„์˜ ๋™์ž‘์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ ! ๐Ÿ“Š

JIT ์ปดํŒŒ์ผ๋Ÿฌ ์ž‘๋™ ๊ณผ์ • ๋‹ค์ด์–ด๊ทธ๋žจ JIT ์ปดํŒŒ์ผ๋Ÿฌ ์ž‘๋™ ๊ณผ์ • ํ”„๋กœํŒŒ์ผ๋ง ์ปดํŒŒ์ผ ์ตœ์ ํ™” ์ฝ”๋“œ ์บ์‹œ

์œ„ ๊ทธ๋ฆผ์€ JIT ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ž‘๋™ ๊ณผ์ •์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํ”„๋กœํŒŒ์ผ๋ง๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์ตœ์ข…์ ์œผ๋กœ ์ตœ์ ํ™”๋œ ์ฝ”๋“œ๊ฐ€ ์ฝ”๋“œ ์บ์‹œ์— ์ €์žฅ๋˜๋Š” ๊ณผ์ •์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ์ด ๊ณผ์ •์„ ํ†ตํ•ด JVM์€ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ํ•ด ๋‚˜๊ฐ€์š”. ๐Ÿ”„๐Ÿ“ˆ

4. JIT ์ปดํŒŒ์ผ๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง ๐Ÿ‘€

JIT ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋™์ž‘์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”:

  • jconsole: JVM์˜ ์ „๋ฐ˜์ ์ธ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋ž˜ํ”ฝ ๋„๊ตฌ
  • Java Flight Recorder (JFR): JVM์˜ ์ƒ์„ธํ•œ ํ”„๋กœํŒŒ์ผ๋ง ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋„๊ตฌ
  • JITWatch: JIT ์ปดํŒŒ์ผ ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋„๊ตฌ

์ด๋Ÿฐ ๋„๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด JIT ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ปดํŒŒ์ผํ•˜๋Š”์ง€, ์–ด๋–ค ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•˜๋Š”์ง€ ๋“ฑ์„ ์ž์„ธํžˆ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์ž๋™์ฐจ ์—”์ง„์˜ ๋‚ด๋ถ€๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ ! ๐Ÿ”ฌ๐Ÿ”ง

5. JIT ์ปดํŒŒ์ผ๋Ÿฌ ํŠœ๋‹ ํŒ ๐Ÿ’ก

  1. ํ‹ฐ์–ด๋“œ ์ปดํŒŒ์ผ๋ ˆ์ด์…˜์„ ํ™œ์šฉํ•˜์„ธ์š”. ์ด๋Š” ๋‹ค์–‘ํ•œ ์ตœ์ ํ™” ์ˆ˜์ค€์„ ์ ์ ˆํžˆ ์กฐํ•ฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œ์ผœ์š”.
  2. ์ฝ”๋“œ ์บ์‹œ ํฌ๊ธฐ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ํ•„์š”ํ•˜๋‹ค๋ฉด ์กฐ์ •ํ•˜์„ธ์š”. ์ฝ”๋“œ ์บ์‹œ๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์–ด์š”.
  3. ํ•ซ์ŠคํŒŸ ๋ฉ”์„œ๋“œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜์„ธ์š”. ์ด๋“ค์ด ์ „์ฒด ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์–ด์š”.
  4. JIT ์ปดํŒŒ์ผ๋Ÿฌ ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ CPU ์ฝ”์–ด ์ˆ˜์— ๋งž๊ฒŒ ์กฐ์ •ํ•ด๋ณด์„ธ์š”. ์ด๋Š” ์ปดํŒŒ์ผ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.
  5. OSR(On-Stack Replacement) ์ปดํŒŒ์ผ์„ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•˜์„ธ์š”. ์ด๋Š” ์žฅ๊ธฐ ์‹คํ–‰ ๋ฃจํ”„์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

JIT ์ปดํŒŒ์ผ๋Ÿฌ ํŠœ๋‹์€ ๋งˆ์น˜ ๊ณ ์„ฑ๋Šฅ ์ž๋™์ฐจ์˜ ์—”์ง„์„ ํŠœ๋‹ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์„ธ์‹ฌํ•œ ์กฐ์ •๊ณผ ์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ํ•„์š”ํ•˜์ง€๋งŒ, ๊ทธ ๊ฒฐ๊ณผ๋Š” ๋†€๋ผ์šธ ์ •๋„๋กœ ๊ฐ•๋ ฅํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐ŸŽ๏ธ๐Ÿ’จ

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” JVM์˜ ํ„ฐ๋ณด ๋ถ€์Šคํ„ฐ์ธ JIT ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ดค์–ด์š”. ์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋”์šฑ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์ž˜ ํŠœ๋‹๋œ ๋ ˆ์ด์‹ฑ์นด์ฒ˜๋Ÿผ, ์ตœ์ ํ™”๋œ JVM์€ ๋†€๋ผ์šด ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ†

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” JVM ํŠœ๋‹์˜ ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์ธก๋ฉด์ธ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์˜ ์„ธ๊ณ„๋กœ ๊นŠ์ด ๋“ค์–ด๊ฐ€ ๋ณผ ์ค€๋น„๊ฐ€ ๋˜์…จ๋‚˜์š”? ์šฐ๋ฆฌ์˜ JVM ํŠœ๋‹ ๋ชจํ—˜์€ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค! ๐Ÿš€๐ŸŒŸ

๊ทธ๋ฆฌ๊ณ  ์žŠ์ง€ ๋งˆ์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„์˜ JIT ์ปดํŒŒ์ผ๋Ÿฌ ํŠœ๋‹ ๊ฒฝํ—˜์„ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์—์„œ ๊ณต์œ ํ•ด๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฒฝํ—˜๊ณผ ์ธ์‚ฌ์ดํŠธ๋Š” ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ํฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ํ•จ๊ป˜ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ผ์›์ด ๋˜์–ด๋ณด์„ธ์š”! ๐ŸŒฑ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ

๐Ÿงต ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ: JVM์˜ ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ๋งˆ์Šคํ„ฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ JVM ํŠœ๋‹ ์—ฌํ–‰์—์„œ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์˜์—ญ์— ๋„์ฐฉํ–ˆ์–ด์š”. ๋ฐ”๋กœ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ์˜ˆ์š”! ์Šค๋ ˆ๋“œ๋Š” JVM์—์„œ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•ต์‹ฌ ์š”์†Œ๋กœ, ๋งˆ์น˜ ์—ฌ๋Ÿฌ ๋ช…์˜ ์š”๋ฆฌ์‚ฌ๊ฐ€ ๋™์‹œ์— ์ผํ•˜๋Š” ์ฃผ๋ฐฉ๊ณผ ๊ฐ™์•„์š”. ๐Ÿณ๐Ÿ‘จโ€๐Ÿณ๐Ÿ‘ฉโ€๐Ÿณ

ํšจ๊ณผ์ ์ธ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ์˜ ์ค‘์š”์„ฑ:

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์‹œ์„ฑ ํ–ฅ์ƒ
  • ๋ฆฌ์†Œ์Šค ํ™œ์šฉ๋„ ์ตœ์ ํ™”
  • ์‘๋‹ต ์‹œ๊ฐ„ ๊ฐœ์„ 
  • ์ „๋ฐ˜์ ์ธ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ ํ–ฅ์ƒ

1. JVM์˜ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ ์ดํ•ดํ•˜๊ธฐ ๐Ÿง 

JVM์˜ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ํšจ๊ณผ์ ์ธ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ์˜ ์ฒซ ๊ฑธ์Œ์ด์—์š”. JVM์€ ์šด์˜ ์ฒด์ œ์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ฐ Java ์Šค๋ ˆ๋“œ๋Š” ํ•˜๋‚˜์˜ OS ์Šค๋ ˆ๋“œ์— ๋งคํ•‘๋ผ์š”.

์ด๋Š” ๋งˆ์น˜ ๊ฐ ์š”๋ฆฌ์‚ฌ(Java ์Šค๋ ˆ๋“œ)๊ฐ€ ์ž์‹ ๋งŒ์˜ ์กฐ๋ฆฌ๋Œ€(OS ์Šค๋ ˆ๋“œ)๋ฅผ ๊ฐ€ ์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ ์š”๋ฆฌ์‚ฌ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์ผํ•  ์ˆ˜ ์žˆ์ฃ ! ๐Ÿฝ๏ธ

2. ์Šค๋ ˆ๋“œ ํ’€ ์ตœ์ ํ™” ๐ŸŠโ€โ™‚๏ธ

์Šค๋ ˆ๋“œ ํ’€์€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šค๋ ˆ๋“œ๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ, ํšจ์œจ์ ์ธ ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์š”. ์Šค๋ ˆ๋“œ ํ’€์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ฃผ๋ฐฉ์—์„œ ์ ์ ˆํ•œ ์ˆ˜์˜ ์š”๋ฆฌ์‚ฌ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”.

  • ํ’€ ํฌ๊ธฐ ์กฐ์ •: CPU ์ฝ”์–ด ์ˆ˜์™€ ์ž‘์—…์˜ ํŠน์„ฑ์„ ๊ณ ๋ คํ•ด ์ ์ ˆํ•œ ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ ์„ค์ •ํ•˜์„ธ์š”.
  • ์ž‘์—… ํ ๊ด€๋ฆฌ: ํ ํฌ๊ธฐ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์กฐ์ •ํ•˜์„ธ์š”.
  • ์Šค๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„: ์ค‘์š”ํ•œ ์ž‘์—…์— ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜์„ธ์š”.

์Šค๋ ˆ๋“œ ํ’€ ํฌ๊ธฐ ์„ค์ •์˜ ์ผ๋ฐ˜์ ์ธ ๊ณต์‹:

์Šค๋ ˆ๋“œ ์ˆ˜ = CPU ์ฝ”์–ด ์ˆ˜ * (1 + ๋Œ€๊ธฐ์‹œ๊ฐ„ / ์ฒ˜๋ฆฌ์‹œ๊ฐ„)

์ด ๊ณต์‹์€ ์‹œ์ž‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ์‹ค์ œ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ตœ์ ์˜ ๊ฐ’์„ ์ฐพ์•„์•ผ ํ•ด์š”.

3. ๋™๊ธฐํ™”์™€ ๋ฝ ์ตœ์ ํ™” ๐Ÿ”’

๋™๊ธฐํ™”๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์›์— ์•ˆ์ „ํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์ง€๋งŒ, ๊ณผ๋„ํ•œ ๋™๊ธฐํ™”๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Š” ๋งˆ์น˜ ์—ฌ๋Ÿฌ ์š”๋ฆฌ์‚ฌ๊ฐ€ ํ•˜๋‚˜์˜ ์นผ์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ํšจ์œจ์ ์ด์ง€ ์•Š์ฃ !

  • ์„ธ๋ฐ€ํ•œ ๋ฝ ์‚ฌ์šฉ: ํฐ ๋ฒ”์œ„์˜ ๋™๊ธฐํ™” ๋Œ€์‹  ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋™๊ธฐํ™”ํ•˜์„ธ์š”.
  • ๋ฝ-ํ”„๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ™œ์šฉ: ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ CAS(Compare-And-Swap) ๊ฐ™์€ ๋ฝ-ํ”„๋ฆฌ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ReentrantLock ํ™œ์šฉ: ๋” ์œ ์—ฐํ•œ ๋ฝํ‚น์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋™๊ธฐํ™” ์ตœ์ ํ™”๋Š” ๋งˆ์น˜ ์ฃผ๋ฐฉ์—์„œ ๊ฐ ์š”๋ฆฌ์‚ฌ์—๊ฒŒ ํ•„์š”ํ•œ ๋„๊ตฌ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๋ถˆํ•„์š”ํ•œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์ฃ ! โฑ๏ธ

4. ์Šค๋ ˆ๋“œ ๋คํ”„ ๋ถ„์„ ๐Ÿ•ต๏ธโ€โ™‚๏ธ

์Šค๋ ˆ๋“œ ๋คํ”„๋Š” JVM์˜ ๋ชจ๋“  ์Šค๋ ˆ๋“œ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์Šค๋ƒ…์ƒท์ด์—์š”. ์ด๋ฅผ ๋ถ„์„ํ•˜๋ฉด ๋ฐ๋“œ๋ฝ, ์Šค๋ ˆ๋“œ ๋ˆ„์ˆ˜, ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ๋“ฑ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์–ด์š”.

์Šค๋ ˆ๋“œ ๋คํ”„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•:

jcmd <pid> Thread.print

๋˜๋Š” jconsole, VisualVM ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

์Šค๋ ˆ๋“œ ๋คํ”„ ๋ถ„์„์€ ๋งˆ์น˜ ์ฃผ๋ฐฉ์˜ CCTV๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์–ด๋Š ์š”๋ฆฌ์‚ฌ๊ฐ€ ์–ด๋–ค ์ผ์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€, ๋ˆ„๊ฐ€ ๋‹ค๋ฅธ ์š”๋ฆฌ์‚ฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š”์ง€ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์ฃ ! ๐Ÿ“น

5. JVM ์Šค๋ ˆ๋“œ ๊ด€๋ จ ์˜ต์…˜ ๐Ÿ› ๏ธ

JVM์€ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ ์˜ต์…˜์„ ์ œ๊ณตํ•ด์š”:

  • -XX:ThreadStackSize: ์Šค๋ ˆ๋“œ ์Šคํƒ ํฌ๊ธฐ ์„ค์ •
  • -XX:ParallelGCThreads: ๋ณ‘๋ ฌ GC ์Šค๋ ˆ๋“œ ์ˆ˜ ์„ค์ •
  • -XX:ConcGCThreads: ๋™์‹œ GC ์Šค๋ ˆ๋“œ ์ˆ˜ ์„ค์ •
  • -XX:+UseThreadPriorities: ์Šค๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„ ์‚ฌ์šฉ ํ™œ์„ฑํ™”

์˜ˆ๋ฅผ ๋“ค์–ด, ์Šค๋ ˆ๋“œ ์Šคํƒ ํฌ๊ธฐ๋ฅผ 512KB๋กœ ์„ค์ •ํ•˜๋ ค๋ฉด:

java -XX:ThreadStackSize=512k -jar MyApp.jar

์ด๋Ÿฐ ์˜ต์…˜๋“ค์€ ๋งˆ์น˜ ์ฃผ๋ฐฉ์˜ ์„ค๋น„๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๊ฐ ์š”๋ฆฌ์‚ฌ์˜ ์ž‘์—… ๊ณต๊ฐ„ ํฌ๊ธฐ๋‚˜ ๋ณด์กฐ ์ธ๋ ฅ์˜ ์ˆ˜๋ฅผ ์กฐ์ ˆํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ๐Ÿ”ง

JVM ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ ๋‹ค์ด์–ด๊ทธ๋žจ JVM ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ ์Šค๋ ˆ๋“œ ํ’€ ๋™๊ธฐํ™” ๋ฝ ์ตœ์ ํ™” ์Šค๋ ˆ๋“œ ๋คํ”„

์œ„ ๊ทธ๋ฆผ์€ JVM ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ์˜ ์ฃผ์š” ์š”์†Œ๋“ค์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ํ’€, ๋™๊ธฐํ™”, ๋ฝ ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ์Šค๋ ˆ๋“œ ๋คํ”„ ๋ถ„์„์ด ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ์ด ์š”์†Œ๋“ค์„ ์ž˜ ๊ด€๋ฆฌํ•˜๋ฉด JVM์˜ ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ๋Šฅ๋ ฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿš€

6. ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๐Ÿ’ก

  1. ์Šค๋ ˆ๋“œ ์ƒ์„ฑ์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์ด๋ฏ€๋กœ, ๊ฐ€๋Šฅํ•œ ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  2. ์Šค๋ ˆ๋“œ ๊ฐ„ ํ†ต์‹ ์—๋Š” ๊ฐ€๋Šฅํ•œ BlockingQueue๋‚˜ CompletableFuture ๊ฐ™์€ ๊ณ ์ˆ˜์ค€ ๋™์‹œ์„ฑ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  3. ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์„ธ์š”.
  4. ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ ๊ฐ„ ๊ฐ„์„ญ์„ ์ค„์ด์„ธ์š”.
  5. ์ฃผ๊ธฐ์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ๋คํ”„๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•˜์„ธ์š”.

ํšจ๊ณผ์ ์ธ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ๋Š” ๋งˆ์น˜ ์ž˜ ์กฐ์ง๋œ ์ฃผ๋ฐฉ์—์„œ ์—ฌ๋Ÿฌ ์š”๋ฆฌ์‚ฌ๊ฐ€ ์กฐํ™”๋กญ๊ฒŒ ์ผํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๊ฐ์ž์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ณ , ์„œ๋กœ ๋ฐฉํ•ดํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ํ•„์š”ํ•  ๋•Œ ํ˜‘๋ ฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ด์š”. ๊ทธ ๊ฒฐ๊ณผ, ๋ง›์žˆ๋Š” ์š”๋ฆฌ(์ฆ‰, ํšจ์œจ์ ์ธ ํ”„๋กœ๊ทธ๋žจ)๊ฐ€ ํƒ„์ƒํ•˜๋Š” ๊ฑฐ์ฃ ! ๐Ÿฝ๏ธ๐Ÿ‘จโ€๐Ÿณ๐Ÿ‘ฉโ€๐Ÿณ

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” JVM์˜ ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ๋งˆ์Šคํ„ฐ์ธ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ดค์–ด์š”. ์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋”์šฑ ํšจ์œจ์ ์ด๊ณ  ๋ฐ˜์‘์„ฑ ์ข‹๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์ž˜ ์กฐ์ง๋œ ์ฃผ๋ฐฉ์—์„œ ๋‚˜์˜ค๋Š” ๋ง›์žˆ๋Š” ์š”๋ฆฌ์ฒ˜๋Ÿผ, ์ž˜ ๊ด€๋ฆฌ๋œ ์Šค๋ ˆ๋“œ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ํ›Œ๋ฅญํ•œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ†

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” JVM ํŠœ๋‹์˜ ๋งˆ์ง€๋ง‰ ์ค‘์š”ํ•œ ์ธก๋ฉด์ธ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ํ”„๋กœํŒŒ์ผ๋ง์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. JVM์˜ ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜๊ณ  ์„ฑ๋Šฅ์„ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ๋ณผ ์ค€๋น„๊ฐ€ ๋˜์…จ๋‚˜์š”? ์šฐ๋ฆฌ์˜ JVM ํŠœ๋‹ ๋ชจํ—˜์€ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค! ๐Ÿš€๐ŸŒŸ

๊ทธ๋ฆฌ๊ณ  ์žŠ์ง€ ๋งˆ์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„์˜ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ ๊ฒฝํ—˜๊ณผ ํŒ์„ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์—์„œ ๊ณต์œ ํ•ด๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? ์—ฌ๋Ÿฌ๋ถ„์˜ ์ธ์‚ฌ์ดํŠธ๋Š” ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ํฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ํ•จ๊ป˜ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ผ์›์ด ๋˜์–ด๋ณด์„ธ์š”! ๐ŸŒฑ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ

๐Ÿ” ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ํ”„๋กœํŒŒ์ผ๋ง: JVM์˜ ๊ฑด๊ฐ• ๊ฒ€์ง„

์ž, ์ด์ œ ์šฐ๋ฆฌ JVM ํŠœ๋‹ ์—ฌํ–‰์˜ ๋งˆ์ง€๋ง‰ ์ค‘์š”ํ•œ ๋‹จ๊ณ„์— ๋„์ฐฉํ–ˆ์–ด์š”. ๋ฐ”๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ํ”„๋กœํŒŒ์ผ๋ง์ด์—์š”! ์ด ๊ณผ์ •์€ ๋งˆ์น˜ ์šฐ๋ฆฌ ๋ชธ์˜ ๊ฑด๊ฐ• ๊ฒ€์ง„๊ณผ ๊ฐ™์•„์š”. JVM์˜ ์ƒํƒœ๋ฅผ ๊ผผ๊ผผํžˆ ์ฒดํฌํ•˜๊ณ , ์„ฑ๋Šฅ ๋ฌธ์ œ์˜ ์›์ธ์„ ์ฐพ์•„๋‚ด๋Š” ์ค‘์š”ํ•œ ๊ณผ์ •์ด์ฃ . ๐Ÿฅ๐Ÿ‘จโ€โš•๏ธ

๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ํ”„๋กœํŒŒ์ผ๋ง์˜ ์ค‘์š”์„ฑ:

  • JVM์˜ ์ „๋ฐ˜์ ์ธ ๊ฑด๊ฐ• ์ƒํƒœ ํŒŒ์•…
  • ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ์ง€์  ์‹๋ณ„
  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํƒ์ง€
  • ์ตœ์ ํ™” ํšจ๊ณผ ์ธก์ •
  • ๋ฌธ์ œ ๋ฐœ์ƒ ์ „ ์„ ์ œ์  ๋Œ€์‘

1. JVM ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ ๐Ÿ”ง

JVM ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋“ค์ด ์žˆ์–ด์š”. ์ด ๋„๊ตฌ๋“ค์€ ๋งˆ์น˜ ์˜์‚ฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ฒญ์ง„๊ธฐ, ์ฒด์˜จ๊ณ„, ํ˜ˆ์••๊ณ„์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•ด์š”.

  • jconsole: JDK์— ํฌํ•จ๋œ ๊ธฐ๋ณธ์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ
  • jvisualvm: ๋” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ
  • Java Mission Control (JMC): ๊ณ ๊ธ‰ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ด€๋ฆฌ ๋„๊ตฌ
  • Prometheus + Grafana: ์˜คํ”ˆ์†Œ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์•Œ๋ฆผ ์‹œ์Šคํ…œ

์ด๋Ÿฐ ๋„๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด CPU ์‚ฌ์šฉ๋ฅ , ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ์Šค๋ ˆ๋“œ ์ƒํƒœ, GC ํ™œ๋™ ๋“ฑ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์šฐ๋ฆฌ ๋ชธ์˜ ์ฒด์˜จ, ํ˜ˆ์••, ์‹ฌ๋ฐ•์ˆ˜๋ฅผ ์ฒดํฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ ! ๐Ÿ“Š

2. JVM ํ”„๋กœํŒŒ์ผ๋ง ๐Ÿ•ต๏ธโ€โ™‚๏ธ

ํ”„๋กœํŒŒ์ผ๋ง์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ๋” ๊นŠ์ด ๋ถ„์„ํ•˜๋Š” ๊ณผ์ •์ด์—์š”. ์ด๋Š” ๋งˆ์น˜ ์ •๋ฐ€ ๊ฒ€์ง„์„ ๋ฐ›๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”.

์ฃผ์š” ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ:

  • YourKit Java Profiler: ๊ฐ•๋ ฅํ•œ ์ƒ์šฉ ํ”„๋กœํŒŒ์ผ๋Ÿฌ
  • JProfiler: ๋˜ ๋‹ค๋ฅธ ์ธ๊ธฐ ์žˆ๋Š” ์ƒ์šฉ ํ”„๋กœํŒŒ์ผ๋Ÿฌ
  • async-profiler: ๋‚ฎ์€ ์˜ค๋ฒ„ํ—ค๋“œ์˜ ํ”„๋กœํŒŒ์ผ๋Ÿฌ
  • Eclipse Memory Analyzer (MAT): ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ถ„์„์— ํŠนํ™”๋œ ๋„๊ตฌ

ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์–ด์š”:

  • ๋ฉ”์„œ๋“œ๋ณ„ ์‹คํ–‰ ์‹œ๊ฐ„ ๋ฐ ํ˜ธ์ถœ ํšŸ์ˆ˜
  • ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์†Œ๋ฉธ ํŒจํ„ด
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ƒ์„ธ ๋ถ„์„
  • CPU ํ•ซ์ŠคํŒŸ ์‹๋ณ„

3. ์ฃผ์š” ๋ชจ๋‹ˆํ„ฐ๋ง ์ง€ํ‘œ ๐Ÿ“

ํšจ๊ณผ์ ์ธ JVM ํŠœ๋‹์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” ์ง€ํ‘œ๋“ค์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•ด์š”:

  • ํž™ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰: Young/Old ์˜์—ญ๋ณ„ ์‚ฌ์šฉ๋Ÿ‰ ๋ฐ GC ํ›„ ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜๋Ÿ‰
  • GC ๋นˆ๋„ ๋ฐ ์ง€์† ์‹œ๊ฐ„: Minor GC์™€ Major GC์˜ ๋ฐœ์ƒ ๋นˆ๋„์™€ ๊ฐ GC์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„
  • ์Šค๋ ˆ๋“œ ์ˆ˜: ํ™œ์„ฑ ์Šค๋ ˆ๋“œ ์ˆ˜, ๋Œ€๊ธฐ ์ค‘์ธ ์Šค๋ ˆ๋“œ ์ˆ˜
  • CPU ์‚ฌ์šฉ๋ฅ : JVM ํ”„๋กœ์„ธ์Šค์˜ CPU ์‚ฌ์šฉ๋ฅ 
  • ํด๋ž˜์Šค ๋กœ๋”ฉ: ๋กœ๋“œ๋œ ํด๋ž˜์Šค ์ˆ˜, ์–ธ๋กœ๋“œ๋œ ํด๋ž˜์Šค ์ˆ˜

์ด๋Ÿฐ ์ง€ํ‘œ๋“ค์€ ๋งˆ์น˜ ์šฐ๋ฆฌ ๋ชธ์˜ ๊ฐ์ข… ์ˆ˜์น˜๋“ค๊ณผ ๊ฐ™์•„์š”. ํ˜ˆ๋‹น, ์ฝœ๋ ˆ์Šคํ…Œ๋กค, ๊ฐ„ ์ˆ˜์น˜์ฒ˜๋Ÿผ JVM์˜ ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด์ฃผ๋Š” ์ค‘์š”ํ•œ ์ง€ํ‘œ๋“ค์ด์ฃ ! ๐Ÿ“ˆ

4. ์„ฑ๋Šฅ ๋ฌธ์ œ ์ง„๋‹จํ•˜๊ธฐ ๐Ÿ”ฌ

๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ฑ๋Šฅ ๋ฌธ์ œ๋“ค์„ ์ง„๋‹จํ•  ์ˆ˜ ์žˆ์–ด์š”:

  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜: ํž™ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ง€์†์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ
  • ๊ณผ๋„ํ•œ GC: GC ๋นˆ๋„๊ฐ€ ๋†’๊ณ  GC์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์ด ๊ธด ๊ฒฝ์šฐ
  • CPU ๋ณ‘๋ชฉ: ํŠน์ • ๋ฉ”์„œ๋“œ๊ฐ€ CPU ์‹œ๊ฐ„์„ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
  • ์Šค๋ ˆ๋“œ ๊ฒฝํ•ฉ: ๋งŽ์€ ์Šค๋ ˆ๋“œ๊ฐ€ BLOCKED ์ƒํƒœ์— ์žˆ๋Š” ๊ฒฝ์šฐ
  • I/O ๋ณ‘๋ชฉ: ์Šค๋ ˆ๋“œ๊ฐ€ I/O ์ž‘์—…์œผ๋กœ ์ธํ•ด ์ž์ฃผ ๋Œ€๊ธฐ ์ƒํƒœ์— ์žˆ๋Š” ๊ฒฝ์šฐ

์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์„ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ์€ ๋งˆ์น˜ ์˜์‚ฌ๊ฐ€ ์งˆ๋ณ‘์˜ ์ง•ํ›„๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•˜๊ณ  ๋Œ€์ฒ˜ํ• ์ˆ˜๋ก ๋” ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ฃ ! ๐Ÿฉบ

5. JVM ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ JMX ํ™œ์šฉ ๐Ÿ› ๏ธ

JMX(Java Management Extensions)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JVM์˜ ๋‹ค์–‘ํ•œ ์ง€ํ‘œ๋“ค์„ ์›๊ฒฉ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”. JMX๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ JVM ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์„ธ์š”:

java -Dcom.sun.management.jmxremote
     -Dcom.sun.management.jmxremote.port=9010
     -Dcom.sun.management.jmxremote.authenticate=false
     -Dcom.sun.management.jmxremote.ssl=false
     -jar MyApp.jar

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด JConsole์ด๋‚˜ ๋‹ค๋ฅธ JMX ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์›๊ฒฉ์œผ๋กœ JVM์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์›๊ฒฉ ์˜๋ฃŒ ์‹œ์Šคํ…œ์œผ๋กœ ํ™˜์ž์˜ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ ! ๐Ÿฅ๐Ÿ“ก

JVM ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ํ”„๋กœํŒŒ์ผ๋ง ๋‹ค์ด์–ด๊ทธ๋žจ JVM ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ํ”„๋กœํŒŒ์ผ๋ง ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ ์„ฑ๋Šฅ ์ง€ํ‘œ ๋ฌธ์ œ ์ง„๋‹จ

์œ„ ๊ทธ๋ฆผ์€ JVM ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ํ”„๋กœํŒŒ์ผ๋ง์˜ ์ „์ฒด์ ์ธ ๊ณผ์ •์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์™€ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ๊ณผ์ •์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ์ด ๊ณผ์ •์€ ์ง€์†์ ์œผ๋กœ ๋ฐ˜๋ณต๋˜์–ด์•ผ ํ•˜๋ฉฐ, JVM์˜ ๊ฑด๊ฐ•์„ ์œ ์ง€ํ•˜๋Š” ํ•ต์‹ฌ์ด์—์š”! ๐Ÿ”„

6. ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ํ”„๋กœํŒŒ์ผ๋ง ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๐Ÿ’ก

  1. ์ •๊ธฐ์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง ์ผ์ •์„ ์ˆ˜๋ฆฝํ•˜์„ธ์š”. ์ฃผ๊ธฐ์ ์ธ ๊ฑด๊ฐ• ๊ฒ€์ง„์ฒ˜๋Ÿผ JVM๋„ ์ •๊ธฐ์ ์œผ๋กœ ์ฒดํฌํ•ด์•ผ ํ•ด์š”.
  2. ๋ฒ ์ด์Šค๋ผ์ธ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์„ค์ •ํ•˜์„ธ์š”. ์ •์ƒ ์ƒํƒœ์˜ ์ง€ํ‘œ๋ฅผ ์•Œ์•„์•ผ ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  3. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ๊ณผ ์œ ์‚ฌํ•œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ํ”„๋กœํŒŒ์ผ๋ง์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”. ์‹ค์ œ ์ƒํ™ฉ์„ ๊ฐ€์žฅ ์ž˜ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  4. ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฒฐ๊ณผ๋ฅผ ํŒ€์›๋“ค๊ณผ ๊ณต์œ ํ•˜๊ณ  ํ•จ๊ป˜ ๋ถ„์„ํ•˜์„ธ์š”. ์—ฌ๋Ÿฌ ๊ด€์ ์—์„œ์˜ ๋ถ„์„์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์–ด์š”.
  5. ์„ฑ๋Šฅ ๊ฐœ์„  ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ ๋‹ค์‹œ ์ธก์ •ํ•˜์—ฌ ํšจ๊ณผ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๊ฐœ์„ ์ด ์˜๋„ํ•œ ๋Œ€๋กœ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ด์š”.

ํšจ๊ณผ์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ํ”„๋กœํŒŒ์ผ๋ง์€ ๋งˆ์น˜ ์ •๊ธฐ์ ์ธ ๊ฑด๊ฐ• ๊ฒ€์ง„๊ณผ ๊ฐ™์•„์š”. ๋ฌธ์ œ๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•˜๊ณ , JVM์˜ ๊ฑด๊ฐ•์„ ์˜ค๋ž˜๋„๋ก ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์š”. ๊ฑด๊ฐ•ํ•œ JVM์€ ๊ณง ๊ฑด๊ฐ•ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ด์–ด์ง€์ฃ ! ๐Ÿ’ช๐Ÿฅ

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” JVM์˜ ๊ฑด๊ฐ•์„ ์ฒดํฌํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ดค์–ด์š”. ์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋”์šฑ ๊ฑด๊ฐ•ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์ •๊ธฐ์ ์œผ๋กœ ๊ฑด๊ฐ• ๊ฒ€์ง„์„ ๋ฐ›๊ณ  ์šด๋™ํ•˜๋Š” ์‚ฌ๋žŒ์ฒ˜๋Ÿผ, ์ž˜ ๊ด€๋ฆฌ๋œ JVM์€ ์˜ค๋žซ๋™์•ˆ ์ตœ์ƒ์˜ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿƒโ€โ™‚๏ธ๐Ÿฅ‡

์ด๊ฒƒ์œผ๋กœ ์šฐ๋ฆฌ์˜ JVM ํŠœ๋‹ ์—ฌํ–‰์ด ๋๋‚˜๊ฐ€๊ณ  ์žˆ์–ด์š”. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜, JIT ์ปดํŒŒ์ผ๋Ÿฌ, ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ํ”„๋กœํŒŒ์ผ๋ง๊นŒ์ง€, JVM์˜ ๋ชจ๋“  ์ค‘์š”ํ•œ ์ธก๋ฉด๋“ค์„ ์‚ดํŽด๋ดค์–ด์š”. ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ JVM ํŠœ๋‹์˜ ์ง„์ •ํ•œ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋˜์—ˆ์–ด์š”! ๐ŸŽ“๐Ÿ†

๋งˆ์ง€๋ง‰์œผ๋กœ, ์—ฌ๋Ÿฌ๋ถ„์˜ JVM ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฝํ—˜์„ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์—์„œ ๊ณต์œ ํ•ด๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฐœ๊ฒฌํ•œ ํฅ๋ฏธ๋กœ์šด ์„ฑ๋Šฅ ๋ฌธ์ œ๋‚˜, ํšจ๊ณผ์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง ์ „๋žต ๋“ฑ์„ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ๋‚˜๋ˆ„์–ด๋ณด์„ธ์š”. ํ•จ๊ป˜ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ผ์›์ด ๋˜์–ด๋ณด์„ธ์š”! ๐ŸŒฑ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ

JVM ํŠœ๋‹์˜ ์„ธ๊ณ„๋Š” ๋Š์ž„์—†์ด ๋ณ€ํ™”ํ•˜๊ณ  ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์–ด์š”. ์ƒˆ๋กœ์šด ๋„๊ตฌ์™€ ๊ธฐ์ˆ ์ด ๊ณ„์†ํ•ด์„œ ๋“ฑ์žฅํ•˜๊ณ  ์žˆ์ฃ . ์ด ์—ฌํ–‰์ด ๋๋‚ฌ๋‹ค๊ณ  ํ•ด์„œ ํ•™์Šต์„ ๋ฉˆ์ถ”์ง€ ๋งˆ์„ธ์š”. ๊ณ„์†ํ•ด์„œ ํ˜ธ๊ธฐ์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐฐ์šฐ๊ณ  ์‹คํ—˜ํ•ด๋ณด์„ธ์š”. ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์ง„์ •ํ•œ JVM ํŠœ๋‹ ๋งˆ์Šคํ„ฐ์˜ ์ž์„ธ์˜ˆ์š”! ๐Ÿš€๐ŸŒŸ

์—ฌ๋Ÿฌ๋ถ„์˜ JVM ํŠœ๋‹ ์—ฌํ–‰์ด ์ฆ๊ฒ๊ณ  ์œ ์ตํ–ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ JVM์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ณ , ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๊ณ , ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ–์ถ”๊ฒŒ ๋˜์—ˆ์–ด์š”. ์ด ์ง€์‹์„ ํ™œ์šฉํ•ด ๋” ๋‚˜์€ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ€์„ธ์š”. ํ™”์ดํŒ…! ๐Ÿ’ช๐Ÿ˜Š