๐Ÿ–ฅ๏ธ Java JDK/JRE/JVM/SE/EE/ME๋ž€? ๐Ÿ–ฅ๏ธ

๊ฑฐ๋ถ์ด ๊ฐœ๋ฐœ์žยท2025๋…„ 1์›” 11์ผ

Java

๋ชฉ๋ก ๋ณด๊ธฐ
2/2
post-thumbnail

๐Ÿ–ฅ๏ธ JDK (Java Development Kit)

JDK๋Š” Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” SDK(Software Development Kit)์ด๋‹ค.

๐Ÿ’ก SDK?
Software Development Kit (์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํ‚คํŠธ) ๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ํšจ์œจ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ปดํŒŒ์ผ๋Ÿฌ, ๋””๋ฒ„๊ฑฐ, ์ฝ”๋“œ ์ƒ˜ํ”Œ ๋ฐ ๋ฌธ์„œ๋กœ ๊ตฌ์„ฑ๋œ ํ†ตํ•ฉ ํ”Œ๋žซํผ์„ ์ œ๊ณตํ•œ๋‹ค.
SDK์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ, ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค ๋“ฑ์ด ์žˆ๋‹ค.

JDK์•ˆ์—๋Š” ์ž๋ฐ” ๊ฐœ๋ฐœ ์‹œ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค๊ณผ javac, javadoc ๋“ฑ์˜ ๊ฐœ๋ฐœ ๋„๊ตฌ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ๊ณ , ๊ฐœ๋ฐœ์„ ํ•˜๋ ค๋ฉด ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰๋„ ์‹œ์ผœ์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋’ค์—์„œ ๋ฐฐ์šธ JRE(Java Runtime Environment)๋„ ํ•จ๊ป˜ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

์ž๋ฐ”๋กœ ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰๋งŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” JRE๋งŒ ์žˆ์œผ๋ฉด ๋˜์ง€๋งŒ, ์ž๋ฐ”๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„  ์†Œ์Šค์ฝ”๋“œ(*.java)๋ฅผ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ(*.class)๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” JDK์— ์กด์žฌํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ(javac)๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ JDK ๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค

์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ ๋ณผ์ˆ˜ ์žˆ๋“ฏ์ด JDK๋Š” JVM, JRE๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๊ณ , ์ด์™ธ์— ์ž๋ฐ”๋ฅผ ๊ฐœ๋ฐœ ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ development tools ๋„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ–ฅ๏ธ JRE (Java Runtime Environment)

JRE์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ๊ธฐ ์ „์— Java์˜ ์žฅ์ ์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ์•Œ์•„๋ณด์ž

Java์˜ ๊ฐ•์ ์ด ๋ฌด์—‡์ผ๊นŒ

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

์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜๋Š” ์ด์œ ๊ฐ€ ๋ฐ”๋กœ JRE์ด๋‹ค.

JRE์— ๋Œ€ํ•œ aws์˜ ๊ณต์‹๋ฌธ์„œ ์„ค๋ช…์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค

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

์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ์ถ”๊ฐ€ ์ˆ˜์ • ์—†์ด ์–ด๋–ค ์šด์˜ ์ฒด์ œ์—์„œ๋„ ์‹คํ–‰๋˜๋„๋ก ํ•˜๋Š” ์—ญํ• ์€ JRE์— ํฌํ•จ๋œ JVM์˜ ์—ญํ• ์ด๋‹ค. JVM์— ๋Œ€ํ•ด์„œ๋Š” ๋’ค์—์„œ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜์ž๋ฉด, JRE๋Š” ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ง€์› ํŒŒ์ผ ๋ฐ JVM์ด ํฌํ•จ๋œ ํŒจํ‚ค์ง€์ด๊ณ , ์ปดํŒŒ์ผ ๋œ Java ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๋ ค๋ฉด JRE๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.


๐Ÿ–ฅ๏ธ JVM (Java Virtual Machine)

JVM์€ ์ž๋ฐ” ๊ฐ€์ƒ๋จธ์‹ (Java Virtual Machine)์˜ ์•ฝ์ž๋กœ์„œ, Java ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ด๋‹ค.
์ž๋ฐ”๋กœ ์ž‘์„ฑ๋œ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์€ JVM์—์„œ๋งŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ JVM์ด ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์•ž์„œ ๋งํ–ˆ๋“ฏ์ด JVM์€ JRE์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” ์ปดํ“จํ„ฐ์˜ ์šด์˜์ฒด์ œ์— ๋งž๋Š” JRE๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด JVM์ด ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋Š” ๋œป์ด๊ธฐ๋„ ํ•˜๋‹ค.

JAVA๋ผ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ธ๊ธฐ ์žˆ๋Š” ํ•ต์‹ฌ ์ด์œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ ์ด JVM ๊ฐœ๋…์ธ๋ฐ,
JVM์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์–ป๋Š” ๊ฐ€์žฅ ํฐ ์ด์ ์€ย JVM์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์ œ์•ฝ ์—†์ด ๋™์ž‘ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

๋‹ค๋งŒ, JVM์€ ๋ฐ”์ดํŠธ์ฝ”๋“œ(*.class)๋ฅผ ๊ฐ OS๋ณ„๋กœ ๋‹ค๋ฅธ ๊ธฐ๊ณ„์–ด(Binary Code)๋กœ ๋ณ€์—ญํ•ด์•ผ ํ•œ๋‹ค.
์ด๊ฒƒ์ด OS๋ณ„๋กœ ์„ค์น˜ํ•˜๋Š” JDK(Java Development Kit)๊ฐ€ ๋‹ค๋ฅธ ์ด์œ ์ด๋‹ค.

๋˜ํ•œ JVM์€ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด ์ค€๋‹ค.


๐Ÿฆพ JVM์˜ ๊ตฌ์กฐ

JVM๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค.

  • ํด๋ž˜์Šค๋กœ๋” (ClassLoader)

  • ์‹คํ–‰ ์—”์ง„ (Execution Engine)

  • ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ (Runtime Data Area)


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

ํด๋ž˜์Šค ๋กœ๋”๋Š” JVM ๋‚ด๋กœ ๋ฐ”์ดํŠธ ์ฝ”๋“œ(*.class)๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๊ณ , ๋งํฌ๋ฅผ ํ†ตํ•ด ๋ฐฐ์น˜ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“ˆ์ด๋‹ค.

์ฆ‰, ๋กœ๋“œ๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ(.class)๋“ค์„ ์—ฎ์–ด์„œ JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ธ Runtime Data Area์— ๋ฐฐ์น˜ํ•œ๋‹ค.

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

ํด๋ž˜์Šค ํŒŒ์ผ์˜ ๋กœ๋”ฉ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด 3๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. (Loading โ†’ Linkingย โ†’ Initialization)

  • Loading(๋กœ๋“œ) : ํด๋ž˜์Šค ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€์„œ JVM์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•œ๋‹ค.
  • Linking(๋งํฌ) : ํด๋ž˜์Šค ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฒ€์ฆํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.
    - Verifying(๊ฒ€์ฆ) : ์ฝ์–ด๋“ค์ธ ํด๋ž˜์Šค๊ฐ€ JVM ๋ช…์„ธ์— ๋ช…์‹œ๋œ ๋Œ€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.
    - preparing(์ค€๋น„) : ํด๋ž˜์Šค๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ๋‹ค.
    - Resolving(๋ถ„์„) : ํด๋ž˜์Šค์˜ย ์ƒ์ˆ˜ย ํ’€ย ๋‚ดย ๋ชจ๋“ ย ์‹ฌ๋ณผ๋ฆญย ๋ ˆํผ๋Ÿฐ์Šค๋ฅผย ๋‹ค์ด๋ ‰ํŠธย ๋ ˆํผ๋Ÿฐ์Šค๋กœย ๋ณ€๊ฒฝํ•œ๋‹ค.

    ๐Ÿ’ก์‹ฌ๋ณผ๋ฆญ ์ฐธ์กฐ(symbolic reference)์™€ ์ง์ ‘ ์ฐธ์กฐ(direct reference)
    ์‹ฌ๋ณผ๋ฆญ ์ฐธ์กฐ(symbolic reference)๋ž€ ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•œ class, field, method์˜ ์ด๋ฆ„์„ ์ง€์นญํ•œ๋‹ค. Resolving ๋‹จ๊ณ„๋Š” class, field, method ๊ทธ๋ฆฌ๊ณ  constant pool์˜ symbolic references๋ฅผ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

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

์‹คํ–‰ ์—”์ง„ (Execution Engine)

์‹คํ–‰ ์—”์ง„์€ ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ๋ฐฐ์น˜๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ์ฝ์–ด์„œ ์‹คํ–‰ํ•œ๋‹ค

์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ(*.class)๋Š” ๊ธฐ๊ณ„๊ฐ€ ๋ฐ”๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋ณด๋‹ค๋Š” ๊ฐ€์ƒ๋จธ์‹ ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘๊ฐ„ ๋ ˆ๋ฒจ๋กœ ์ปดํŒŒ์ผ ๋œ ์ฝ”๋“œ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์‹คํ–‰ ์—”์ง„์€ ์ด์™€ ๊ฐ™์€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‹ค์ œ๋กœ JVM ๋‚ด๋ถ€์—์„œ ๊ธฐ๊ณ„๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

์ด ์ˆ˜ํ–‰ ๊ณผ์ •์—์„œ ์‹คํ–‰ ์—”์ง„์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์™€ JIT ์ปดํŒŒ์ผ๋Ÿฌ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์„ ํ˜ผํ•ฉํ•˜์—ฌ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

โœ๏ธ ์ธํ„ฐํ”„๋ฆฌํ„ฐ(Interpreter)

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


โœ๏ธ JIT ์ปดํŒŒ์ผ๋Ÿฌ(Just-In-Time Compiler)

์œ„์˜ Interpreter์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ ๋ฐฉ์‹์œผ๋กœ, ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜์—ฌ ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ Native Code๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ดํ›„์—๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ๋” ์ด์ƒ ์ธํ„ฐํ”„๋ฆฌํŒ… ํ•˜์ง€ ์•Š๊ณ  ์บ์‹ฑํ•ด ๋‘์—ˆ๋‹ค๊ฐ€ย ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

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

ํ•˜์ง€๋งŒ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ Native Code๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ์—๋„ ๋น„์šฉ์ด ์†Œ์š”๋˜๋ฏ€๋กœ, JVM์€ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ JIT ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋‹ค ์ผ์ • ๊ธฐ์ค€์ด ๋„˜์–ด๊ฐ€๋ฉด JIT ์ปดํŒŒ์ผ ๋ฐฉ์‹์œผ๋กœ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‹์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.


โœ๏ธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ (Garbage Collector ,GC)


์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ ์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(garbage collector)๋ฅผ ์ด์šฉํ•˜์—ฌ Heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—์„œย ๋”๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํšŒ์ˆ˜ํ•ด ์ค€๋‹ค.

C์–ธ์–ด ๊ฐ™์€ ๊ฒฝ์šฐ ์ง์ ‘ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์ค˜์•ผ ๋˜์ง€๋งŒ, JAVA๋Š” ์ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋ฅผ ์ด์šฉํ•ด ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‹ค์‹œ๊ฐ„ ์ตœ์ ํ™” ์‹œ์ผœ์ค€๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋”ฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ, ๋”์šฑ ์†์‰ฝ๊ฒŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜์ง€๋งŒ, ๋‹จ GC(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ) ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ๊ฐ„์€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š๋‹ค.
ํŠนํžˆ Full GC ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ, GC ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ค‘์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.


๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ (Runtime Data Area)


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

๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์€ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํฌ๊ฒŒ Method Area, Heap Area, Stack Area, PC Register, Native Method Stack๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.


์ด๋•Œ Method Area, Heap Area ๋Š” ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ(Thread)๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์˜์—ญ์ด๊ณ , ๋‚˜๋จธ์ง€ Stack Area, PC Register, Native Method Stack ์€ ๊ฐ ์“ฐ๋ ˆ๋“œ ๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋Š” ๊ฐœ๋ณ„ ์˜์—ญ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์œ„์˜ ๊ทธ๋ฆผ์„ ์ข€๋” ์ž์„ธํžˆ ํ‘œํ˜„ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„์‹์ด ๋œ๋‹ค.


โœ๏ธ ๋ฉ”์„œ๋“œ ์˜์—ญ (Method Area)

๋ฉ”์„œ๋“œ ์˜์—ญ์€ JVM์ด ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋˜๋Š” ๊ณต๊ฐ„์œผ๋กœ ๋ฐ”์ดํŠธ ์ฝ”๋“œ(.class)๋ฅผ ์ฒ˜์Œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์˜ฌ๋ฆด ๋•Œ ์ดˆ๊ธฐํ™”๋˜๋Š” ๋Œ€์ƒ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด๋‹ค.
JVM์ดย ๋™์ž‘ํ•˜๊ณ ย ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์ ์žฌ๋˜์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ €์žฅ ๋œ๋‹ค.

๐Ÿ’ก Tip
๋ฉ”์„œ๋“œ ์˜์—ญ(Method Area) ์€ Class Area ๋‚˜ Static Area ๋กœ๋„ ๋ถˆ๋ฆฌ์šด๋‹ค.

๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์˜์—ญ์ด๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ดˆ๊ธฐํ™” ์ฝ”๋“œ ์ •๋ณด๋“ค์ด ์ €์žฅ๋˜๊ฒŒ ๋œ๋‹ค.

  • Field Info : ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„, ๋ฐ์ดํ„ฐ ํƒ€์ž…, ์ ‘๊ทผ ์ œ์–ด์ž์˜ ์ •๋ณด
  • Method Info : ๋ฉ”์†Œ๋“œ ์ด๋ฆ„, return ํƒ€์ž…, ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ ‘๊ทผ ์ œ์–ด์ž์˜ ์ •๋ณด
  • Type Info : Class ์ธ์ง€ Interface ์ธ์ง€ ์—ฌ๋ถ€ ์ €์žฅ, Type์˜ ์†์„ฑ, ์ด๋ฆ„ Super Class์˜ ์ด๋ฆ„

๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด ๋ฉ”์„œ๋“œ ์˜์—ญ์—๋Š” ์ •์  ํ•„๋“œ์™€ย ํด๋ž˜์Šค ๊ตฌ์กฐ๋งŒ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค๊ณ  ํ• ์ˆ˜์žˆ๋‹ค.

๐Ÿ’ก ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ํ’€ (Runtime Constant Pool)


  • ๋ฉ”์„œ๋“œ ์˜์—ญ์— ์กด์žฌํ•˜๋Š” ๋ณ„๋„์˜ ๊ด€๋ฆฌ์˜์—ญ.
  • ๊ฐ ํด๋ž˜์Šค/์ธํ„ฐํŽ˜์ด์Šค ๋งˆ๋‹ค ๋ณ„๋„์˜ constant pool ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•˜๋Š”๋ฐ, ํด๋ž˜์Šค ์ƒ์„ฑํ• ๋•Œ ์ฐธ์กฐํ•ด์•ผํ•  ์ •๋ณด๋“ค์„ ์ƒ์ˆ˜๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์˜์—ญ์ด๋‹ค.
  • JVM์€ ์ด Constant Pool์„ ํ†ตํ•ด ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋‚˜ ํ•„๋“œ์˜ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ƒ ์ฃผ์†Œ๋ฅผ ์ฐพ์•„ ์ฐธ์กฐํ•œ๋‹ค.
  • ์ •๋ฆฌํ•˜๋ฉด ์ƒ์ˆ˜ ์ž๋ฃŒํ˜•์„ ์ €์žฅํ•˜์—ฌ ์ฐธ์กฐํ•˜๊ณ  ์ค‘๋ณต์„ ๋ง‰๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

โœ๏ธ ํž™ ์˜์—ญ (Heap Area)

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

์ฆ‰,ย new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑ๋˜๋Š” ํด๋ž˜์Šค์™€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜, ๋ฐฐ์—ด ํƒ€์ž… ๋“ฑ Reference Type์ด ์ €์žฅ๋˜๋Š” ๊ณณ์ด๋‹ค.

๋‹น์—ฐํžˆ Method Area ์˜์—ญ์— ์ €์žฅ๋œ ํด๋ž˜์Šค๋งŒ์ด ์ƒ์„ฑ์ด ๋˜์–ด ์ ์žฌ๋œ๋‹ค.

๐Ÿ’ก Info
โ€ป ํž™ ์˜์—ญ์˜ ์‚ฌ์šฉ๊ธฐ๊ฐ„

  • ๊ฐ์ฒด๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ช…์‹œ์ ์œผ๋กœ null ์„ ์–ธ๋˜๊ธฐ ์ „ ๊นŒ์ง€
  • GC(Garbage Collection) ๋Œ€์ƒ์œผ๋กœ ์„ ์ •๋˜๊ธฐ ์ „ ๊นŒ์ง€

์œ ์˜ํ• ์ ์€ ํž™ ์˜์—ญ์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์€ Reference Type์œผ๋กœ์„œ, JVM ์Šคํƒ ์˜์—ญ์˜ ๋ณ€์ˆ˜๋‚˜ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ํ•„๋“œ์—์„œ ์ฐธ์กฐ๋œ๋‹ค๋Š” ์ ์ด๋‹ค.

์ฆ‰, ํž™์˜ ์ฐธ์กฐ ์ฃผ์†Œ๋Š” "์Šคํƒ"์ด ๊ฐ–๊ณ  ์žˆ๊ณ  ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ๋งŒ ํž™ ์˜์—ญ์— ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ํ•ธ๋“ค๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๋งŒ์ผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๋‚˜ ํ•„๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์˜๋ฏธ ์—†๋Š” ๊ฐ์ฒด๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์“ฐ๋ ˆ๊ธฐ๋กœ ์ทจ๊ธ‰ํ•˜๊ณ  JVM์€ ์“ฐ๋ ˆ๊ธฐ ์ˆ˜์ง‘๊ธฐ์ธ Garbage Collector๋ฅผ ์‹คํ–‰์‹œ์ผœ ์“ฐ๋ ˆ๊ธฐ ๊ฐ์ฒด๋ฅผ ํž™ ์˜์—ญ์—์„œ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋œ๋‹ค.

์ด์ฒ˜๋Ÿผ ํž™ ์˜์—ญ์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์— ๋Œ€์ƒ์ด ๋˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํšจ์œจ์ ์ธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„ธ๋ถ€์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 5๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰˜๊ฒŒ ๋œ๋‹ค.


Java8 ์ด์ „๊นŒ์ง€์˜ Heap ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

์ด๋ ‡๊ฒŒ ๋‹ค์„ฏ๊ฐ€์ง€ ์˜์—ญ(Eden, survivor 0, survivor 1, Old, Permanent)์œผ๋กœ ๋‚˜๋‰œ ํž™ ์˜์—ญ์€ ๋‹ค์‹œ ๋ฌผ๋ฆฌ์ ์œผ๋กœ Young Generation ๊ณผ Old Generation ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„๋˜๊ฒŒ ๋˜๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Young Generation : ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ์งง์€ ๊ฐ์ฒด๋ฅผ GC ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์˜์—ญ.
    • Eden : new๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ์œ„์น˜. Eden ์˜์—ญ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด, Eden ์˜์—ญ์— ์žˆ๋˜ ๊ฐ์ฒด๊ฐ€ Survivor1 ๋˜๋Š” Survivor2๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค
    • Survivor 0 / Survivor 1 : ๊ฐ ์˜์—ญ์ด ์ฑ„์›Œ์ง€๊ฒŒ ๋˜๋ฉด, ๋‚จ์€ ๊ฐ์ฒด๋Š” ๋น„์›Œ์ง„ Survivor๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋™. ์ด ๋‘ ๊ฐœ์˜ ์˜์—ญ ์‚ฌ์ด์— ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
  • Old Generation : ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ๊ธด ๊ฐ์ฒด๋ฅผ GC ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์˜์—ญ. Youn Generation์—์„œ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์ด๋™
    • ๋‹จ, Young ์˜์—ญ์—์„œ Old ์˜์—ญ์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฐ์ฒด ์ค‘, Survivor ์˜์—ญ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  Eden ์˜์—ญ์—์„œ ๋ฐ”๋กœ Old ์˜์—ญ์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฐ์ฒด๋„ ์กด์žฌํ•˜๋Š”๋ฐ, ์ด๋Š” ๊ฐ์ฒด์˜ ํฌ๊ธฐ๊ฐ€ ์•„์ฃผ ํด ๊ฒฝ์šฐ ๋ฐœ์ƒํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด Survivor์˜์—ญ์˜ ํฌ๊ธฐ๊ฐ€ 16MB์ธ๋ฐ ๊ฐ์ฒด์˜ ํฌ๊ธฐ๊ฐ€ 20MB์ผ ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•œ๋‹ค.

๐Ÿ’ก ์˜ค๋žซ๋™์•ˆ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์ด๋ผ๋ฉด, ์–ผ๋งˆ๋‚˜ ์˜ค๋žซ๋™์•ˆ์ผ๊นŒ?

์˜ค๋ž˜๋˜์—ˆ๋‹ค๊ณ  ํ•˜๋Š” ๊ธฐ์ค€์€ Young Generation ์˜์—ญ์—์„œ Minor GC ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋™์•ˆ ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ์‚ด์•„๋‚จ์•˜๋Š”์ง€๋กœ ํŒ๋‹จํ•œ๋‹ค. ๊ฐ ๊ฐ์ฒด๋Š” Minor GC์—์„œ ์‚ด์•„๋‚จ์€ ํšŸ์ˆ˜๋ฅผ ๊ธฐ๋กํ•˜๋Š” age bit ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, Minor GC๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค age bit ๊ฐ’์€ 1์”ฉ ์ฆ๊ฐ€ ํ•˜๊ฒŒ๋˜๋ฉฐ, age bit ๊ฐ’์ด MaxTenuringThreshold ๋ผ๋Š” ์„ค์ •๊ฐ’์„ ์ดˆ๊ณผํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ Old Generation ์˜์—ญ์„ ๊ฐ์ฒด๊ฐ€ ์ด๋™ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋˜๋Š” Age bit๊ฐ€ MaxTenuringThreshold ์ดˆ๊ณผํ•˜๊ธฐ ์ „์ด๋ผ๋„ Survivor ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•  ๊ฒฝ์šฐ์—๋Š” ๋ฏธ๋ฆฌ Old Generation ์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ์˜ฎ๊ฒจ์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.

Old ์˜์—ญ์—์„œ๋Š” 2์ฐจ GC์ธ Major GC(FULL GC)๊ฐ€ ์ผ์–ด๋‚˜๊ฒŒ ๋˜๋ฉฐ GC๋ฅผ ์ง„ํ–‰ํ•˜๋Š” Thread๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ด์™ธ์˜ ๋ชจ๋“  Thread๋ฅผ ๋ฉˆ์ถ˜ ์ƒํƒœ๋กœ GC๊ฐ€ ์ง„ํ–‰๋œ๋‹ค. ์ด์™€ ๊ฐ™์ด GC๋ฅผ ์ง„ํ–‰ํ•˜๋Š” Thread ์ด์™ธ์— ๋ชจ๋“  Thread๋ฅผ ๋ฉˆ์ถ”๋Š” ์ƒํƒœ๋ฅผ Stop-the-world๋ผ๊ณ  ํ•˜๋ฉฐ, ์–ด๋– ํ•œ GC์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋”๋ผ๊ณ  Stop-the-World ์ƒํƒœ๋ฅผ ํ”ผํ• ์ˆ˜๋Š” ์—†๋‹ค.

JVM์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด GCํŠœ๋‹์— ๋Œ€ํ•ด์„œ ๋“ค์–ด๋ณธ ์ ์ด ์žˆ์„๊ฒƒ์ด๋‹ค. GC๋ฅผ ํŠœ๋‹ํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฐ”๋กœ Stop-thr-world์˜ ์‹œ๊ฐ„์„ ์ตœ์†Œํ•œ์œผ๋กœ ์ค„์ด๊ธฐ ์œ„ํ•จ์ด๋‹ค.


Java8 ์ดํ›„์˜ Heap ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

์œ„์—์„œ Heap๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•˜๋ฉด์„œ ์„ค๋ช…ํ•˜์ง€ ์•Š์€ ์˜์—ญ์ด ํ•˜๋‚˜ ์žˆ๋‹ค. ๋ฐ”๋กœ Permanent ์˜์—ญ์ด๋‹ค.

Permanent ์˜์—ญ์˜ ๊ฒฝ์šฐ Java8๋ถ€ํ„ฐ Metaspace ์˜์—ญ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. ๊ธฐ์กด์˜(์ž๋ฐ”8 ์ด์ „) Permanet ์˜์—ญ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๋“ค์ด ์ €์žฅ๋˜์—ˆ๋‹ค.

  • Class์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ (๋ฐ”์ดํŠธ์ฝ”๋“œ ํฌํ•จ)
  • Method์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
  • static ๊ฐ์ฒด, static ์ƒ์ˆ˜
  • ์ƒ์ˆ˜ํ™”๋œ String Object
  • Class์™€ ๊ด€๋ จ๋œ ๋ฐฐ์—ด ๊ฐ์ฒด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
  • JVM ๋‚ด๋ถ€์ ์ธ ๊ฐ์ฒด๋“ค๊ณผ JIT์˜ ์ตœ์ ํ™” ์ •๋ณด

์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ์ €์žฅํ•˜๋˜ Permanent ์˜์—ญ์„ ์ž๋ฐ”8์—์„œ๋ถ€ํ„ฐ๋Š” Metaspace๋ผ๋Š” ์˜์—ญ์œผ๋กœ ๋Œ€์ฒดํ•˜์˜€๊ณ , ์ด Metaspace์˜์—ญ์€ Native๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ JVM์ด ์•„๋‹Œ OS์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋„๋ก ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.

  • Class์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ (๋ฐ”์ดํŠธ์ฝ”๋“œ ํฌํ•จ) โ†’ MetaSpace๋กœ ์ด๋™
  • Method์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ โ†’ MetaSpace๋กœ ์ด๋™
  • static ๊ฐ์ฒด,static ๋ณ€์ˆ˜ (class variable) โ†’ Heap์œผ๋กœ ์ด๋™
  • ์ƒ์ˆ˜ํ™”๋œ String Object โ†’ Heap์œผ๋กœ ์ด๋™
  • Class์™€ ๊ด€๋ จ๋œ ๋ฐฐ์—ด ๊ฐ์ฒด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ โ†’ Metaspace๋กœ ์ด๋™
  • JVM ๋‚ด๋ถ€์ ์ธ ๊ฐ์ฒด๋“ค๊ณผ JIT์˜ ์ตœ์ ํ™” ์ •๋ณด โ†’ Metaspace๋กœ ์ด๋™

์ฆ‰, ์ž๋ฐ”8 ์ดํ›„๋ถ€ํ„ฐ Static Object๊ฐ€ Heap ์˜์—ญ์œผ๋กœ ์˜ฎ๊ฒจ์ ธ์„œ GC์˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€๋‹ค.

๊ฑฐ์˜ ๊ทธ๋Ÿด์ผ์€ ์—†์ง€๋งŒ ๊ฐ€๋”์”ฉ Collection ๊ฐ์ฒด๋ฅผ staticํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜์—ฌ ๊ฐ’์„ ๊ณ„์†ํ•ด์„œ ์ถ”๊ฐ€ํ•˜๋‹ค๊ฐ€ Perm์˜์—ญ์ด ๊ฐ€๋“์ฐจ์„œ OutOfmemoryerror permgen space ๋ผ๋Š” Error๋ฅผ ๊ฒฝํ—˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

static List<Object> list = new ArrayList<>();

์ฆ‰, ์ด๋Ÿฌํ•œ OOM ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์— Perm ์˜์—ญ์— ์ €์žฅ๋˜๋˜ static Obejct์˜ ๋ณ€์ˆ˜์™€, ์ƒ์ˆ˜ํ™”๋œ static Object๋ฅผ Heap์˜์—ญ์œผ๋กœ ์ด๋™์‹œ์ผœ GC์˜ ๋Œ€์ƒ์ด ๋˜๋„๋ก ๋ณ€๊ฒฝํ•˜๊ณ , ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ •๋ณด๋“ค์„ OS๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์˜์—ญ์œผ๋กœ ์˜ฎ๊ฒจ Perm ์˜์—ญ์˜ ์‚ฌ์ด์ฆˆ ์ œํ•œ์„ ์—†์•ค ๊ฒƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

"Metaspace ์˜์—ญ์€ Heap์ด ์•„๋‹Œ Native ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์•ˆ์— ์žˆ๋‹ค. Heap ์˜์—ญ์€ JVM์ด ๊ด€๋ฆฌํ•˜๊ณ  Native ์˜์—ญ์€ OS๋ ˆ๋ฒจ์—์„œ ๊ด€๋ฆฌํ•ด ์ž๋™์œผ๋กœ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•˜๊ณ , Metaspace๊ฐ€ Native ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ์˜ ์˜์—ญํ™•๋ณด์˜ ์ƒํ•œ์„ ํฌ๊ฒŒ ์ธ์‹ํ•  ํ•„์š”๊ฐ€ ์—†๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๊ฒƒ์ด Java 8์—์„œ Metaspace๊ฐ€ ๋„์ž…๋œ ์ด์œ ์ด๋‹ค."


โœ๏ธ ์Šคํƒ ์˜์—ญ (Stack Area)

์Šคํƒ ์˜์—ญ์€ int, long, boolean ๋“ฑย ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์„ ์ƒ์„ฑํ• ย ๋•Œ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์œผ๋กœ, ์ž„์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋‚˜ ์ •๋ณด๋“ค์ด ์ €์žฅ๋˜๋Š” ์˜์—ญ์ด๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ Stack์€ ๋งˆ์ง€๋ง‰์— ๋“ค์–ด์˜จ ๊ฐ’์ด ๋จผ์ € ๋‚˜๊ฐ€๋Š” LIFOย  ๊ตฌ์กฐ๋กœ push์™€ pop ๊ธฐ๋Šฅ ์‚ฌ์šฉ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค ๊ฐ๊ฐ์˜ ์Šคํƒ ํ”„๋ ˆ์ž„(๊ทธ ๋ฉ”์„œ๋“œ๋งŒ์„ ์œ„ํ•œ ๊ณต๊ฐ„)์ด ์ƒ์„ฑ๋˜๊ณ  ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’๋“ค์„ ์ €์žฅํ•˜๊ณ , ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜, ๋ฆฌํ„ด ๊ฐ’ ๋ฐ ์—ฐ์‚ฐ ์‹œ ์ผ์–ด๋‚˜๋Š” ๊ฐ’๋“ค์„ ์ž„์‹œ๋กœ ์ €์žฅํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฉ”์„œ๋“œ ์ˆ˜ํ–‰์ด ๋๋‚˜๋ฉด ํ”„๋ ˆ์ž„๋ณ„๋กœ ์‚ญ์ œ๋œ๋‹ค.

๐Ÿ’ก ์Šคํƒ ํ”„๋ ˆ์ž„(stack frame)
๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ํ”„๋ ˆ์ž„์ด ๋งŒ๋“ค์–ด์ง€๋ฉฐ, ํ˜„์žฌ ์‹คํ–‰์ค‘์ธย ๋ฉ”์†Œ๋“œ ์ƒํƒœ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ์ด๋‹ค. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋ฒ”์œ„๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค. ์Šคํƒ ํ”„๋ ˆ์ž„์— ์Œ“์ด๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜, ๋ฆฌํ„ด๊ฐ’, ์—ฐ์‚ฐ์‹œ ๊ฒฐ๊ณผ๊ฐ’ ๋“ฑ์ด ์žˆ๋‹ค.

๋‹จ, ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ์Šคํƒ(stack) ๊ณผ ํž™(haeap)์— ์ €์žฅ๋˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค๋Š” ์ ์€ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

  • ๊ธฐ๋ณธ(์›์‹œ)ํƒ€์ž… ๋ณ€์ˆ˜๋Š” ์Šคํƒ ์˜์—ญ์— ์ง์ ‘ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.
  • ์ฐธ์กฐํƒ€์ž… ๋ณ€์ˆ˜๋Š” ํž™ ์˜์—ญ์ด๋‚˜ ๋ฉ”์†Œ๋“œ ์˜์—ญ์˜ ๊ฐ์ฒด ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„๋‹ค.

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

์Šคํƒ ์˜์—ญ์€ ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๋ฉฐ, ์Šค๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ํ• ๋‹น๋œ๋‹ค.

ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ ๋  ๋•Œ ์Šคํƒ ์‚ฌ์ด์ฆˆ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์–ด, ๋Ÿฐํƒ€์ž„ ์‹œ์— ์Šคํƒ ์‚ฌ์ด์ฆˆ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜๋Š” ์—†๋‹ค.

๋งŒ์ผ ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ JVM ์Šคํƒ์—์„œ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋ฉด StackOverFlowError๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

์“ฐ๋ ˆ๋“œ๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์Šคํƒ๋„ ์‚ฌ๋ผ์ง„๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ ๋ฐฐ์šด ๋ฉ”์†Œ๋“œ ์˜์—ญ, ํž™ ์˜์—ญ, ์Šค๋ ˆ๋“œ ์˜์—ญ์„ ํ•œ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œ์‹œํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋„์‹์ด ๊ทธ๋ ค์ง€๊ฒŒ ๋œ๋‹ค.


โœ๏ธ PC ๋ ˆ์ง€์Šคํ„ฐ (Program Counter Register)

PC Register์—๋Š” ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™˜๊ฒฝ์—์„œ ํ•œ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ํ•˜๋‹ค๊ฐ€ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๋กœ CPU์ž์›์„ ๋„˜๊ฒจ์ฃผ๊ณ  ๋‹ค์‹œ ๋ฐ›์•˜์„ ๋•Œ, ์ด์–ด์„œ ์ž‘์—…์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.

PC Register๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋˜์–ด ๊ฐ ์“ฐ๋ ˆ๋“œ ๋ณ„๋กœ ํ•˜๋‚˜์”ฉ ์กด์žฌํ•œ๋‹ค.

JVM ๋ช…๋ น์˜ ์ฃผ์†Œ๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ ์–ด๋–ค ๋ถ€๋ถ„์„ ๋ฌด์Šจ ๋ช…๋ น์œผ๋กœ ์‹คํ–‰ํ•ด์•ผํ•  ์ง€์— ๋Œ€ํ•œ ๊ธฐ๋ก์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋งŒ์•ฝ ์“ฐ๋ ˆ๋“œ๊ฐ€ JVM Instruction์„ ์ˆ˜ํ–‰์ค‘์ด๋ผ๋ฉด Instruction์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, Native Method๋ฅผ ์ˆ˜ํ–‰์ค‘์ด๋ผ๋ฉด PC Register๋Š” Undefined์ƒํƒœ๋กœ ๋‚จ์•„์žˆ๊ณ , ์ด์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Š” ๋ฐ”๋กœ ๋’ค์— ์–ธ๊ธ‰ํ•˜๊ฒŒ ๋  Native Method Stack์—์„œ ๋‹ด๋‹นํ•œ๋‹ค


โœ๏ธ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ (Native Method Stack)

๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ๋Š” ์ž๋ฐ” ์ฝ”๋“œ๊ฐ€ ์ปดํŒŒ์ผ๋˜์–ด ์ƒ์„ฑ๋˜๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ณ„์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์˜์—ญ์ด๋‹ค.

๋˜ํ•œ ์ž๋ฐ” ์ด์™ธ์˜ ์–ธ์–ด(C, C++, ์–ด์…ˆ๋ธ”๋ฆฌ ๋“ฑ)๋กœ ์ž‘์„ฑ๋œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฐ„์ด๊ธฐ๋„ ํ•˜๋‹ค.

์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ๋Š” ์ผ๋ฐ˜์ ์ธ C ์Šคํƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.

์œ„์—์„œ ๋ฐฐ์šด JIT ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋ณ€ํ™˜๋œ Native Code ์—ญ์‹œ ์—ฌ๊ธฐ์—์„œ ์‹คํ–‰์ด ๋œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. (์•„์ง ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋ฉด ์‹คํ–‰ ์—”์ง„ย ์„น์…˜ ๋ถ€๋ถ„์„ ๋‹ค์‹œ ๋ณต์Šตํ•˜๊ณ  ์˜ค์ž)

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ JVM ์Šคํƒ์— ์Œ“์ด๋‹ค๊ฐ€ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์— ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์Šคํƒ์— ์Œ“์ธ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ˆ˜ํ–‰์ด ๋๋‚˜๋ฉด ๋‹ค์‹œ ์ž๋ฐ” ์Šคํƒ์œผ๋กœ ๋Œ์•„์™€ ๋‹ค์‹œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

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

๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ ์Šคํƒ์€ ๋ฐ”๋กœ ๋‹ค์Œ์— ๋ฐฐ์šธ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ ์ธํ„ฐํŽ˜์ด์Šค(JNI)์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”๋ฐ, JNI๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ์ „ํ™˜๋˜์–ด ์ €์žฅ๋˜๊ฒŒ ๋œ๋‹ค.


โœ๏ธ JNI (Java Native Interface)

JNI๋Š” ์ž๋ฐ”๊ฐ€ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋งŒ๋“ค์–ด์ง„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.
์œ„์—์„œ ๋‹ค๋ค„๋ดค๋“ฏ์ด, JNI๋Š” JVM์ด Native Method๋ฅผ ์ ์žฌํ•˜๊ณ  ์ˆ˜ํ–‰ํ• ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ ์‹ค์งˆ์ ์œผ๋กœ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š” ์–ธ์–ด๋Š” C / C++ ์ •๋„ ๋ฐ–์— ์—†๋‹ค๊ณ  ํ•œ๋‹ค.


โœ๏ธ Native Method Library

C, C++๋กœ ์ž‘์„ฑ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์นญํ•œ๋‹ค.
๋งŒ์ผ ํ—ค๋”( *.h )๊ฐ€ ํ•„์š”ํ•˜๋ฉด JNI๋Š” ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋”ฉํ•ด ์‹คํ–‰ํ•œ๋‹ค.


๐Ÿ–ฅ๏ธ Java SE (Java Standard Edition)

๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ํ‘œ์ค€ ์—๋””์…˜์˜ ์ž๋ฐ” ํ”Œ๋žซํผ์œผ๋กœ ์ž๋ฐ” ์–ธ์–ด์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณต

  • ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํด๋ž˜์Šค ํŒจํ‚ค์ง€๋กœ ๊ตฌ์„ฑ

  • PC์šฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ, ์‘์šฉํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ, ์›น ๊ฐœ๋ฐœ, ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ ๋“ฑ๋“ฑ

  • PC์— ์„ค์น˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์— ๊ด€๋ จ


๐Ÿ–ฅ๏ธ Java EE (Java Enterprise Edition)

๋Œ€๊ทœ๋ชจ ๊ธฐ์—…์šฉ ์—๋””์…˜ ์œผ๋กœ์„œ SE์˜ ํ™•์žฅํŒ(๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์˜ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ ์‹œ)

  • ๊ธฐ์—… ํ™˜๊ฒฝ์„ ์œ„ํ•œ ๋Œ€๊ทœ๋ชจ ์†”๋ฃจ์…˜ ๊ฐœ๋ฐœ, ๋ชจ๋ฐ”์ผํฐ, ์…‹ํƒ‘ ๋ฐ•์Šค, ์ฐจ๋Ÿ‰์šฉ ํ…”๋ ˆ๋งคํ‹ฑ์Šค ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ

  • ex) Servlet, JSP, EJB...


๐Ÿ–ฅ๏ธ Java ME (Java Micro Edition)

ํ”ผ์ณํฐ, PDAํฐ, ์…‰ํ†ฑ๋ฐ•์Šค, ํ”„๋ฆฐํ„ฐ์™€ ๊ฐ™์€ ์ž‘์€ ์ž„๋ฒ ๋””๋“œ ๊ธฐ๊ธฐ๋“ค ๊ฐ™์€ ์ž‘์€ ๊ธฐ๊ธฐ๋ฅผ ๋‹ค๋ฃจ๋Š”๋ฐ ์ด์šฉํ•˜๋Š” ์—๋””์…˜

  • JAVA SE๋ฅผ ์ค„์—ฌ ๋ผ์ดํŠธํ•˜๊ฒŒ ๋งŒ๋“  ๊ฒƒ์ด ๋ฏ€๋กœ SE๊ฐœ๋ฐœ์„ ํ•  ์ค„ ์•Œ๋ฉด ME๊ธฐ๋ฐ˜์˜ ๊ฐœ๋ฐœ๋„ ๊ฐ€๋Šฅ
  • ๊ฐ๊ฐ์˜ OS(ex. Android OS, IOS, Black Berry ๋“ฑ)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์Šค๋งˆํŠธ ํฐ์ด ๋Œ€์ค‘ํ™”๋œ ์ง€๊ธˆ์€ ์ž˜ ์“ฐ์ด์ง€ ์•Š๋Š”๋‹ค

Reference

profile
๋А๋ฆด์ง€๋ผ๋„ ๊พธ์ค€ํ•˜๊ณ  ๊ผผ๊ผผํ•˜๊ฒŒ

0๊ฐœ์˜ ๋Œ“๊ธ€