JVM Overview

Java๋Š” ์ „ ์„ธ๊ณ„์—์„œ ๊ฐ€์žฅ ํฐ ๊ธฐ์ˆ  ํ”Œ๋žซํผ ์ค‘ ํ•˜๋‚˜๋กœ, ์•ฝ 900๋งŒ์—์„œ 1000๋งŒ ๋ช…์˜ ๊ฐœ๋ฐœ์ž๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์˜์‹ฌ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์„ค๊ณ„์ƒ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž์‹ ์ด ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋žซํผ์˜ ์ €์ˆ˜์ค€ ๋ณต์žก์„ฑ์— ๋Œ€ํ•ด ์•Œ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

์ธํ„ฐํ”„๋ฆฌํŒ…๊ณผ ํด๋ž˜์Šค ๋กœ๋”ฉ

Java ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ •์˜ํ•˜๋Š” ๋ช…์„ธ์„œ์— ๋”ฐ๋ฅด๋ฉด, JVM์€ ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๊ธฐ๊ณ„์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ฌผ๋ฆฌ์  ํ•˜๋“œ์›จ์–ด CPU์™€ ๊ฐ™์€ ๋ ˆ์ง€์Šคํ„ฐ ๋Œ€์‹ , ๋ถ€๋ถ„ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ์‹คํ–‰ ์Šคํƒ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ทธ ์Šคํƒ์˜ ์ตœ์ƒ์œ„ ๊ฐ’(๋˜๋Š” ๊ฐ’๋“ค)์„ ์กฐ์ž‘ํ•˜์—ฌ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

JVM ์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ ๊ธฐ๋ณธ ๋™์ž‘์€ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ opcode๋ฅผ ๋งˆ์ง€๋ง‰ ๊ฒƒ๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ํ‰๊ฐ€ ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๊ฐ„ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” "while ๋ฃจํ”„ ๋‚ด์˜ ์Šค์œ„์น˜"๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์‚ฌํ•ญ(Main)
Oracle/OpenJDK VM(HotSpot)์˜ ๋‚ด๋ถ€๋ฅผ ์ž์„ธํžˆ ๋“ค์—ฌ๋‹ค๋ณด๋ฉด, ์‹ค์ œ ํ”„๋กœ๋•์…˜ ๊ธ‰ Java ์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ ์ƒํ™ฉ์€ ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ˜„์žฌ๋กœ์„œ๋Š” while ๋ฃจํ”„ ๋‚ด์˜ ์Šค์œ„์น˜๋ผ๋Š” ์ •์‹ ์  ๋ชจ๋ธ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ `java HelloWorld` ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•˜๋ฉด, ์šด์˜ ์ฒด์ œ๊ฐ€ ๊ฐ€์ƒ ๋จธ์‹  ํ”„๋กœ์„ธ์Šค(java ๋ฐ”์ด๋„ˆ๋ฆฌ)๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Java ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๊ณ , HelloWorld ํด๋ž˜์Šค ํŒŒ์ผ์˜ ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•  ์Šคํƒ ๋จธ์‹ ์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง„์ž…์ ์€ `HelloWorld.class`์˜ `main()` ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค์— ์ œ์–ด๋ฅผ ๋„˜๊ธฐ๋ ค๋ฉด, ์‹คํ–‰์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๊ฐ€์ƒ ๋จธ์‹ ์ด ์ด ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด Java ํด๋ž˜์Šค ๋กœ๋”ฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด Java ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ดˆ๊ธฐํ™”๋  ๋•Œ, ํด๋ž˜์Šค ๋กœ๋” ์ฒด์ธ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 
์ดˆ๊ธฐ ๋กœ๋”๋Š” Bootstrap ํด๋ž˜์Šค ๋กœ๋”๋กœ, ํ•ต์‹ฌ Java ๋Ÿฐํƒ€์ž„์˜ ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. 
Bootstrap ํด๋ž˜์Šค ๋กœ๋”์˜ ์ฃผ์š” ๋ชฉ์ ์€ ์ตœ์†Œํ•œ์˜ ํด๋ž˜์Šค ์ง‘ํ•ฉ(์˜ˆ: `java.lang.Object`, `Class`, `Classloader` ๋“ฑ)์„ ๋กœ๋“œํ•˜์—ฌ ๋‹ค๋ฅธ ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ฐธ๊ณ  ์‚ฌํ•ญ(ํด๋ž˜์Šค ๋กœ๋”ฉ)
Java๋Š” ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ์ž์ฒด ๋Ÿฐํƒ€์ž„๊ณผ ํƒ€์ž… ์‹œ์Šคํ…œ ๋‚ด์˜ ๊ฐ์ฒด๋กœ ๋ชจ๋ธ๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐ ํด๋ž˜์Šค ๋กœ๋” ์ง‘ํ•ฉ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 
๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ •์˜ํ•˜๋Š” ๋ฐ ์ˆœํ™˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ์œผ๋กœ Extension ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” Bootstrap ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ๋ถ€๋ชจ๋กœ ์ •์˜ํ•˜๋ฉฐ, ํ•„์š” ์‹œ ๋ถ€๋ชจ์—๊ฒŒ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค. 
ํ™•์žฅ์€ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜์ง€๋Š” ์•Š์ง€๋งŒ, ํŠน์ • ์šด์˜ ์ฒด์ œ์™€ ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ์˜ค๋ฒ„๋ผ์ด๋“œ ๋ฐ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
ํŠนํžˆ Java 8์—์„œ ๋„์ž…๋œ Nashorn JavaScript ๋Ÿฐํƒ€์ž„์€ Extension ๋กœ๋”์— ์˜ํ•ด ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ Application ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ •์˜๋œ ํด๋ž˜์ŠคํŒจ์Šค์—์„œ ์‚ฌ์šฉ์ž ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. 
์ผ๋ถ€ ํ…์ŠคํŠธ์—์„œ๋Š” ์ด๋ฅผ "System" ํด๋ž˜์Šค ๋กœ๋”๋ผ๊ณ  ๋ถ€๋ฅด์ง€๋งŒ, ์ด๋Š” ์‹œ์Šคํ…œ ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
Application ํด๋ž˜์Šค ๋กœ๋”๋Š” ๋งค์šฐ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋ฉฐ, Extension ๋กœ๋”๋ฅผ ๋ถ€๋ชจ๋กœ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

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

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

๋ฐ”์ดํŠธ์ฝ”๋“œ ์‹คํ–‰

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

javac์˜ ์—ญํ• ์€ Java ์ฝ”๋“œ๋ฅผ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” .class ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” Java ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋น„๊ต์  ์ง์ ‘์ ์œผ๋กœ ๋ฒˆ์—ญํ•˜์—ฌ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ์ค‘์— javac๋Š” ๊ฑฐ์˜ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒ์„ฑ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” ํ‘œ์ค€ javap๊ณผ ๊ฐ™์€ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ ๋„๊ตฌ๋กœ ๋ณผ ๋•Œ ์—ฌ์ „ํžˆ ์ƒ๋‹นํžˆ ์ฝ๊ธฐ ์‰ฝ๊ณ  Java ์ฝ”๋“œ๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ฐธ๊ณ  ์‚ฌํ•ญ(ํด๋ž˜์Šค ํŒŒ์ผ)
Java ์–ธ์–ด์™€ Java ๊ฐ€์ƒ ๋จธ์‹ ์€ ์–ด๋Š ์ •๋„ ๋…๋ฆฝ์ ์ด๋ฏ€๋กœ, JVM์˜ "J"๋Š” ๋‹ค์†Œ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
JVM์€ ์œ ํšจํ•œ ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  JVM ์–ธ์–ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

์–ด๋–ค ์†Œ์Šค ์ฝ”๋“œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋“ , ๊ฒฐ๊ณผ ํด๋ž˜์Šค ํŒŒ์ผ์€ VM ๋ช…์„ธ์„œ(Table 2-1)์— ์˜ํ•ด ๋งค์šฐ ์ž˜ ์ •์˜๋œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 
JVM์— ์˜ํ•ด ๋กœ๋“œ๋˜๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๋Š” ์‹คํ–‰์„ ํ—ˆ์šฉํ•˜๊ธฐ ์ „์— ์˜ˆ์ƒ๋œ ํ˜•์‹์— ๋งž๋Š”์ง€ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

์„ค๋ช…

๋งค์ง ๋„˜๋ฒ„(Magic number)

0xCAFEBABE

ํด๋ž˜์Šค ํŒŒ์ผ ํ˜•์‹ ๋ฒ„์ „

ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ๋งˆ์ด๋„ˆ ๋ฐ ๋ฉ”์ด์ € ๋ฒ„์ „

์ƒ์ˆ˜ ํ’€(Constant pool)

ํด๋ž˜์Šค์˜ ์ƒ์ˆ˜ ํ’€

์•ก์„ธ์Šค ํ”Œ๋ž˜๊ทธ(Access flags)

ํด๋ž˜์Šค๊ฐ€ ์ถ”์ƒ์ ์ธ์ง€, ์ •์ ์ธ์ง€ ๋“ฑ์˜ ์ˆ˜์ •์ž๋ฅผ ๊ฒฐ์ •

์ด ํด๋ž˜์Šค(This class)

ํ˜„์žฌ ํด๋ž˜์Šค์˜ ์ด๋ฆ„

์Šˆํผ ํด๋ž˜์Šค(Superclass)

์Šˆํผ ํด๋ž˜์Šค์˜ ์ด๋ฆ„

์ธํ„ฐํŽ˜์ด์Šค(Interfaces)

ํด๋ž˜์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค

ํ•„๋“œ(Fields)

ํด๋ž˜์Šค์˜ ํ•„๋“œ

๋ฉ”์„œ๋“œ(Methods)

ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ

์†์„ฑ(Attributes)

ํด๋ž˜์Šค์˜ ์†์„ฑ (์˜ˆ: ์†Œ์Šค ํŒŒ์ผ ์ด๋ฆ„ ๋“ฑ)

๋ชจ๋“  ํด๋ž˜์Šค ํŒŒ์ผ์€ ๋งค์ง ๋„˜๋ฒ„ 0xCAFEBABE๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ, ์ด๋Š” ํด๋ž˜์Šค ํŒŒ์ผ ํ˜•์‹์— ๋Œ€ํ•œ ์ค€์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ฒซ ๋ฒˆ์งธ 4๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ 4๋ฐ”์ดํŠธ๋Š” ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ๋งˆ์ด๋„ˆ ๋ฐ ๋ฉ”์ด์ € ๋ฒ„์ „์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ด๋Š” ๋Œ€์ƒ JVM์ด ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•œ ๋ฒ„์ „๋ณด๋‹ค ๋‚ฎ์ง€ ์•Š์€์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ฒ€์‚ฌ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ด๋„ˆ ๋ฐ ๋ฉ”์ด์ € ๋ฒ„์ „์€ ํด๋ž˜์Šค ๋กœ๋”์— ์˜ํ•ด ํ˜ธํ™˜์„ฑ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ฒ€์‚ฌ๋˜๋ฉฐ, ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„์— UnsupportedClassVersionError๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์‹คํ–‰ ์ค‘์ธ JVM์ด ์ปดํŒŒ์ผ๋œ ํด๋ž˜์Šค ํŒŒ์ผ๋ณด๋‹ค ๋‚ฎ์€ ๋ฒ„์ „์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ฐธ๊ณ 
๋งค์ง ๋„˜๋ฒ„๋Š” Unix ํ™˜๊ฒฝ์—์„œ ํŒŒ์ผ์˜ ์œ ํ˜•์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€๋งŒ(Windows๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉ), ํ•œ ๋ฒˆ ๊ฒฐ์ •๋˜๋ฉด ๋ณ€๊ฒฝํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. 
๋ถˆํ–‰ํžˆ๋„, ์ด๋Š” Java๊ฐ€ ๋‹ค๊ฐ€์˜ค๋Š” ๋ฏธ๋ž˜์—๋„ ๋‹ค์†Œ ๋ถ€๋„๋Ÿฝ๊ณ  ์„ฑ์ฐจ๋ณ„์ ์ธ `0xCAFEBABE`๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 
๊ทธ๋Ÿฌ๋‚˜ Java 9์—์„œ๋Š” ๋ชจ๋“ˆ ํŒŒ์ผ์šฉ ๋งค์ง ๋„˜๋ฒ„ `0xCAFEDADA`๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ƒ์ˆ˜ ํ’€์€ ์ฝ”๋“œ ๋‚ด์˜ ์ƒ์ˆ˜ ๊ฐ’์„ ๋ณด์œ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ํ•„๋“œ์˜ ์ด๋ฆ„ ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. 
JVM์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, ์ƒ์ˆ˜ ํ’€ ํ…Œ์ด๋ธ”์€ ๋Ÿฐํƒ€์ž„์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์•ก์„ธ์Šค ํ”Œ๋ž˜๊ทธ๋Š” ํด๋ž˜์Šค์— ์ ์šฉ๋œ ์ˆ˜์ •์ž๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 
ํ”Œ๋ž˜๊ทธ์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ํด๋ž˜์Šค๊ฐ€ ๊ณต๊ฐœ(public)์ธ์ง€ ์—ฌ๋ถ€์™€ ๊ฐ™์€ ์ผ๋ฐ˜ ์†์„ฑ์„ ์‹๋ณ„ํ•˜๋ฉฐ, ๊ทธ ๋‹ค์Œ์œผ๋กœ ํด๋ž˜์Šค๊ฐ€ ์ตœ์ข…(final)์ธ์ง€, ์„œ๋ธŒํด๋ž˜์‹ฑํ•  ์ˆ˜ ์—†๋Š”์ง€ ๋“ฑ์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. 
ํ”Œ๋ž˜๊ทธ์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์€ ํด๋ž˜์Šค ํŒŒ์ผ์ด ์†Œ์Šค ์ฝ”๋“œ์— ์—†๋Š” ํ•ฉ์„ฑ ํด๋ž˜์Šค์ธ์ง€, ์ฃผ์„ ์œ ํ˜•์ธ์ง€, ์—ด๊ฑฐํ˜•(enum)์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

`This class`, `Superclass`, ๋ฐ `Interface` ํ•ญ๋ชฉ์€ ์ƒ์ˆ˜ ํ’€ ๋‚ด์˜ ์ธ๋ฑ์Šค๋กœ ํด๋ž˜์Šค์˜ ํƒ€์ž… ๊ณ„์ธต์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ๋Š” ํ•„๋“œ ๋˜๋Š” ๋ฉ”์„œ๋“œ์— ์ ์šฉ๋˜๋Š” ์ˆ˜์ •์ž๋ฅผ ํฌํ•จํ•œ ์„œ๋ช…๊ณผ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. 
์ผ๋ จ์˜ ์†์„ฑ์€ ๋” ๋ณต์žกํ•˜๊ณ  ๊ณ ์ • ํฌ๊ธฐ๊ฐ€ ์•„๋‹Œ ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 
public class HelloWorld {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println("Hello World");
        }
    }
}

Java์—๋Š” .class ํŒŒ์ผ์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” javap๋ผ๋Š” ํด๋ž˜์Šค ํŒŒ์ผ ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๊ฐ€ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. HelloWorld.class ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€ javap -c HelloWorld ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ์ด ๋‚˜์˜ต๋‹ˆ๋‹ค

public class HelloWorld {
    public HelloWorld();
    Code:
       0: aload_0
       1: invokespecial #1 <init>":()V
       4: return
    // Method java/lang/Object.<init>():V
    public static void main(java.lang.String[]);
    Code:
       0: iconst_0
       1: istore_1
       2: iload_1
       3: bipush 10
       5: if_icmplt 8
       8: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
      11: ldc #3 // String Hello World
      13: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      16: iinc 1, 1
      19: goto 2
      22: return
}

์ด ๋ ˆ์ด์•„์›ƒ์€ HelloWorld.class ํŒŒ์ผ์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ javap์— -v ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ „์ฒด ํด๋ž˜์Šค ํŒŒ์ผ ํ—ค๋” ์ •๋ณด์™€ ์ƒ์ˆ˜ ํ’€ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ํŒŒ์ผ์—๋Š” ๋‘ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ, ์†Œ์Šค ํŒŒ์ผ์— ์ œ๊ณต๋œ ๋‹จ์ผ main() ๋ฉ”์„œ๋“œ๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž์—์„œ ์‹คํ–‰๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ช…๋ น์–ด๋Š” aload_0์œผ๋กœ, ์ด๋Š” this ์ฐธ์กฐ๋ฅผ ์Šคํƒ์˜ ์ฒซ ๋ฒˆ์งธ ์œ„์น˜์— ๋†“์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ invokespecial ๋ช…๋ น์–ด๊ฐ€ ํ˜ธ์ถœ๋˜๋Š”๋ฐ, ์ด๋Š” ์Šˆํผ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŠน์ •ํ•œ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์—์„œ๋Š” ํ˜ธ์ถœ์ด Object์˜ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์‚ฌํ•ญ
JVM์˜ opcode๋Š” ๊ฐ„๊ฒฐํ•˜๋ฉฐ, ํƒ€์ž…, ์—ฐ์‚ฐ ๋ฐ ๋กœ์ปฌ ๋ณ€์ˆ˜, ์ƒ์ˆ˜ ํ’€, ์Šคํƒ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

`main()` ๋ฉ”์„œ๋“œ๋กœ ๋„˜์–ด๊ฐ€๋ฉด, `iconst_0`์€ ์ •์ˆ˜ ์ƒ์ˆ˜ 0์„ ํ‰๊ฐ€ ์Šคํƒ์— ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค. 
`istore_1`์€ ์ด ์ƒ์ˆ˜ ๊ฐ’์„ ๋ฃจ์ปฌ ๋ณ€์ˆ˜ ์˜คํ”„์…‹ 1(๋ฃจํ”„์˜ i ๋ณ€์ˆ˜)์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฃจ์ปฌ ๋ณ€์ˆ˜ ์˜คํ”„์…‹์€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์ง€๋งŒ, ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ 0๋ฒˆ์งธ ํ•ญ๋ชฉ์€ ํ•ญ์ƒ `this`์ž…๋‹ˆ๋‹ค. 
์˜คํ”„์…‹ 1์˜ ๋ณ€์ˆ˜๋Š” ๋‹ค์‹œ ์Šคํƒ์— ๋กœ๋“œ๋˜๊ณ , `bipush 10`์ด ํ‘ธ์‹œ๋˜์–ด ๋น„๊ต์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค(`if_icmplt`, "if integer compare less than"). 

์ดˆ๊ธฐ ๋ช‡ ๋ฒˆ์˜ ๋ฐ˜๋ณต์—์„œ๋Š” ์ด ๋น„๊ต ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋ฏ€๋กœ, ๋ช…๋ น์–ด 8๋กœ ๊ณ„์† ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. 
์—ฌ๊ธฐ์„œ `System.out`์˜ ์ •์  ๋ฉ”์„œ๋“œ๊ฐ€ ํ•ด์ƒ๋˜๊ณ , ์ƒ์ˆ˜ ํ’€์—์„œ "Hello World" ๋ฌธ์ž์—ด์ด ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. 
๋‹ค์Œ `invokevirtual`์€ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. 
์ •์ˆ˜๊ฐ€ ์ฆ๊ฐ€๋˜๊ณ  `goto`๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ๋ช…๋ น์–ด 2๋กœ ๋ฃจํ”„๊ฐ€ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์€ `if_icmplt` ๋น„๊ต๊ฐ€ ๊ฒฐ๊ตญ ์„ฑ๊ณตํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค(๋ฃจํ”„ ๋ณ€์ˆ˜๊ฐ€ 10 ์ด์ƒ์ด ๋  ๋•Œ). 
๊ทธ ๋ฐ˜๋ณต์—์„œ๋Š” ์ œ์–ด๊ฐ€ ๋ช…๋ น์–ด 22๋กœ ๋„˜์–ด๊ฐ€๊ณ  ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

HotSpot ์†Œ๊ฐœ

1999๋…„ 4์›”, Sun์€ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ Java์— ๊ฐ€์žฅ ํฐ ๋ณ€ํ™”๋ฅผ ๊ฐ€์ ธ์˜จ ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ธ HotSpot ๊ฐ€์ƒ ๋จธ์‹ ์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. HotSpot ๊ฐ€์ƒ ๋จธ์‹ ์€ C ๋ฐ C++์™€ ๊ฐ™์€ ์–ธ์–ด์™€ ๋น„๊ตํ•  ๋•Œ ๋™๋“ฑํ•˜๊ฑฐ๋‚˜ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” Java์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค

์–ธ์–ด ๋ฐ ํ”Œ๋žซํผ ์„ค๊ณ„๋Š” ์ข…์ข… ์›ํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ณ  ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, "์ œ๋กœ-์˜ค๋ฒ„ํ—ค๋“œ ์ถ”์ƒํ™”(zero-cost abstractions)"์™€ ๊ฐ™์€ ์•„์ด๋””์–ด์— ์˜์กดํ•˜๋Š” ์–ธ์–ด์™€, ๊ฐœ๋ฐœ์ž ์ƒ์‚ฐ์„ฑ๊ณผ "์ผ์„ ๋๋‚ด๋Š” ๊ฒƒ(getting things done)"์„ ์šฐ์„ ์‹œํ•˜๋Š” ์–ธ์–ด ๊ฐ„์˜ ๋ถ„ํ• ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

โ€”Bjarne Stroustrup

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

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œ ์‹œ์ ์— ํŠน์ • ํ”Œ๋žซํผ์˜ ๊ธฐ๊ณ„ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ๋„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹คโ€”์ด๋Š” ๋ณดํ†ต Ahead-of-Time (AOT) ์ปดํŒŒ์ผ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ, ๊ฐ€์ƒ ๋จธ์‹  ๋ฐ ํฌํ„ฐ๋ธ”๋ฆฌํ‹ฐ ๋ ˆ์ด์–ด์™€ ๊ฐ™์€ ๋Œ€์ฒด ์‹คํ–‰ ๋ชจ๋ธ์ด ์ œ๋กœ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

Java๋Š” ์ œ๋กœ ์˜ค๋ฒ„ํ—ค๋“œ ์ถ”์ƒํ™” ์ฒ ํ•™์„ ๋”ฐ๋ฅด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , HotSpot ๊ฐ€์ƒ ๋จธ์‹ ์ด ์ทจํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ”„๋กœ๊ทธ๋žจ์˜ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์„ ๋ถ„์„ํ•˜๊ณ  ์„ฑ๋Šฅ์— ๊ฐ€์žฅ ํฐ ์ด์ ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์— ์ง€๋Šฅ์ ์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. HotSpot VM์˜ ๋ชฉํ‘œ๋Š” JVM์— ๋งž์ถ”๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ์™œ๊ณกํ•˜๋Š” ๋Œ€์‹ , ๊ด€์šฉ์ ์ธ Java๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ข‹์€ ์„ค๊ณ„ ์›์น™์„ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Just-in-Time ์ปดํŒŒ์ผ ์†Œ๊ฐœ

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

HotSpot์€ ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹จ์œ„๋ฅผ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค. HotSpot VM์—์„œ ์ปดํŒŒ์ผ ๋‹จ์œ„๋Š” ๋ฉ”์„œ๋“œ์™€ ๋ฃจํ”„์ž…๋‹ˆ๋‹ค. ์ด๋Š” Just-in-Time (JIT) ์ปดํŒŒ์ผ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, HotSpot์€ ์ˆ˜๋ฐฑ ๋…„ ์ด์ƒ์˜ ๊ณตํ•™์  ๊ฐœ๋ฐœ ์‹œ๊ฐ„์ด ์ถ•์ ๋˜์—ˆ์œผ๋ฉฐ, ๊ฑฐ์˜ ๋ชจ๋“  ์ƒˆ๋กœ์šด ๋ฆด๋ฆฌ์Šค๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ตœ์ ํ™”์™€ ์ด์ ์ด ์ถ”๊ฐ€๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” HotSpot์˜ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด VM์— ์กด์žฌํ•˜๋Š” ์ƒˆ๋กœ์šด ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์žฌ์ปดํŒŒ์ผํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ”์ดํŠธ ์ฝ”๋“œ
Java ์†Œ์Šค์—์„œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋˜๊ณ  ์ด์ œ ๋˜ ๋‹ค๋ฅธ ๋‹จ๊ณ„์˜ JIT ์ปดํŒŒ์ผ์„ ๊ฑฐ์น˜๋ฉด์„œ, ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋Š” ์ž‘์„ฑ๋œ ์›๋ณธ Java ์†Œ์Šค ์ฝ”๋“œ์™€ ๋งค์šฐ ๋‹ค๋ฅด๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์ธ์‹ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.   
์ด๋Š” ํ•ต์‹ฌ ํ†ต์ฐฐ๋ ฅ์ด๋ฉฐ, ์„ฑ๋Šฅ ๊ด€๋ จ ์กฐ์‚ฌ์— ์ ‘๊ทผํ•˜๋Š” ์šฐ๋ฆฌ์˜ ๋ฐฉ์‹์„ ์ขŒ์šฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.   
JVM์—์„œ ์‹คํ–‰๋˜๋Š” JIT ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋Š” ์›๋ณธ Java ์†Œ์Šค ์ฝ”๋“œ์™€ ์ „ํ˜€ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  

C++์™€ ๊ฐ™์€ ์–ธ์–ด(๊ทธ๋ฆฌ๊ณ  ์‹ ํฅ ์–ธ์–ด์ธ Rust)๋Š” ๋” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์„ฑ๋Šฅ์„ ๊ฐ€์ง€๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์ง€๋งŒ, ์ด๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งŽ์€ ์ €์ˆ˜์ค€ ๋ณต์žก์„ฑ์„ ๊ฐ•์š”ํ•˜๋Š” ๋Œ€๊ฐ€๋ฅผ ์น˜๋Ÿฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

AOT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ฝ”๋“œ๊ฐ€ ๋‹ค์–‘ํ•œ ํ”„๋กœ์„ธ์„œ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ์ปดํŒŒ์ผํ•˜๋ฉฐ, ํŠน์ • ํ”„๋กœ์„ธ์„œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ํ”„๋กœํŒŒ์ผ ๊ฐ€์ด๋“œ ์ตœ์ ํ™”(PGO)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ(์˜ˆ: Java)์€ ๋Ÿฐํƒ€์ž„ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์—์„œ ๋Œ€๋ถ€๋ถ„์˜ AOT ํ”Œ๋žซํผ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž ์žฌ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋™์  ์ธ๋ผ์ด๋‹๊ณผ ๊ฐ€์ƒ ํ˜ธ์ถœ ์ตœ์ ํ™”์™€ ๊ฐ™์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HotSpot์€ VM ์‹œ์ž‘ ์‹œ ์ •ํ™•ํ•œ CPU ์œ ํ˜•์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ํ”„๋กœ์„ธ์„œ ๊ธฐ๋Šฅ์— ์„ค๊ณ„๋œ ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋กœ์„ธ์„œ ๊ฐ์ง€
์ •ํ™•ํ•œ ํ”„๋กœ์„ธ์„œ ๊ธฐ๋Šฅ์„ ๊ฐ์ง€ํ•˜๋Š” ๊ธฐ์ˆ ์€ JVM ์ธํŠธ๋ฆฐ์‹(JVM intrinsics)์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ, `synchronized` ํ‚ค์›Œ๋“œ๋กœ ๋„์ž…๋œ ์ธํŠธ๋ฆฐ์‹ ๋ฝ๊ณผ ํ˜ผ๋™ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. 
PGO์™€ JIT ์ปดํŒŒ์ผ์— ๋Œ€ํ•œ ์ „์ฒด ๋…ผ์˜๋Š” 9์žฅ๊ณผ 10์žฅ์—์„œ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

JVM ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

C, C++, Objective-C์™€ ๊ฐ™์€ ์–ธ์–ด์—์„œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋ฅผ ๊ด€๋ฆฌํ•  ์ฑ…์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์„ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ์ด์ ์€ ๋” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์„ฑ๋Šฅ๊ณผ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์‚ญ์ œ์— ์ž์› ์ˆ˜๋ช…์„ ๋ฌถ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์ด์ ์€ ํฐ ๋น„์šฉ์„ ์ˆ˜๋ฐ˜ํ•ฉ๋‹ˆ๋‹คโ€”์ •ํ™•ํ•˜๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ํฐ ๋ถ€๋‹ด์„ ์ค๋‹ˆ๋‹ค.

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

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

๊ทธ๋Ÿฌ๋‚˜ GC์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋Š” ๊ทธ๋ฆฌ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์œผ๋ฉฐ, Java์˜ ์—ญ์‚ฌ ๋™์•ˆ ๋‹ค์–‘ํ•œ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฐœ๋ฐœ๋˜๊ณ  ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. GC๋Š” ๋น„์šฉ์„ ์ˆ˜๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค: ์‹คํ–‰๋  ๋•Œ ์ข…์ข… "Stop The World"๋ผ๋Š” ๋œป์œผ๋กœ, GC๊ฐ€ ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ผ์‹œ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์ด๋Ÿฌํ•œ ์ผ์‹œ ์ค‘์ง€๋Š” ๋งค์šฐ ์ž‘๊ฒŒ ์„ค๊ณ„๋˜์—ˆ์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์••๋ ฅ์ด ๊ฐ€ํ•ด์งˆ์ˆ˜๋ก ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šค๋ ˆ๋”ฉ๊ณผ Java ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ

Java๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์—์„œ ๋„์ž…ํ•œ ์ฃผ์š” ๋ฐœ์ „ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ๋‚ด์žฅ ์ง€์›์ด์—ˆ์Šต๋‹ˆ๋‹ค. Java ํ”Œ๋žซํผ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ๋กœ์šด ์‹คํ–‰ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

Thread t = new Thread(() -> { System.out.println("Hello World!"); });
t.start();

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, Java ํ™˜๊ฒฝ ์ž์ฒด๋„ ๋ณธ์งˆ์ ์œผ๋กœ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์ด๋ฉฐ, JVM๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

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

์Šค๋ ˆ๋“œ์™€ ์Šค๋ ˆ๋“œ ํ’€
๋ชจ๋“  JVM ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ๋Š” ํ•ด๋‹น ์Šค๋ ˆ๋“œ ๊ฐ์ฒด์˜ `start()` ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ƒ์„ฑ๋˜๋Š” ๊ณ ์œ ํ•œ OS ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ๋ฐฑ์—…๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

Java์˜ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ์ ‘๊ทผ ๋ฐฉ์‹ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ์„ค๊ณ„ ์›์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:
1. Java ํ”„๋กœ์„ธ์Šค์˜ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š” ๋‹จ์ผ, ๊ณตํ†ต ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ํž™์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
2. ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋Š” ํ•ด๋‹น ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง„ ๋‹ค๋ฅธ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
3. ๊ฐ์ฒด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ฆ‰, ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ `final` ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ๋ถˆ๋ณ€์œผ๋กœ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ฐ์ฒด ํ•„๋“œ์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

Java๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ๋ฐฉ์–ด ์ˆ˜๋‹จ์€ ์ƒํ˜ธ ๋ฐฐ์ œ ๋ฝ(mutual exclusion lock)๋ฟ์ด๋ฉฐ, ์ด๋Š” ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋งค์šฐ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

JVM ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ํˆด๋ง

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

  • Java Management Extensions (JMX)

  • Java ์—์ด์ „ํŠธ

  • JVM Tool Interface (JVMTI)

  • Serviceability Agent (SA)

Last updated