[Become a Java-Masta๐Ÿ‘จโ€๐Ÿซ 1์ฃผ์ฐจ] JVM๊ณผ ์ž๋ฐ” ์ฝ”๋“œ

13562 ๋‹จ์–ด TILJavaJava

๐ŸŽฏ ๋ชฉํ‘œ

์ž๋ฐ” ์†Œ์Šค ํŒŒ์ผ(.java)์„ JVM์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ • ์ดํ•ดํ•˜๊ธฐ.

๐Ÿ“Œ ํ•™์Šตํ•  ๊ฒƒ


๐Ÿ’ก JVM์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€

์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋žจ์€ Windows ๋˜๋Š” Linux์™€ ๊ฐ™์€ ์šด์˜์ฒด์ œ ์œ„์—์„œ ์‹คํ–‰์ด ๋œ๋‹ค. ์ฆ‰, ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์‹คํ–‰์ด ๋œ๋‹ค.

์œ„ ๊ทธ๋ฆผ์— ๋ณด์ด๋“ฏ์ด ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋žจ์€ ํ•˜๋“œ์›จ์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์šด์˜์ฒด์ œ๊ฐ€ ๋™์ž‘์„ ํ•˜๊ณ , ๊ทธ ์œ„์—์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋žจ๊ณผ๋Š” ๋‹ค๋ฅธ ๊ตฌ์กฐ๋กœ ์‹คํ–‰์ด ๋œ๋‹ค.

๊ทธ๋ฆผ์„ ๋ณด์•˜๋“ฏ์ด ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋น„๊ตํ•ด์„œ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ์šด์˜์ฒด์ œ์™€ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์ด์— ์ž๋ฐ” ๊ฐ€์ƒ๋จธ์‹ (JVM)์ด ์กด์žฌํ•˜๋Š” ์ ์ด๋‹ค.
์ฆ‰ ์šด์˜์ฒด์ œ๊ฐ€ ๋ฐ”๋กœ ํ”„๋กœ๊ทธ๋žจ์ผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์šด์˜์ฒด์ œ๋Š” JVM์„ ์‹คํ–‰ํ•˜๊ณ  JVM์ด ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ตฌ์กฐ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด JVM์€ ๋ฌด์—‡์ด๋ฉฐ, ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์€ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๊ฐ™์ด ์šด์˜์ฒด์ œ๊ฐ€ ์ง์ ‘ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๊ณ  ์™œ JVM ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ธ๊ฐ€?

์ผ๋‹จ JVM๋„ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์šด์˜์ฒด์ œ ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ด๋‹ค. ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ธ ๊ฒƒ์ด๋‹ค.
์ด๋ ‡๊ฒŒ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด JVM ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ตฌ์กฐ์˜ ์ด์œ ๋Š” ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์šด์˜์ฒด์ œ์™€ ์ƒ๊ด€์—†์ด ๋™์ž‘์‹œํ‚ค๊ธฐ ์œ„ํ•จ ์ด๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์€ ์šด์˜์ฒด์ œ์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ฆฌ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์šฐ๋ฆฌ๊ฐ€ ๋…ธ์…˜์ด๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์šด๋ฐ›์„ ๋•Œ, ์šด์˜์ฒด์ œ๊ฐ€ Windows์ธ์ง€ Mac์ธ์ง€ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์šด๋ฐ›๋Š”๋‹ค.
Windows์—์„œ ๋™์ž‘ํ•˜๋„๋ก ๊ตฌํ˜„๋œ ๋…ธ์…˜์„ ๋‹ค์šด๋ฐ›์œผ๋ฉด ์ ˆ๋Œ€ Mac์—์„œ ์„ค์น˜ํ•  ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ ๋™์ผํ•œ ๊ธฐ๋Šฅ์˜ ๋…ธ์…˜์ด๋ผ ํ• ์ง€๋ผ๋„ Mac์—์„œ ๋™์ž‘์„ ์‹œํ‚ค๋ ค๋ฉด Mac์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์™œ ์šด์˜์ฒด์ œ์— ๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ฌ๋ฆฌ ๊ตฌํ˜„ํ•ด์•ผ ํ• ๊นŒ?

๊ฐœ๋ฐœ ์–ธ์–ด๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ, ์–ธ์–ด๊ฐ€ ๋™์ผํ• ์ง€๋ผ๋„ ์šด์˜์ฒด์ œ์— ๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์™„์„ฑํ•˜๋Š” ๋ฐฉ์‹ ์ž์ฒด๊ฐ€ ๋‹ค๋ฅธ ์ผ๋ถ€ ๊ธฐ๋Šฅ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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

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

์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์šด์˜์ฒด์ œ ๋ณ„๋กœ ์กด์žฌํ•˜๋Š” ์ฐจ์ด์ ์„ JVM์—์„œ ๋‹ค ์ฒ˜๋ฆฌํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์€ ์šด์˜์ฒด์ œ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰์ด ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์•„๊นŒ ๋งํ–ˆ๋“ฏ์ด JVM์€ ์šด์˜์ฒด์ œ ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๊ธฐ ๋•Œ๋ฌธ์— ์šด์˜์ฒด์ œ์— ์˜์กด์ ์ด์—ฌ์„œ Windows์—๋Š” Windows์˜ JVM์ด ํ•„์š”ํ•˜๊ณ , Mac์—๋Š” Mac์—์„œ์˜ JVM์ด ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค.


๐Ÿ’ก ์ปดํŒŒ์ผ ํ•˜๋Š” ๊ณผ์ •

์œ„์—์„œ ์‚ดํŽด ๋ณด์•˜๋“ฏ์ด ์ž๋ฐ”๋Š” OS์— ๋…๋ฆฝ์ ์ด๋ผ๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ๊ณผ OS์‚ฌ์ด์— ์กด์žฌํ•˜๊ณ  ์žˆ๋Š” JVM ๋•๋ถ„์ด๋ผ๋Š” ๊ฒƒ๋„ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด JVM์˜ ์–ด๋– ํ•œ ๊ธฐ๋Šฅ ๋•Œ๋ฌธ์—, OS์— ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ์ž๋ฐ” ์ปดํŒŒ์ผ ๊ณผ์ •์„ ํ†ตํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

  1. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž๋ฐ” ์†Œ์ŠคํŒŒ์ผ(.java)๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

  2. ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ(Java Compiler)๊ฐ€ ์ž๋ฐ” ์†Œ์ŠคํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•œ๋‹ค.
    ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ์„ ์™„๋ฃŒํ•˜๋ฉด ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ(.class)ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค. ์ด ํŒŒ์ผ์€ JVM๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์•„์ง OS๊นŒ์ง€๋Š” ์ฝ์„ ์ˆ˜ ์—†๋Š” ์ด๋‹ค.

  3. ๋ฐ”์ดํŠธ ์ฝ”๋“œ๊ฐ€ JVM์˜ ํด๋ž˜์Šค ๋กœ๋”(Class Loader)์—๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค. ํด๋ž˜์Šค ๋กœ๋”์— ์ „๋‹ฌ๋˜๋Š” ์ˆœ๊ฐ„๋ถ€ํ„ฐ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์— ์ ‘์–ด๋“ ๋‹ค.

  4. ํด๋ž˜์Šค ๋กœ๋”์—์„œ๋Š” ๋™์  ๋กœ๋”ฉ์„ ํ†ตํ•ด ํ•„์š”ํ•œ ํด๋ž˜์Šค๋“ค์„ ๋กœ๋”ฉํ•˜์—ฌ JVM ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฐ๋‹ค. JVM ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ(Runtime Data Area)์ด๋ผ๊ณ  ํ•œ๋‹ค.

  5. ์‹คํ–‰์—”์ง„(Execution Engine)์—์„œ JVM ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ์˜จ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋“ค์„ ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์™€์„œ ์‹คํ–‰ํ•œ๋‹ค.
    ์ด๋•Œ, ์‹คํ–‰ ์—”์ง„์€ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋‹ค.

  • ์ž๋ฐ” ์ธํ„ฐํ”„๋ฆฌํ„ฐ : ๋ฐ”์ดํŠธ ์ฝ”๋“œ ๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜์”ฉ ์ฝ์–ด์„œ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค. ํ•˜๋‚˜ํ•˜๋‚˜์˜ ์‹คํ–‰์€ ๋น ๋ฅด๋‚˜, ์ „์ฒด์ ์ธ ์‹คํ–‰ ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

  • JIT ์ปดํŒŒ์ผ๋Ÿฌ(Just-In-Time Compiler) : ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ดํ›„์—๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ๋” ์ด์ƒ ์ธํ„ฐํ”„๋ฆฌํŒ… ํ•˜์ง€ ์•Š๊ณ , ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์ด๋‹ค.
    ์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ ๋ฐฉ์‹์œผ๋กœ, ํ•˜๋‚˜์”ฉ ์ธํ„ฐํ”„๋ฆฌํŒ…ํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ „์ฒด๊ฐ€ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด์ ์ธ ์‹คํ–‰์†๋„๋Š” ์ธํ„ฐํ”„๋ฆฌํŒ… ๋ฐฉ์‹๋ณด๋‹ค ๋น ๋ฅด๋‹ค.

ํด๋ž˜์Šค ๋กœ๋”๋‚ด์—์„œ์˜ ์„ธ๋ถ€ ๋™์ž‘

a. ๋กœ๋“œ : ์ปดํŒŒ์ผ๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ์™€ ํ•„์š”ํ•œ ์ž๋ฐ” ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€์„œ JVM์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•œ๋‹ค.

b. ๊ฒ€์ฆ : ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋œ ํŒŒ์ผ์ด ์ž๋ฐ” ์–ธ์–ด ๋ช…์„ธ(Java Language Specification) ๋ฐ JVM ๋ช…์„ธ์— ๋ช…์‹œ๋œ ๋Œ€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.

c. ์ค€๋น„ : ํด๋ž˜์Šค๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ๋‹ค. (ํ•„๋“œ, ๋ฉ”์„œ๋“œ, ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑ๋“ฑ)

d. ๋ถ„์„ : ํด๋ž˜์Šค์˜ ์ƒ์ˆ˜ ํ’€ ๋‚ด ๋ชจ๋“  ์‹ฌ๋ณผ๋ฆญ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋‹ค์ด๋ ‰ํŠธ ๋ ˆํผ๋Ÿฐ์Šค๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

๊ธฐ๋ณธ ์ž๋ฃŒํ˜•(primitive data type)์„ ์ œ์™ธํ•œ ๋ชจ๋“  ํƒ€์ž…(ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค)์„ ๋ช…์‹œ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ธฐ๋ฐ˜์˜ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์•„๋‹ˆ๋ผ, ์‹คํ–‰ ์‹œ Link๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ฌ๋ณผ๋ฆญ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ํ†ตํ•ด ์ฐธ์กฐํ•œ๋‹ค.

์‹ฌ๋ณผ๋ฆญ ๋ ˆํผ๋Ÿฐ์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฒˆ์ง€์˜ ์ฐธ์กฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ด๋ฆ„์— ์˜ํ•œ ์ฐธ์กฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ด ์‹ฌ๋ณผ๋ฆญ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์•ž์˜ ๋กœ๋“œ - ๊ฒ€์ฆ - ์ค€๋น„ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ณ  ์‹ค์ œ ๋ฌผ๋ฆฌ์ ์ธ ์ฃผ์†Œ์ธ ๋‹ค์ด๋ ‰ํŠธ ๋ ˆํผ๋Ÿฐ์Šค๋กœ ๋Œ€์ฒด๋˜๋Š” ์ž‘์—…์ธ ๋‹ค์ด๋‚˜๋ฏน Linking์ด ์ด ๋‹จ๊ณ„์—์„œ ์ผ์–ด๋‚œ๋‹ค.

b.~ d.๊นŒ์ง€๋ฅผ ๋ฌถ์–ด์„œ ์—ฐ๊ฒฐ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

e. ์ดˆ๊ธฐํ™” : ํด๋ž˜์Šค ๋ณ€์ˆ˜๋“ค์„ ์ ์ ˆํ•œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.(static ํ•„๋“œ)


๐Ÿ’ก ์ปดํŒŒ์ผ ๋ฐ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•

Test.java

class Hello{

    public static void main(String[] args){
        System.out.println("Hello Java!");
    }

}

์œ„์™€ ๊ฐ™์€ ์ž๋ฐ” ์†Œ์ŠคํŒŒ์ผ์ด ์žˆ์„ ๋•Œ, ์ž๋ฐ” ์†Œ์ŠคํŒŒ์ผ์„ ์ปดํŒŒ์ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

$ javac Test.java

javac(java compile or java compiler) ๋ช…๋ น์–ด๋กœ ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋ฐ” ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•œ๋‹ค.

์„ฑ๊ณต์ ์œผ๋กœ ์ปดํŒŒ์ผ์„ ๋งˆ์นœ๋‹ค๋ฉด, ํ•ด๋‹น ๊ฒฝ๋กœ์— Hello.class ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋กœ ์ƒ์„ฑ๋œ Hello.class ํŒŒ์ผ์ด ๋ฐ”๋กœ ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ์ด๋‹ค.

์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ์•ผ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ถœ๋ ฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

$ java Hello

> Hello Java!

์œ„ java ๋ช…๋ น์–ด๋กœ ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œํŒŒ์ผ์„ ์ž๋ฐ” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ•  ์ ์€ Test.java ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•œ ๊ฒฐ๊ณผ๋Š” Test.class๊ฐ€ ์•„๋‹ˆ๋‹ค.

Test๋Š” ํฌ์žฅ์ง€ ์ด๋ฆ„์ด๊ณ  ํฌ์žฅ ์† ์•Œ๋ฉฉ์ด๋Š” Hello ํด๋ž˜์Šค์ด๋‹ค.

์ปดํŒŒ์ผ ๊ฒฐ๊ณผ ์ƒ์„ฑ๋œ ํŒŒ์ผ์€ Class ์ด๋ฆ„์˜ Hello.class ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.


๐Ÿ’ก ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€

์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ(Java bytecode)๋ž€ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋ฐ” ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ค‘๊ฐ„ ์–ธ์–ด์ธ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒƒ์ด๋‹ค.

๋ฐ”์ดํŠธ ์ฝ”๋“œ๊ฐ€ ๊ธฐ๊ณ„์–ด๋Š” ์•„๋‹ˆ์ง€๋งŒ JVM์— ์˜ํ•ด ์†์‰ฝ๊ฒŒ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์ด๋‹ค.

๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ด์œ ๋Š”, ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋ณ€ํ™˜๋˜๋Š” ์ฝ”๋“œ์˜ ๋ช…๋ น์–ด ํฌ๊ธฐ๊ฐ€ 1๋ฐ”์ดํŠธ๋ผ์„œ ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ผ๊ณ  ๋ถˆ๋ฆฌ๊ณ  ์žˆ๋‹ค.

์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ์˜ ํ™•์žฅ์ž๋Š” .class์ด๊ณ , ์ž๋ฐ”๊ฐ€ OS์— ๋…๋ฆฝ์ ์ด๋ฏ€๋กœ ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋Š” JVM๋งŒ ์„ค์น˜๋˜์–ด ์žˆ์œผ๋ฉด ์–ด๋–ค OS์—์„œ๋ผ๋„ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

outer:
for (int i = 2; i < 1000; i++) {
    for (int j = 2; j < i; j++) {
        if (i % j == 0)
            continue outer;
    }
    System.out.println (i);
}

์œ„ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ์„ ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ์ด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

0:   iconst_2
1:   istore_1
2:   iload_1
3:   sipush  1000
6:   if_icmpge       44
9:   iconst_2
10:  istore_2
11:  iload_2
12:  iload_1
13:  if_icmpge       31
16:  iload_1
17:  iload_2
18:  irem
19:  ifne    25
22:  goto    38
25:  iinc    2, 1
28:  goto    11
31:  getstatic       #84; // Field java/lang/System.out:Ljava/io/PrintStream;
34:  iload_1
35:  invokevirtual   #85; // Method java/io/PrintStream.println:(I)V
38:  iinc    1, 1
41:  goto    2
44:  return

์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋ง ํ•  ์ˆ˜ ์—†๋‹ค๊ณ ๋Š” ํ•˜์ง€๋งŒ, ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ C์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๊ณ 

C๋‚˜ C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ๋•Œ๋กœ๋Š” ํ•ด๋‹น ๋ ˆ๋ฒจ๋ณด๋‹ค ์ข€ ๋” ๋กœ์šฐ ๋ ˆ๋ฒจ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.

์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋จธ ๋˜ํ•œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑ๋  ๊ฒƒ์ธ์ง€๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹จ ์ƒ๊ฐ์ด ๋“ ๋‹ค.


๐Ÿ’ก JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€

์œ„์—์„œ๋„ ์‚ด์ง ๋ณด์•˜๋“ฏ์ด JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ž€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ดํ›„์—๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ๋” ์ด์ƒ ์ธํ„ฐํ”„๋ฆฌํŒ… ํ•˜์ง€ ์•Š๊ณ , ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ ์ง์ ‘ ์‹คํ–‰ํ•˜์—ฌ ๋น ๋ฅธ ์†๋„๋กœ ๊ธฐ๊ณ„์–ด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํŒŒ์ผ ๊ธฐ๋ฒ•์ด๋‹ค.

JIT์€ โ€˜์‹ค์‹œ๊ฐ„โ€™ ๋น„์Šค๋ฌด์Šคํ•œ ๋œป์„ ๋‚ดํฌํ•œ Just โ€” In โ€” Time์˜ ์•ฝ์–ด์ธ๋ฐ, ์™œ ์ด๋Ÿฌํ•œ ์ด๋ฆ„์ด ๋ถ™ํ˜€์กŒ๋ƒ๋ฉด ์†๋„๊ฐ€ ๋Š๋ฆฐ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ ๋ฐฉ์‹์œผ๋กœ JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‹ค์ œ ์‹คํ–‰ํ•˜๋Š” ์‹œ์ ์—(์‹ค์‹œ๊ฐ„์—) ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜์—ฌ ์ „์ฒด์ ์ธ ์‹คํ–‰์†๋„๋Š” ์ธํ„ฐํ”„๋ฆฌํŒ… ๋ฐฉ์‹๋ณด๋‹ค ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋˜ํ•œ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜๋œ ์ฝ”๋“œ๋Š” ์บ์‹œ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์‚ฌ์šฉ์‹œ ์ปดํŒŒ์ผ์„ ๋‹ค์‹œ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

JIT ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ ์ธ ์ธํ„ฐํ”„๋Ÿฌํ„ฐ ์–ธ์–ด์— ๋น„ํ•ด ํ›จ์”ฌ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚ธ๋‹ค. ์‹ฌ์ง€์–ด ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ •์  ์ปดํŒŒ์ผ๋Ÿฌ ์–ธ์–ด๋ณด๋‹ค ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚ด๊ณค ํ•˜๋Š”๋ฐ, ์ด๋Š” ์‹คํ–‰ ๊ณผ์ •์— ์ปดํŒŒ์ผ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์ง€๋Š” ์žฅ์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ’ก JVM ๊ตฌ์„ฑ ์š”์†Œ

JVM ์€ ํฌ๊ฒŒ 4๊ฐ€์ง€(Class Loader, Execution Engine, Garbage Collector, Runtime Data Area)๋กœ ๋‚˜๋ˆ„์–ด ์ง„๋‹ค.

1. Class Loader

์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ ํด๋ž˜์Šค๋ฅผ ์ฝ์–ด๋“ค์—ฌ Runtime Data Area ์— ์ ์žฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

2. Execution Engine

Class Loader ์— ์˜ํ•ด Runtime Data Area ์— ์ ์žฌ๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์™€ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์•ž์„œ ๋ณด์•˜๋“ฏ์ด, ์‹คํ–‰ ์—”์ง„์—๋Š” Interpreter ๋ฐฉ์‹๊ณผ, JIT ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

JIT์œผ๋กœ ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„์„ ๋ฏธ๋ฆฌ ์ฒดํฌํ•ด๋‘๊ณ  ๋ผ์ธ๋ณ„๋กœ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฒดํฌํ•œ ๋ถ€๋ถ„์— ๋„๋‹ฌํ•˜๋ฉด ๋ฏธ๋ฆฌ ์บ์‹œ ์ €์žฅ๋œ ๊ฐ’์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋‹ค.

3. Runtime Data Area

JVM ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์ ์žฌํ•˜๋Š” ์˜์—ญ์ด๋‹ค.

์ด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ ๋‹ค์‹œ 5๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

a. Class Area or Method Area

ํด๋ž˜์Šค ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.

ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„๊ณผ ํƒ€์ž…, ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฆฌ๊ณ  ๋ฆฌํ„ด๊ฐ’๊ณผ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๊ณ , ๊ฐ์ข… ์ƒ์ˆ˜, static ๋ฉ”์†Œ๋“œ, final ํด๋ž˜์Šค ๋ณ€์ˆ˜ ๋“ฑ์ด ์ €์žฅ๋œ๋‹ค.

b. Heap Area

Heap Area์—๋Š” new ํ‚ค์›Œ๋“œ์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ํด๋ž˜์Šค์™€ ๋ฐฐ์—ด ๋“ฑ์ด ์ €์žฅ๋œ๋‹ค.

Method Area ์˜์—ญ์— ์ €์žฅ๋œ ํด๋ž˜์Šค๋งŒ์ด ์ƒ์„ฑ ๊ฐ€๋Šฅํ•˜๊ณ , Garbage Collector ์— ์˜ํ•ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค/๋ฐฐ์—ด์ด ์ œ๊ฑฐ๋œ๋‹ค.

Garbage Collector๋Š” ์•„๋ž˜์—์„œ ์ข€ ๋” ์ž์„ธํžˆ ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ๋‹ค.

c. Stack Area

Stack Area๋Š” ์ง€์—ญ ๋ณ€์ˆ˜, ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฆฌํ„ด ๊ฐ’, ์—ฐ์‚ฐ์— ์‚ฌ์šฉ๋˜๋Š” ์ž„์‹œ ๊ฐ’๋“ฑ์ด ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, Person p = new Person(); ์™€ ๊ฐ™์ด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ, new ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ํด๋ž˜์Šค๋Š” Heap Area ์— ์ €์žฅ๋˜๊ณ , Stack Area ์—๋Š” ์ƒ์„ฑ๋œ ํด๋ž˜์Šค์˜ ์ฐธ์กฐ์ธ p ๋งŒ ์ €์žฅ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์Šคํƒ์ด ์ƒ์„ฑ๋˜๋ฉฐ, Method Area, Heap Area ๋ฅผ ์ œ์™ธํ•œ ์˜์—ญ๋“ค์€ ์Šค๋ ˆ๋“œ๊ฐ„์— ๊ณต์œ ๋˜์ง€ ์•Š๋Š”๋‹ค.

d. PC Register

PC Register๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋ฉฐ, ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์ฃผ์†Œ์™€ ๋ช…๋ น์„ ์ €์žฅํ•œ๋‹ค.

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์ž‘ํ•  ๋•Œ, ์ด๊ณณ์˜ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

e. Native Method Stack

Native Method Stack์—๋Š” ์ž๋ฐ” ์ด์™ธ์˜ ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.

4. Garbage Collector (GC)

์œ„์—์„œ Heap Area์—์„œ Garbage Collector ๊ฐ€ ๋“ฑ์žฅํ–ˆ์—ˆ๋Š”๋ฐ, GC๋Š” Heap ์˜์—ญ์— ์ƒ์„ฑ๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด๋“ค ์ค‘ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ฐพ์•„ ์ œ๊ฑฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

GC๋ฅผ ์ดํ•ดํ•˜๋ฉด ์™œ ์ž๋ฐ” ๊ฐ์ฒด๊ฐ€ ์ฃผ์†Œ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์ฐธ์กฐ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

GC ๊ณผ์ •์„ ์ข€ ๋Ÿฌํ”„ํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด,

1 Eden์ด ๊ฝ‰์ฐจ๋ฉด ์ฐธ์กฐ๋˜๋Š” ์• ๋“ค์„ Survivor1์— ์˜ฎ๊ธด๋‹ค.

2. Eden์„ ์‹น ๋ฏผ๋‹ค.

3. ๋‚˜์ค‘์— Survivor1๊ฐ€ ๊ฝ‰์ฐจ๋ฉด ์ฐธ์กฐ๋˜๋Š” ์• ๋“ค์„ Survivor2์— ์˜ฎ๊ธด๋‹ค.

4. Survivor1์„ ์‹น ๋ฏผ๋‹ค. (1 ๋˜๋Š” 2 ์ค‘ ํ•œ๊ตฐ๋ฐ๋Š” ๋น„์–ด์žˆ์–ด์•ผ ํ•จ.)

5. ์œ„ ๊ณผ์ •์ด ๋ฐ˜๋ณต๋จ์—๋„ ๊ณ„์† ์‚ด์•„๋‚จ์€ ์• ๋“ค์€ Old ์ฆ‰, Major GC๋กœ ์˜ฎ๊ธด๋‹ค.
refaddress
ox1000oxaaaa

์œ„ ๊ณผ์ •์ฒ˜๋Ÿผ GC์— ์˜ํ•ด ์ฐธ์กฐ๋˜๋Š” ์• ๋“ค์ด ์ด๋™ํ•˜๊ฒŒ๋˜๋ฉด JVM Obj(Address Mapping) Table ์—์„œ ์‹ค์ œ address๋Š” oxaaaa์—์„œ oxbbbb๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

refaddress
ox1000oxbbbb

ํ•˜์ง€๋งŒ ref๋Š” ๊ทธ๋Œ€๋กœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ” ๊ฐ์ฒด๊ฐ€ address๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ref๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ์—ฐ์œ ๋กœ GC๋ฅผ ์ดํ•ดํ•˜๋ฉด ์™œ ์ž๋ฐ” ๊ฐ์ฒด๊ฐ€ ์ฃผ์†Œ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์ฐธ์กฐ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


๐Ÿ’ก JDK์™€ JRE์˜ ์ฐจ์ด

์œ„ ์ด๋ฏธ์ง€๋กœ JRE(Java Runtime Environment)์™€ JDK(Java Development Kit)๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

JRE(Java Runtime Environment) ๋Š” ์ž๋ฐ” ์‹คํ–‰ ํ™˜๊ฒฝ์˜ ์ค„์ž„๋ง๋กœ JVM + ์ž๋ฐ” API ๋“ฑ ์ž๋ฐ”๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ ์ด๋‹ค.

์‹ค์ œ ์ž๋ฐ”๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด JVM๋งŒ์„ ์„ค์น˜ํ• ์ˆ˜๋Š” ์—†๊ณ  JRE๋ฅผ ์„ค์น˜ํ•˜๊ฒŒ ๋œ๋‹ค.

๋งˆ์ธํฌ๋ž˜ํ”„ํŠธ ๊ฐ™์€ ์ž๋ฐ”๋กœ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰์„ ์œ„ํ•ด ์„ค์น˜๋ฅผ ์š”๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ JRE๋ฅผ ๊น”๊ฒŒ๋œ๋‹ค.

๋ณดํ†ต ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์šฉ JAVA๋ผ๊ณ  ํ•˜๋ฉด ์ด JRE๋ฅผ ๋งํ•œ๋‹ค.

JDK(Java Development Kit) ๋Š” ์ž๋ฐ” ๊ฐœ๋ฐœ ํ‚คํŠธ์˜ ์ค„์ž„๋ง๋กœ JRE + ์ปดํŒŒ์ผ๋Ÿฌ, ๋””๋ฒ„๊ฑฐ ๋“ฑ ๊ฐœ๋ฐœ๋„๊ตฌ๋ฅผ์„ ํฌํ•จํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ด๋‹ค.

JDK๋Š” ํ์‡„์  ์ƒ์—…์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ์˜ค๋ผํดJDK์™€ ์˜คํ”ˆ์†Œ์Šค์ธ OpenJDK๊ฐ€ ์žˆ๋‹ค.

OpenJDK๋Š” ์˜ค๋ผํด, Azul ๋“ฑ์—์„œ ์ œ๊ณตํ•˜๊ณ  ์žˆ์œผ๋ฉฐ,

์ด OpenJDK๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ˜๋“ค์–ด์ง„ ์ž์ฒด๊ฐœ๋ฐœJDK๋ฅผ ํฌํ•จํ•œ ์ œํ’ˆ๋“ค๋„ ๋งŽ์ด ์žˆ๋‹ค.

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ