Java

JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ

9taetae9 2025. 6. 17. 17:42
728x90

JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

JVM์˜ ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์€ ํฌ๊ฒŒ ์Šค๋ ˆ๋“œ ๊ณต์œ  ์˜์—ญ๊ณผ ์Šค๋ ˆ๋“œ ๊ฐœ๋ณ„ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์˜์—ญ

  • ๋ฉ”์„œ๋“œ ์˜์—ญ (Method Area)
  • ํž™ (Heap)

์Šค๋ ˆ๋“œ๋ณ„ ๊ฐœ๋ณ„ ์˜์—ญ

  • ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ (PC Register)
  • ๊ฐ€์ƒ ๋จธ์‹  ์Šคํƒ (JVM Stack)
  • ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ (Native Method Stack)

๊ฐ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ์ƒ์„ธ ๋ถ„์„

1. ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ (PC Register)

์—ญํ• : ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ฐ”์ดํŠธ์ฝ”๋“œ์˜ ์ค„ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž‘์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ

ํŠน์ง•:

  • ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌ
  • ์ž๋ฐ” ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์‹œ: ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋ช…๋ น์–ด ์ฃผ์†Œ ์ €์žฅ
  • ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์‹œ: Undefined ์ƒํƒœ
  • ์œ ์ผํ•˜๊ฒŒ OutOfMemoryError ์กฐ๊ฑด์ด ๋ช…์‹œ๋˜์ง€ ์•Š์€ ์˜์—ญ

2. ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹  ์Šคํƒ (JVM Stack)

์—ญํ• : ์ž๋ฐ” ๋ฉ”์„œ๋“œ(๋ฐ”์ดํŠธ์ฝ”๋“œ) ์‹คํ–‰์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ

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

  • ์ง€์—ญ ๋ณ€์ˆ˜ ํ…Œ์ด๋ธ”: ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…, ๊ฐ์ฒด ์ฐธ์กฐ, ๋ฐ˜ํ™˜ ์ฃผ์†Œ ์ €์žฅ
  • ํ”ผ์—ฐ์‚ฐ์ž ์Šคํƒ: ๊ณ„์‚ฐ ๊ณผ์ •์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ž„์‹œ ์ €์žฅ์†Œ
  • ๋™์  ๋งํฌ: ๋ฉ”์„œ๋“œ ๊ฐ„ ์—ฐ๊ฒฐ ์ •๋ณด
  • ๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜๊ฐ’: ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ๋กœ ๋Œ์•„๊ฐˆ ์ •๋ณด

๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜:

  • StackOverflowError: ์Šคํƒ ๊นŠ์ด ํ•œ๊ณ„ ์ดˆ๊ณผ (๋ฌดํ•œ ์žฌ๊ท€ ๋“ฑ)
  • OutOfMemoryError: ์Šคํƒ ํ™•์žฅ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ

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

์—ญํ• : JNI(Java Native Interface)๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ๋˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์‹คํ–‰

ํŠน์ง•:

  • JVM ๊ตฌํ˜„์ฒด๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„
  • HotSpot JVM์—์„œ๋Š” ๊ฐ€์ƒ ๋จธ์‹  ์Šคํƒ๊ณผ ํ†ตํ•ฉ
  • ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹  ์Šคํƒ๊ณผ ๋™์ผํ•œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

4. ์ž๋ฐ” ํž™ (Java Heap)

์—ญํ• : ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์™€ ๋ฐฐ์—ด์„ ์ €์žฅํ•˜๋Š” ๊ฐ€์žฅ ํฐ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ

ํŠน์ง•:

  • ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์˜์—ญ
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(GC)๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์˜์—ญ
  • ๋ฌผ๋ฆฌ์ ์œผ๋กœ๋Š” ๋ถˆ์—ฐ์†์ด์–ด๋„ ๋…ผ๋ฆฌ์ ์œผ๋กœ๋Š” ์—ฐ์†์ 

์„ธ๋Œ€๋ณ„ ๊ตฌ๋ถ„ (์ „ํ†ต์ ์ธ GC ๋ฐฉ์‹):

  • ์‹ ์„ธ๋Œ€ (Young Generation)
    • Eden Space: ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค์˜ ์ฒซ ๋ฒˆ์งธ ๊ฑฐ์ฃผ์ง€
    • Survivor Space (From/To): Eden์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์˜ ์ž„์‹œ ๊ฑฐ์ฃผ์ง€
  • ๊ตฌ์„ธ๋Œ€ (Old Generation): ์˜ค๋ž˜ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์˜ ์ตœ์ข… ๊ฑฐ์ฃผ์ง€

์ฃผ์š” JVM ์˜ต์…˜:

  • -Xms: ํž™ ์ดˆ๊ธฐ ํฌ๊ธฐ
  • -Xmx: ํž™ ์ตœ๋Œ€ ํฌ๊ธฐ

๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜:

  • OutOfMemoryError: Java heap space: ํž™ ๊ณต๊ฐ„ ๋ถ€์กฑ

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

์—ญํ• : ํด๋ž˜์Šค ์ˆ˜์ค€์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์˜์—ญ

์ €์žฅ๋˜๋Š” ์ •๋ณด:

  • ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํƒ€์ž… ์ •๋ณด
  • ์ƒ์ˆ˜ ํ’€ (Constant Pool)
  • ์ •์  ๋ณ€์ˆ˜ (Static Variables)
  • JIT ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผํ•œ ์ฝ”๋“œ ์บ์‹œ

์—ญ์‚ฌ์  ๋ณ€์ฒœ์‚ฌ:

  • JDK 7 ์ด์ „: PermGen (Permanent Generation)์œผ๋กœ ๊ตฌํ˜„
  • JDK 8 ์ดํ›„: Metaspace๋กœ ๊ตฌํ˜„ (๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ)

๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜:

  • OutOfMemoryError: PermGen space (JDK 7 ์ด์ „)
  • OutOfMemoryError: Metaspace (JDK 8 ์ดํ›„)

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

์—ญํ• : ๋ฉ”์„œ๋“œ ์˜์—ญ์˜ ์ผ๋ถ€๋กœ, ํด๋ž˜์Šค ํŒŒ์ผ์˜ ์ƒ์ˆ˜ ํ’€ ์ •๋ณด๋ฅผ ๋Ÿฐํƒ€์ž„์— ๊ด€๋ฆฌ

ํŠน์ง•:

  • ์ปดํŒŒ์ผ ํƒ€์ž„ ์ƒ์ˆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋Ÿฐํƒ€์ž„์—๋„ ์ƒˆ๋กœ์šด ์ƒ์ˆ˜ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
  • String.intern() ๋ฉ”์„œ๋“œ๊ฐ€ ์ด ์˜์—ญ์„ ํ™œ์šฉ

7. ๋‹ค์ด๋ ‰ํŠธ ๋ฉ”๋ชจ๋ฆฌ (Direct Memory)

์—ญํ• : JVM ํž™ ์™ธ๋ถ€์˜ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉ

์‚ฌ์šฉ ์˜ˆ์‹œ:

  • NIO์˜ DirectByteBuffer
  • ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ

์žฅ์ :

  • ํž™๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ„ ๋ณต์‚ฌ ๊ณผ์ • ์ƒ๋žต์œผ๋กœ ์„ฑ๋Šฅ ํ–ฅ์ƒ

์ฃผ์˜์‚ฌํ•ญ:

  • -Xmx ์„ค์ •๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ํ•œ๊ณ„์— ์˜ํ–ฅ๋ฐ›์Œ
  • ๊ด€๋ฆฌ ์†Œํ™€ ์‹œ OutOfMemoryError ๋ฐœ์ƒ ๊ฐ€๋Šฅ

 

 

์ฐธ๊ณ  ์ž๋ฃŒ: 

JVM ๋ฐ‘๋ฐ”๋‹ฅ๊นŒ์ง€ ํŒŒํ—ค์น˜๊ธฐ(์ธ์‚ฌ์ดํŠธ) - ์ €์šฐ์ฆˆ๋ฐ ์ €, ์ด๋ณต์—ฐ ์˜ฎ๊น€

https://blackdogdev.medium.com/java-memory-management-68e572b16be8

728x90