Skip to content

Latest commit

ย 

History

History
117 lines (68 loc) ยท 7.34 KB

File metadata and controls

117 lines (68 loc) ยท 7.34 KB

jvm (enzo)

JVM ๋™์ž‘ ๋ฐฉ์‹

  1. ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ(javac)๊ฐ€ ์ž๋ฐ” ์†Œ์Šค์ฝ”๋“œ(.java)๋ฅผ ๋ฐ”์ดํŠธ์ฝ”๋“œ(.class)๋กœ ์ปดํŒŒ์ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ํด๋ž˜์Šค ๋กœ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค
    1. ๋กœ๋”ฉ : ํด๋ž˜์Šค๋ฅผ ์ฝ์–ด์˜ค๋Š” ๊ณผ์ • .class ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€์„œ jvm์˜ ๋ฉ”์„œ๋“œ ์˜์—ญ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜์—ญ์—๋Š” ์ฝ”๋“œ, ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ, static ๋ณ€์ˆ˜๋“ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    2. ๋งํฌ : ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฝ๋Š” ๊ณผ์ • ๊ฒ€์ฆ, ์ค€๋น„, ํ•ด์„์˜ ์„ธ๋ถ€ ๋‹จ๊ณ„๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค ๊ฒ€์ฆ : ๋ฐ”์ดํŠธ ์ฝ”๋“œ๊ฐ€ ์•ˆ์ „ํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค ์ค€๋น„: ํด๋ž˜์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ , ์ •์ ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ฉ๋‹ˆ๋‹ค ํ•ด์„: ์‹ฌ๋ณผ๋ฆญ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ๋ฅผ ์ง์ ‘ ์ฐธ์กฐ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค
    3. ์ดˆ๊ธฐํ™” static ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜๊ณ , static ๋ธ”๋ก์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  3. JVM์ด .class ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ , ์—ฐ๊ฒฐ ๋ฐ ์ดˆ๊ธฐํ™” ํ›„์— ์‹คํ–‰ ์—”์ง„์„ ํ†ตํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. JVM์€ ํž™ ์˜์—ญ์—์„œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์†Œ๋ฉธ์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๊ณ , ์Šคํƒ ์˜์—ญ์—์„œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ์—”์ง„

์‹คํ–‰ ์—”์ง„์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์™€ JIT(Just In-Time) ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ธํ„ฐํ”„๋ฆฌํ„ฐ: ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„์”ฉ ์ฝ์–ด์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, ์ด๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • JIT ์ปดํŒŒ์ผ๋Ÿฌ: ์ด๋Ÿฌํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด JIT ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜(์ปดํŒŒ์ผ)ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ

์‹คํ–‰ ์—”์ง„์ด ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ, ๋ฐ์ดํ„ฐ๋Š” JVM์˜ ์—ฌ๋Ÿฌ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ €์žฅ๋˜๊ฑฐ๋‚˜ ์˜ฎ๊ฒจ์ง‘๋‹ˆ๋‹ค.

  • ๋ฉ”์„œ๋“œ ์˜์—ญ(Method Area): ์ด ์˜์—ญ์€ ํด๋ž˜์Šค ์ˆ˜์ค€์˜ ์ •๋ณด(ํด๋ž˜์Šค ์ด๋ฆ„, ๋ถ€๋ชจ ํด๋ž˜์Šค ์ด๋ฆ„, ๋ฉ”์„œ๋“œ์™€ ๋ณ€์ˆ˜ ๋“ฑ)๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ํž™ ์˜์—ญ(Heap Area): JVM์ด ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ด ํž™ ์˜์—ญ์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ์ด ์˜์—ญ์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
  • ์Šคํƒ ์˜์—ญ(Stack Area): ๊ฐ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๊ณผ ๋กœ์ปฌ ๋ณ€์ˆ˜๋Š” ์—ฌ๊ธฐ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์ด ์ƒ์„ฑ๋˜๋ฉฐ, ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด ์™„๋ฃŒ๋˜๋ฉด ํ•ด๋‹น ์Šคํƒ ํ”„๋ ˆ์ž„์€ ํŒŒ๊ดด๋ฉ๋‹ˆ๋‹ค.
  • PC ๋ ˆ์ง€์Šคํ„ฐ(PC Registers): ๊ฐ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ PC ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉฐ, ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ(Native Method Stack): ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ œ์–ด ๋ฐ ์‹คํ–‰ ๋ณด์กฐ

  • ์“ฐ๋ ˆ๋“œ ๋™๊ธฐํ™”(Thread Synchronization): ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์—์„œ๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ, ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”๊ฐ€ ์ค‘์š”ํ•œ ์ด์Šˆ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. JVM์€ ๊ฐ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์Šคํƒ ์˜์—ญ๊ณผ PC ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์œ ์ง€ํ•จ์œผ๋กœ์จ ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ๋™๊ธฐํ™”๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์ธํ„ฐํŽ˜์ด์Šค(Native Method Interface, JNI): JVM์€ Java๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ผ ๋ถˆ๋ฆฌ๋Š” ํŠน์ • ํ”Œ๋žซํผ์— ์ข…์†์ ์ธ ๋ฉ”์„œ๋“œ๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JNI๋ฅผ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection): JVM์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ๋™์ ์œผ๋กœ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ํšŒ์ˆ˜ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žฌํ™œ์šฉํ•˜๋ฉฐ, ์ด๋กœ ์ธํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

ํž™ ์˜์—ญ์˜ ๋ณ€์ฒœ์‚ฌ

ํž™ ์˜์—ญ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ ๋ฐ ์žฌํ™œ์šฉ์„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํž™์˜์—ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. Young Generation : ์ƒ์„ฑ๋œ์ง€ ์–ผ๋งˆ ์•ˆ๋œ ๊ฐ์ฒด ์ €์žฅ์†Œ
  2. Old Generation : ์ƒ์„ฑ๋œ์ง€ ์–ด๋А ์ •๋„ ๋œ ๊ฐ์ฒด ์ €์žฅ์†Œ
  3. Permanent Generation โ†’ Metaspace (Java 8 ์ดํ›„๋กœ ๋ณ€๊ฒฝ) : ํด๋ž˜์Šค ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ์ €์žฅ ์˜์—ญ

์ €์žฅ ์˜์—ญ์˜ ๋ณ€๊ฒฝ ์ด์œ 

Permanent Generation์€ ์—ฌ๋Ÿฌ ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์œผ๋ฉฐ, ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ์ด ์˜์—ญ์ด ๊ณ ์ • ํฌ๊ธฐ๋ผ๋Š” ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, JVM ์‹œ์ž‘ ์‹œ์— ์ด ์˜์—ญ์˜ ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋˜๊ณ , ์‹คํ–‰ ์ค‘์— ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด OutOfMemoryError๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Java 8์—์„œ๋Š” Permanent Generation์„ ์ œ๊ฑฐํ•˜๊ณ  Metaspace๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. Metaspace๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์ง€๋งŒ, ์ด ์˜์—ญ์€ ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ์— ์ œํ•œ์„ ๋ฐ›์ง€ ์•Š๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ

ํด๋ž˜์Šค ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋Š” ๋‘ ์˜์—ญ์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ ์˜์—ญ(Method Area)

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

  • ํด๋ž˜์Šค ์ด๋ฆ„
  • ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ ‘๊ทผ ์ง€์ •์ž
  • ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ง์ ‘ ์ƒ์œ„ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค
  • ์ด ํด๋ž˜์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ final์ธ์ง€ ์—ฌ๋ถ€, ์ถ”์ƒ ํด๋ž˜์Šค์ธ์ง€ ์—ฌ๋ถ€ ๋“ฑ์˜ ํ”Œ๋ž˜๊ทธ
  • ์ด ํด๋ž˜์Šค์˜ ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ(์ •์  ๋˜๋Š” ์ธ์Šคํ„ด์Šค)

์ด๋Š” ๊ฐ ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์ •์  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Metaspace

ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์˜์—ญ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Metaspace์— ์ €์žฅ๋˜๋Š” ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

  • ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€
  • ํ•„๋“œ ๋ฐ ๋ฉ”์„œ๋“œ ๋ฐ์ดํ„ฐ
  • ๋ฉ”์„œ๋“œ์™€ ์ƒ์„ฑ์ž์˜ ๋ฐ”์ดํŠธ ์ฝ”๋“œ
  • ํด๋ž˜์Šค ๋กœ๋”์— ์˜ํ•ด ๋กœ๋“œ๋œ ํด๋ž˜์Šค์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

๋”ฐ๋ผ์„œ Metaspace๋Š” ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์ด ์‹คํ–‰๋˜๋Š” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ๋” ๋™์ ์ด๊ณ  ๊ตฌ์ฒด์ ์ธ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜

https://www.inflearn.com/course/the-java-code-manipulation/dashboard

https://lob-dev.tistory.com/82

๋‚˜๋ˆ ๋ณด๊ณ  ์‹ถ์€ ์ด์•ผ๊ธฐ

  • method area์™€ heap์˜ permgen ์˜์—ญ์€ ๋‚˜๋ˆˆ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?
  • ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ ์žฅ๋‹จ์ ์€?
    • ์ตœ๊ทผ ์–ธ์–ด์˜ ๋ณ€์ฒœ์‚ฌ?
  • jit ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ค.