Backend/JAVA

Java ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ GC

dddzr 2023. 7. 25. 16:28

 

๐Ÿ“Œ ๋ชฉ์ฐจ

  • JVM์ด ํ•˜๋Š” ์ผ ๊ฐœ์š”
  • JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ
    • Method Area
    • Heap
    • Stack
    • PC Register
    • Native Method Stack
  • Heap ๋‚ด๋ถ€ ๊ตฌ์กฐ
    • Young / Old Generation
  • GC(Garbage Collector) ๋™์ž‘ ๋ฐฉ์‹
    • Young GC / Full GC
  • ์™œ GC ํŠœ๋‹์ด ํ•„์š”ํ•œ๊ฐ€
  • ๋Œ€ํ‘œ JVM ์˜ต์…˜ ์˜ˆ์‹œ

 

 

๐Ÿ“Œ 1. JVM์ด ํ•˜๋Š” ์ผ ๊ฐœ์š”

Java ์ฝ”๋“œ๋Š” ์‹คํ–‰ ์‹œ JVM(Java Virtual Machine)์ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

โœ” ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋กœ๋”ฉ(ClassLoader)
โœ” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ
โœ” ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ
โœ” GC(Garbage Collection)

์ด ๊ณผ์ •์—์„œ JVM์€ ์ž๋ฐ” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ์˜์—ญ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•œ๋‹ค.


๐Ÿ“Œ 2. JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

JVM ๋ฉ”๋ชจ๋ฆฌ๋Š” ํฌ๊ฒŒ ์•„๋ž˜ 5๊ฐœ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰œ๋‹ค

์˜์—ญ ์—ญํ•  ์˜ˆ์‹œ
Method Area ํด๋ž˜์Šค ์ •๋ณด (static, ๋ฉ”์„œ๋“œ ์ฝ”๋“œ) ์ €์žฅ static ๋ฉ”์„œ๋“œ, ํด๋ž˜์Šค ๋กœ๋”ฉ ์ •๋ณด
Heap new๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด ์ €์žฅ, GC ๊ด€๋ฆฌ ๋Œ€์ƒ new JSONObject()
Stack ์Šค๋ ˆ๋“œ๋ณ„ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ •๋ณด (์ง€์—ญ ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ)  int count, parser
PC Register ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น ์œ„์น˜  
Native Method Stack JNI ๊ฐ™์€ native ์ฝ”๋“œ ์‹คํ–‰์šฉ  

 

โœ… 2-1. Method Area (or ํด๋ž˜์Šค ์˜์—ญ)

  • ํด๋ž˜์Šค ์ •๋ณด ์ €์žฅ: ํ•„๋“œ, ๋ฉ”์„œ๋“œ, static ๋ณ€์ˆ˜
  • ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ 
  •  ํด๋ž˜์Šค ๋กœ๋”์— ์˜ํ•ด ํด๋ž˜์Šค ํŒŒ์ผ์ด ๋กœ๋“œ๋˜๊ณ  ํŒŒ์‹ฑ๋˜์–ด ๋ฉ”์†Œ๋“œ ์˜์—ญ์— ์ €์žฅ๋จ.

 

โœ… 2-1-1. Constant Pool (์ƒ์ˆ˜ ํ’€)

  • ํด๋ž˜์Šค ํŒŒ์ผ ๋‚ด๋ถ€์— ์œ„์น˜ํ•œ ํŠน๋ณ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ
  • ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’(๋ฌธ์ž์—ด, ์ •์ˆ˜, ๋ถ€๋™ ์†Œ์ˆ˜์  ๋“ฑ) ์ €์žฅ
  • ์ค‘๋ณต ์ €์žฅ ์—†์Œ
  • ๋ถˆ๋ณ€(Immutable)
  • JVM ์‹คํ–‰ ์ค‘ ์žฌ์‚ฌ์šฉ → ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”


โœ… 2-2. Heap (ํž™)

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


โœ… 2-3. Stack (์Šคํƒ)

  • ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๋ณ„๋„ ํ• ๋‹น, ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ(์‹คํ–‰ ์ˆœ์„œ)๊ณผ ์ง€์—ญ ๋ณ€์ˆ˜๋“ค์„ ์ €์žฅ.
  • ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ Frame ์ƒ์„ฑ
  • ๋ฉ”์„œ๋“œ ์ข…๋ฃŒ ์‹œ ์ž๋™ ํ•ด์ œ

 

๋ฉ”์†Œ๋“œ ์˜์—ญ, ํž™ ์˜์—ญ, ์Šคํƒ ์˜์—ญ์€ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ๋“ค์ด๊ณ ,

Native Method Stack Area์™€ PC Register๋Š” ์ด๋“ค๊ณผ๋Š” ๋‹ค๋ฅธ ๋ชฉ์ ๊ณผ ์—ญํ• ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ… 2-4. Native Method Stack Area

 

  • ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ (JNI/C/C++ ์ฝ”๋“œ ์‹คํ–‰์šฉ) ์‹œ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰์ •๋ณด ์ €์žฅ๋จ.
  • *Native Method: ์ž๋ฐ” ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ, ๋„ค์ดํ‹ฐ๋ธŒ ์–ธ์–ด(C, C++ ๋“ฑ)๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ.


โœ… 2-5. PC Register (Program Counter Register)

  • ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ์˜ ๋ช…๋ น์–ด ์ฃผ์†Œ(Instruction Pointer)๋ฅผ ์ €์žฅํ•˜๋Š” ๋ ˆ์ง€์Šคํ„ฐ
  • ์Šค๋ ˆ๋“œ๋งˆ๋‹ค 1๊ฐœ์”ฉ ์กด์žฌ
  • ๋ช…๋ น์–ด ์ฃผ์†Œ๋Š” ๋‹ค์Œ์— ์‹คํ–‰๋  ๋ช…๋ น์–ด ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ด.
  • ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด PC Register์— ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ์˜ ์‹œ์ž‘ ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋˜๊ณ , ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๋ฉด ๋‹ค์‹œ ์ด์ „ ๋ช…๋ น์–ด ์ฃผ์†Œ๋กœ ๋ณต์›.
  • JVM์ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์Šค๋ ˆ๋“œ ์Šค์œ„์นญ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ.

 

๐Ÿ“Œ 3. Heap ๋‚ด๋ถ€ ๊ตฌ์กฐ (Generation)

Heap์€ GC ํšจ์œจ์„ ์œ„ํ•ด Generation ๊ตฌ์กฐ๋กœ ๋ถ„๋ฆฌ๋œ๋‹ค.

 
[ Young Generation ]
    โ”” Eden      ← ์ƒˆ ๊ฐ์ฒด๊ฐ€ ์ฒ˜์Œ ๋“ค์–ด์˜ค๋Š” ๊ณต๊ฐ„
    โ”” Survivor(S0, S1)  ← ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์ž ์‹œ ๋จธ๋ฌด๋Š” ๊ณต๊ฐ„
[ Old Generation ]
    โ”” ์˜ค๋ž˜ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์ด๋™ (์žฅ๊ธฐ ๋ณด๊ด€)

 

โœ” Young Generation

  • ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ณณ
  • ๋Œ€๋ถ€๋ถ„ ๊ธˆ๋ฐฉ ์‚ฌ๋ผ์ง → ๋น ๋ฅธ ์ •๋ฆฌ ๊ฐ€๋Šฅ

โœ” Old Generation

  • Young์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์ด๋™
  • ์—ฌ๊ธฐ ์Œ“์ด๋ฉด Full GC ๋ฐœ์ƒ

๐Ÿ“Œ 4. GC(Garbage Collector) ๋™์ž‘ ๋ฐฉ์‹

์šฉ์–ด ๋Œ€์ƒ ํŠน์ง•
Young GC (Minor GC) Young๋งŒ ๋น ๋ฅด๊ณ  ์ž์ฃผ ๋ฐœ์ƒ
Old GC (Major/Full GC) Old ํฌํ•จ ์ „์ฒด ๋А๋ฆผ, STW ๋ฐœ์ƒ

STW(Stop-The-World)๋ž€ GC ์ค‘ JVM์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์„ ๋ฉˆ์ถ”๋Š” ์ƒํ™ฉ์„ ์˜๋ฏธํ•œ๋‹ค.


๐Ÿ“Œ 5. ์™œ GC ํŠœ๋‹์ด ํ•„์š”ํ•œ๊ฐ€?

โŒ GC๊ฐ€ ๋„ˆ๋ฌด ์ž์ฃผ ๋Œ๋ฉด → ์‘๋‹ต ์ง€์—ฐ, ๋Š๊น€
โŒ Full GC ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๊ธธ๋ฉด → ์„œ๋ฒ„ ๋‹ค์šด/ํƒ€์ž„์•„์›ƒ

 

โžก๏ธ ๊ทธ๋ž˜์„œ ์„œ๋ฒ„๋Š” ์ƒํ™ฉ์— ๋งž๊ฒŒ ํŠœ๋‹ ํ•„์š”

โœ” GC ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ
โœ” Heap ํฌ๊ธฐ ์กฐ์ ˆ
โœ” New/Old ๋น„์œจ ์„ค์ •


๐Ÿ“Œ 6. JVM ์˜ต์…˜ ์˜ˆ์‹œ

-XX:+UseG1GC           # G1 GC ์‚ฌ์šฉ (JDK9+ ๊ธฐ๋ณธ)
-Xms512m -Xmx1024m     # ์ตœ์†Œ/์ตœ๋Œ€ Heap
-XX:NewRatio=2         # Old:Young ๋น„์œจ
-XX:+PrintGCDetails    # GC ๋กœ๊ทธ ์ถœ๋ ฅ
GC ์ข…๋ฅ˜ ํŠน์ง• ์ถ”์ฒœ ์ƒํ™ฉ
Serial GC ๋‹จ์ผ ์Šค๋ ˆ๋“œ, ๋А๋ฆผ ๋‹จ์ˆœํ•œ ์•ฑ
Parallel GC ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ, ๋น ๋ฆ„ Throughput ์ค‘์š”ํ•œ ์„œ๋ฒ„
CMS ๋ฉˆ์ถค ์งง์Œ, Old ์„ธ๋Œ€ ๋™์‹œ ์ˆ˜์ง‘ ์‘๋‹ต ์ง€์—ฐ ์ค„์ด๊ณ  ์‹ถ์„ ๋•Œ
G1 GC Heap์„ ์˜์—ญํ™”, Full GC ์ค„์ž„ ๋Œ€๋ถ€๋ถ„ ์ƒํ™ฉ์—์„œ ๋ฌด๋‚œํ•จ ๐Ÿ‘ (์š”์ฆ˜ ๊ธฐ๋ณธ๊ฐ’)