Garbage Collection

์ž๋ฐ” ํ”Œ๋žซํผ์ด ์ฒ˜์Œ ์ถœ์‹œ๋์„ ๋•Œ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘(GC)์€ ์ƒ๋‹นํ•œ ๋ฐ˜๊ฐ์„ ์ƒ€๋‹ค. ์–ธ์–ด ์ˆ˜์ค€์—์„œ ์˜๋„์ ์œผ๋กœ ์ˆ˜์ง‘๊ธฐ ์ž‘๋™์„ ์ œ์–ดํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์•Œ๋ ค์ง€๋ฉด์„œ ์—ฌ๋ก ์€ ๋” ๋‚˜๋น ์กŒ๋‹ค. ํ•˜์ง€๋งŒ ์„ธ์›”์ด ์ง€๋‚˜๋ฉด์„œ ์ด์ œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋‚˜ ๋Ÿฐํƒ€์ž„์˜ ์˜์—ญ์ด๋ผ๊ณ  ๋ณด๋Š” ์‹œ๊ฐ์ด ์ง€๋ฐฐ์ ์ด๋‹ค.

Garbage Collection์˜ ๋‘ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์›์น™

๋ชจ๋“  GC ๊ตฌํ˜„์ฒด๋Š” ๋‹น์—ฐํ•œ ๋ง์ด์ง€๋งŒ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์›์น™์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•œ๋‹ค.

  1. ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ˜๋“œ์‹œ ๋ชจ๋“  ๊ฐ€๋น„์ง€๋ฅผ ์ˆ˜์ง‘ํ•ด์•ผ ํ•œ๋‹ค

  2. ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด๋Š” ์ ˆ๋Œ€๋กœ ์ˆ˜์ง‘ํ•ด์„  ์•ˆ ๋œ๋‹ค.

Java Garbage Collection ์ ์šฉ ๋ฒ”์œ„

๊ธฐ๋ณธ์ ์œผ๋กœ JVM์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ด 5๊ฐ€์ง€ ์˜์—ญ(class, stack, heap, native method, PC)์œผ๋กœ ๋‚˜๋‰˜๋Š”๋ฐ, GC๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ๋งŒ ๋‹ค๋ฃฌ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— GC์˜ ๋Œ€์ƒ์ด ๋œ๋‹ค.

  1. ๊ฐ์ฒด๊ฐ€ NULL์ธ ๊ฒฝ์šฐ

  2. ๋ธ”๋Ÿญ ์‹คํ–‰ ์ข…๋ฃŒ ํ›„, ๋ธ”๋Ÿญ ์•ˆ์—์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด

  3. ๋ถ€๋ชจ ๊ฐ์ฒด๊ฐ€ NULL์ธ ๊ฒฝ์šฐ, ํฌํ•จํ•˜๋Š” ์ž์‹ ๊ฐ์ฒด

System.gc() ? ๊ฐ€๋” ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ํ•ด์ œํ•  ๋•Œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ null๋กœ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ System.gc()๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋„ ํ•œ๋‹ค. null๋กœ ์ง€์ •ํ•˜๋Š” ๊ฑด ํฐ ๋ฌธ์ œ๋Š” ์•ˆ ๋˜์ง€๋งŒ, System.gc()๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ผ์น˜๋ฏ€๋กœ ์ ˆ๋Œ€๋กœ ์‚ฌ์šฉํ•ด์„  ์•ˆ ๋œ๋‹ค. System.gc()๋Š” ์ ์œ ์ค‘์ธ ์“ธ๋ชจ์—†๋Š” ๊ฐ์ฒด๋ฅผ ํ•ด์ œ์‹œ์ผœ์ฃผ๋Š” static system์˜ ๋ฉ”์†Œ๋“œ์ธ๋ฐ, System.gc()๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด ์†๋„๊ฐ€ 750~850ms๋กœ ์ž๋™ ํ˜ธ์ถœ๋˜๋Š” gc๋ณด๋‹ค 5,000๋ฐฐ ์ด์ƒ์˜ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.


์ด์ œ ์ž๋ฐ” ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์˜ ๊ธฐ์ดˆ ์ด๋ก ์„ ์†Œ๊ฐœํ•˜๊ณ , ์ž๋ฐ” ํ”Œ๋žซํผ์—์„œ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์„ ์™„์ „ํžˆ ์ดํ•ด/์ œ์–ดํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šด ์ด์œ ๋ฅผ ๋งํ•ด๋ณด์ž. ๋˜ ํ•ซ์ŠคํŒŸ์ด ๋Ÿฐํƒ€์ž„์— ๊ฐ์ฒด๋ฅผ ํž™์— ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ทธ ๊ธฐ๋ณธ ํŠน์„ฑ์„ ์•Œ์•„๋ณด์ž.

๋์œผ๋กœ๋Š” ํ•ซ์ŠคํŒŸ์—์„œ ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์ƒ์šฉ ์ˆ˜์ง‘๊ธฐ์ธ ๋ณ‘๋ ฌ ์ˆ˜์ง‘๊ธฐ๋ฅผ ์†Œ๊ฐœํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์›Œํฌ๋กœ๋“œ์—์„œ์˜ ์“ฐ์ž„์ƒˆ๋ฅผ ์•Œ์•„๋ณด์ž.

Garbage Collection์˜ ๋™์ž‘ ๋ฐฉ์‹

์„ธ๋ถ€์ ์ธ ๋™์ž‘ ๋ฐฉ์‹์€ ๋‹ค๋ฅด์ง€๋งŒ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์‹คํ–‰๋  ๋•Œ๋Š” ๋‹ค์Œ์˜ ๋™์ž‘ ๋ฐฉ์‹๋“ค์„ ๋”ฐ๋ฅธ๋‹ค.

Stop The World

๊ฐ€๋ฐ”์ง€๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋™์•ˆ์—” JVM์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์„ ๋ฉˆ์ถ˜๋‹ค. stop-the-world๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด GC๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ค‘๋‹จ๋œ๋‹ค. GC ์ž‘์—…์„ ์™€๋ฃŒํ•œ ์ดํ›„์—์•ผ ์ค‘๋‹จํ–ˆ๋˜ ์ž‘์—…์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค. ์–ด๋–ค GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ stop-the-world๋Š” ๋ฐœ์ƒํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„ GC ํŠœ๋‹์ด๋ž€ ์ด stop-the-world ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๊ฒƒ์ด๋‹ค.

Mark and Sweep

  • ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์‹๋ณ„(Mark)

  • ํž™์˜ ์•ž ๋ถ€๋ถ„๋ถ€ํ„ฐ ํ™•์ธํ•ด์„œ ์‚ด์•„ ์žˆ๋Š” ๊ฒƒ๋งŒ ๋‚จ๊น€(Sweep)

Compaction(์••์ฐฉ)

์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์€ GC ์‚ฌ์ดํด ๋งˆ์ง€๋ง‰์— ์—ฐ์†๋œ ๋‹จ์ผ ์˜์—ญ์œผ๋กœ(๋Œ€๋ถ€๋ถ„ ๊ทธ ์˜์—ญ์˜ ์ฒซ ๋ถ€๋ถ„๋ถ€ํ„ฐ) ๋ฐฐ์—ด๋˜๋ฉฐ, ๊ฐ์ฒด ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋นˆ ๊ณต๊ฐ„์˜ ์‹œ์ž‘์ ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”(memory fragmentation)์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

Weak Geneartional Hypothesis: ์•ฝํ•œ ์„ธ๋Œ€๋ณ„ ๊ฐ€์„ค

์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์˜ ๋Ÿฐํƒ€์ž„ ์ž‘์šฉ์„ ๊ด€์ฐฐํ•œ ๊ฒฐ๊ณผ ์•Œ๊ฒŒ ๋œ ๊ฒฝํ—˜ ์ง€์‹์ด๋‹ค.

JVM ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์˜ ์ด๋ก ์  ๊ทผ๊ฐ„์ด ๋œ๋‹ค.

  • ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๋Š” ์•„์ฃผ ์งง์€ ์‹œ๊ฐ„๋งŒ ์‚ด์•„์žˆ๊ณ , ๋‚˜๋จธ์ง€๋Š” ๊ธฐ๋Œ€ ์ˆ˜๋ช…์ด ํ›จ์”ฌ ๊ธธ๋‹ค.

  • ์˜ค๋ž˜๋œ ๊ฐ์ฒด์—์„œ ์ Š์€ ๊ฐ์ฒด๋กœ์˜ ์ฐธ์กฐ๋Š” ์•„์ฃผ ์ ๊ฒŒ ์กด์žฌํ•œ๋‹ค.

์ด ๋ฒ•์น™์˜ ๊ฒฐ๋ก ์€ ๊ฐ€๋น„์ง€๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ํž™์€ ๋นจ๋ฆฌ ์ฃฝ๋Š” ๊ฐ์ฒด๋“ค์€ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค๊ณ„๋˜์–ด์•ผ ํ•˜๊ณ , ์žฅ์ˆ˜ ๊ฐ์ฒด์™€ ๋‹จ๋ช… ๊ฐ์ฒด๋ฅผ ์™„์ „ํžˆ ๋–ผ์–ด ๋†“๋Š” ๊ฒŒ ์ข‹๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ ํ•ซ์ŠคํŒŸ(JVM)์€ ๋ช‡ ๊ฐ€์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‘์šฉํ•ด์„œ ์œ„ ๊ฐ€์„ค์„ ํ™œ์šฉํ•œ๋‹ค.

  • ํฌ๊ฒŒ 2๊ฐœ๋กœ ๋ฌผ๋ฆฌ์  ๊ณต๊ฐ„์„ ๋‚˜๋ˆˆ๋‹ค.

    • Young ์˜์—ญ(Yong Generation ์˜์—ญ): ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•œ ๊ฐ์ฒด์˜ ๋Œ€๋ถ€๋ถ„์ด ์—ฌ๊ธฐ์— ์œ„์น˜ํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๊ฐ€ ๊ธˆ๋ฐฉ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋งŽ์€ ๊ฐ์ฒด๊ฐ€ Young ์˜์—ญ์— ์ƒ์„ฑ๋˜์—ˆ๋‹ค๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค. ์ด ์˜์—ญ์—์„œ ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์งˆ๋•Œ Minor GC๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๋งํ•œ๋‹ค.

    • Old ์˜์—ญ(Old Generation ์˜์—ญ): ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ ์ƒํƒœ๋กœ ๋˜์ง€ ์•Š์•„ Young ์˜์—ญ์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์—ฌ๊ธฐ๋กœ ๋ณต์‚ฌ๋œ๋‹ค. ๋Œ€๋ถ€๋ถ„ Young ์˜์—ญ๋ณด๋‹ค ํฌ๊ฒŒ ํ• ๋‹นํ•˜๋ฉฐ, ํฌ๊ธฐ๊ฐ€ ํฐ ๋งŒํผ Young ์˜์—ญ๋ณด๋‹ค GC๋Š” ์ ๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค. ์ด ์˜์—ญ์—์„œ ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ Major GC(ํ˜น์€ Full GC)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๋งํ•œ๋‹ค.

    • ์ด ๋•Œ, Old ์˜์—ญ์ด Young ์˜์—ญ๋ณด๋‹ค ํฌ๊ฒŒ ํ• ๋‹น๋˜๋Š” ์ด์œ ๋Š” Young ์˜์—ญ์˜ ์ˆ˜๋ช…์ด ์งง์€ ๊ฐ์ฒด๋“ค์€ ํฐ ๊ณต๊ฐ„์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํฐ ๊ฐ์ฒด๋“ค์€ Young ์˜์—ญ์ด ์•„๋‹ˆ๋ผ ๋ฐ”๋กœ Old ์˜์—ญ์— ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ๊ฐ์ฒด๋งˆ๋‹ค generational count๋ฅผ ์„ผ๋‹ค: ๊ฐ์ฒด๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๋ฌด์‚ฌ ํ†ต๊ณผํ•œ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘ ํšŸ์ˆ˜

Hotspot JVM?

๋ฏธ๊ตญ์˜ Longview Technologies LLC๋ผ๋Š” ํšŒ์‚ฌ์—์„œ ์ฒ˜์Œ ๋ฐœํ‘œ๋œ JVM์ด๋‹ค. 1999๋…„์— ์ฒ˜์Œ ๋ฐœํ‘œ๋˜์—ˆ์œผ๋ฉฐ, ๋‹นํ•ด์—ฐ๋„์— SUN์— ์ธ์ˆ˜๋˜์–ด 1.3 ๋ฒ„์ „๋ถ€ํ„ฐ SUN์˜ ๊ธฐ๋ณธ JVM์œผ๋กœ ์ž๋ฆฌ ์žก๊ฒŒ ๋˜์—ˆ๋‹ค. Hotspot JVM์€ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ JVM ์ค‘ ํ•˜๋‚˜๋กœ์จ Windows, Linux, Max, Unix ์šด์˜์ฒด์ œ์—๋„ ๊ตฌ๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค. Hotspot JVM๊ณผ ์–‘๋Œ€์‚ฐ๋งฅ์„ ์ด๋ฃจ๋Š” JVM์€ IBM JVM์ด ์žˆ๋‹ค. WebSphere ๋“ฑ IBM ์†”๋ฃจ์…˜์—์„œ๋Š” IBM JVM์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ทธ ์™ธ ๋Œ€๋ถ€๋ถ„์˜ ์†”๋ฃจ์…˜์—์„œ๋Š” Hotspot JVM์„ ์‚ฌ์šฉํ•œ๋‹ค.

Card Table

Old ์˜์—ญ์— ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ Young ์˜์—ญ์˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์•„์ฃผ ์ ์ง€๋งŒ ์กด์žฌํ•  ๊ฒƒ์ด๋‹ค. ์ด ๋•Œ Young ์˜์—ญ์—์„œ Minor GC๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋ชจ๋“  Old ์˜์—ญ์— ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฒ€์‚ฌํ•ด์„œ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” Young ์˜์—ญ์˜ ๊ฐ์ฒด๋ฅผ ์ฐพ๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋‹ค.

๋”ฐ๋ผ์„œ ํ•ซ์ŠคํŒŸ์€ ์นด๋“œ ํ…Œ์ด๋ธ”์ด๋ผ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์— Old ๊ฐ์ฒด๊ฐ€ Young ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. ์นด๋“œ ํ…Œ์ด๋ธ”์€ JVM์ด ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ, ๊ฐ ์›์†Œ๋Š” Old ์˜์—ญ์˜ 512๋ฐ”์ดํŠธ ์˜์—ญ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์นด๋“œ ํ…Œ์ด๋ธ”์—๋Š” OId ์˜์—ญ์— ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ Young ์˜์—ญ์˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ๋•Œ๋งˆ๋‹ค ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค. Young ์˜์—ญ์˜ GC๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋Š” Old ์˜์˜์— ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š๊ณ , ์ด ์นด๋“œํ…Œ์ด๋ธ”๋งŒ ๋’ค์ ธ์„œ GC ๋Œ€์ƒ์ธ์ง€ ์‹๋ณ„ํ•œ๋‹ค.

Young ์˜์—ญ์˜ ๊ตฌ์„ฑ

young ์˜์—ญ์€ 3๊ฐœ์˜ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  • Eden ์˜์—ญ

  • Survivor ์˜์—ญ 2๊ฐœ

์ด ์˜์—ญ์˜ ์ฒ˜๋ฆฌ ์ ˆ์ฐจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. (Minor GC)

  1. ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๋Š” Eden ์˜์—ญ์— ์œ„์น˜ํ•œ๋‹ค.

  2. Eden ์˜์—ญ์—์„œ GC๊ฐ€ ํ•œ ๋ฒˆ ๋ฐœ์ƒํ•œ ํ›„ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” Survivor ์˜์—ญ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๋™๋œ๋‹ค.

  3. Eden ์˜์—ญ์—์„œ GC๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฏธ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” Survivor ์˜์—ญ(์œ„์˜ Survivor ์˜์—ญ)์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ๊ณ„์† ์Œ“์ธ๋‹ค.

  4. ํ•˜๋‚˜์˜ Survivor ์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋˜๋ฉด ๊ทธ ์ค‘์—์„œ ์‚ด์•„๋‚จ์€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ Survivor ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. (๋ฐฉ์ถœ) ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๋“ ์ฐฌ Survivor ์˜์—ญ์€ ์•„๋ฌด ๋ฐ์ดํ„ฐ๋„ ์—†๋Š” ์ƒํƒœ๋กœ ๋œ๋‹ค.

  5. ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ ๊ณ„์†ํ•ด์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” Old ์˜์—ญ์œผ๋กœ ์ด๋™(Promotion)ํ•˜๊ฒŒ ๋œ๋‹ค.

    Minor GC์—์„œ ๊ฐ์ฒด๊ฐ€ ์‚ด์•„๋‚จ์€ ํšŸ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋Š” age๋ฅผ Object Header์— ๊ฐ์ฒด์˜ ์ƒ์กดํšŸ์ˆ˜๋กœ ๊ธฐ๋กํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด age๋ฅผ ๋ณด๊ณ  Promotion ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

img

์ด ์ ˆ์ฐจ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด Survivor ์˜์—ญ ์ค‘ ํ•˜๋‚˜๋Š” ํ•ญ์ƒ ๋ฐ˜๋“œ์‹œ ๋น„์–ด ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค. ๋งŒ์•ฝ ๋‘ Survivor ์˜์—ญ์— ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ์‹œ์Šคํ…œ์ด ์ •์ƒ์ ์ธ ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

์ด ๋•Œ ํ•ซ์ŠคํŒŸ์—์„  ์ด ์ฒ˜๋ฆฌ ์ ˆ์ฐจ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ๊ธฐ์ˆ ์ด ์‚ฌ์šฉ๋œ๋‹ค.

bump-the-pointer

bump-the-pointer๋Š” Eden ์˜์—ญ์— ํ• ๋‹น๋œ ๋งˆ์ง€๋ง‰ ๊ฐ์ฒด๋ฅผ ์ถ”์ ํ•œ๋‹ค. ๋งˆ์ง€๋ง‰ ๊ฐ์ฒด๋Š” Eden ์˜์—ญ์˜ ๋งจ ์œ„์— ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋‹ค์Œ์— ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น ๊ฐ์ฒด์˜ ํฌ๊ธฐ๊ฐ€ Eden ์˜์—ญ์— ๋„ฃ๊ธฐ ์ ๋‹นํ•œ์ง€๋งŒ ํ™•์ธํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€๋œ ๊ฐ์ฒด๋งŒ ์ ๊ฒ€ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

TLABs(Thread-Local Allocation Buffers)

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„  ์–ด๋–จ๊นŒ? ๋งŒ์•ฝ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๋ฅผ Eden ์˜์—ญ์— ์ €์žฅํ•˜๋ ค๋ฉด, Eden ์˜์—ญ์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค ๋ฝ์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์„ฑ๋Šฅ์ด ๋งค์šฐ ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ํ•ซ์ŠคํŒŸ์—์„  TLABs๋ฅผ ์ด์šฉํ•ด ํ•ด๊ฒฐํ–ˆ๋‹ค.

ํ•ซ์ŠคํŒŸ์€ ์—๋ด์„ ์—ฌ๋Ÿฌ ๋ฒ„ํผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ Eden ์˜์—ญ์˜ ์ž‘์€ ๋ฉ์–ด๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•œ๋‹ค. ๊ฐ ์Šค๋ ˆ๋“œ์—๋Š” ์ž๊ธฐ๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” TLAB์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฝ ์—†์ด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•ซ์ŠคํŒŸ์€ TLAB ํฌ๊ธฐ๋ฅผ ๋™์ ์œผ๋กœ ์กฐ์ •ํ•ด์„œ ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์—„์ฒญ๋‚˜๊ฒŒ ์†Œ๋ชจํ•˜๊ณ  ์žˆ์œผ๋ฉด ๋” ํฐ TLAB๋ฅผ ๊ฑด๋„ค์ค€๋‹ค.

image-20230114171115301
JavaGarbage3
image-20230114171820560
  • VisualVM์—์„œ Visual GC ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‹ค์šด๋ฐ›์œผ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ณต๊ฐ„์„ ์œ„์ฒ˜๋Ÿผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ๋ก 

Eden ์˜์—ญ์— ์ตœ์ดˆ๋กœ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ , Survivor ์˜์—ญ์„ ํ†ตํ•ด์„œ Old ์˜์—ญ์œผ๋กœ ์˜ค๋ž˜ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์ด๋™ํ•œ๋‹ค!

Old ์˜์—ญ์— ๋Œ€ํ•œ GC (Major GC)

Old ์˜์—ญ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด GC๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. Young ์˜์—ญ์€ ์ผ๋ฐ˜์ ์œผ๋กœ Old ์˜์—ญ๋ณด๋‹ค ํฌ๊ธฐ๊ฐ€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— GC๊ฐ€ ๋ณดํ†ต 0.5~1์ดˆ ์‚ฌ์ด์— ๋๋‚œ๋‹ค. ๋”ฐ๋ผ์„œ Minor GC๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ Old ์˜์—ญ์€ Young ์˜์—ญ๋ณด๋‹ค ํฌ๋ฉฐ Young ์˜์—ญ์„ ์ฐธ์กฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ Major GC๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , 10๋ฐฐ ์ด์ƒ์˜ ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ด ๋•Œ GC ๋ฐฉ์‹์— ๋”ฐ๋ผ์„œ ์ฒ˜๋ฆฌ ์ ˆ์ฐจ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

  • Serial GC

    • ์šด์˜ ์„œ๋ฒ„์—์„œ ์ ˆ๋Œ€ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋ฐ์Šคํฌํ†ฑ์˜ GPU ์ฝ”์–ด๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ์‹์ด๋‹ค.

  • Parallel GC

  • ParallelOld GC

  • Concurrent Mark & Sweep GC(์ดํ•˜ CMS)

  • G1(Garbage First) GC

    • Java 9 ๋ฒ„์ „๋ถ€ํ„ฐ ๊ธฐ๋ณธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ

Serial GC

  • GC ๋ฐฉ์‹

    • Young ์˜์—ญ: ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฐฉ์‹ ์‚ฌ์šฉ

    • Old ์˜์—ญ: Mark-Sweep-Compact ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์ ์€ ๋ฉ”๋ชจ๋ฆฌ, CPU ์ฝ”์–ด ๊ฐœ์ˆ˜ ์ ์„ ๋•Œ ์ ํ•ฉ

java -XX:+UseSerialGC -jar Application.java

๋ณ‘๋ ฌ ์ˆ˜์ง‘๊ธฐ

  • ๋ณ‘๋ ฌ ์ˆ˜์ง‘๊ธฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋ชจ๋‘ ์ค‘๋‹จ์‹œํ‚จ ๋‹ค์Œ(STW), ๊ฐ€์šฉ CPU ์ฝ”์–ด๋ฅผ ์ด๋™์›ํ•ด ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค.

  1. Parallel GC (Throughput GC)

    Serial GC์™€ ๊ธฐ๋ณธ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ™๋‹ค. Serial GC๋Š” GC๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์ง€๋งŒ, Parallel GC๋Š” GC๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ Serial GC๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํ•˜๊ณ  ์ฝ”์–ด์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ ์œ ๋ฆฌํ•˜๋‹ค. ์˜ต์…˜์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ตœ๋Œ€ ์ง€์—ฐ ์‹œ๊ฐ„, GC๋ฅผ ์ˆ˜ํ–‰ํ•  ์“ฐ๋ ˆ๋“œ์˜ ๊ฐฏ์ˆ˜ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    java -XX:+UseParallelGC -jar Application.java
    
    // ์‚ฌ์šฉํ•  ์“ฐ๋ ˆ๋“œ์˜ ๊ฐฏ์ˆ˜
    -XX:ParallelGCThreads=<N>
    
    // ์ตœ๋Œ€ ์ง€์—ฐ ์‹œ๊ฐ„
    -XX:MaxGCPauseMillis=<N>

    Parallel GC๊ฐ€ GC์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ƒ๋‹นํžˆ ์ค„์—ฌ์ฃผ์—ˆ๊ณ , Java8๊นŒ์ง€ ๊ธฐ๋ณธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋กœ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ Application์ด ๋ฉˆ์ถ”๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์—†์—ˆ๊ณ , ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋” ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

  2. Parallel Old GC

    ์œ„ Parallel GC์™€ ๋น„๊ตํ•˜์—ฌ Old ์˜์—ญ์˜ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ๋‹ค๋ฅด๋‹ค. ์ด ๋ฐฉ์‹์€ Mark-Summary-Compaction ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค. Summary๋‹จ๊ณ„๋Š” ์•ž์„œ GC๋ฅผ ์ˆ˜ํ–‰ํ•œ ์˜์—ญ์— ๋Œ€ํ•ด์„œ ๋ณ„๋„๋กœ ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•œ๋‹ค๋Š” ์ ์—์„œ Sweep ๋‹จ๊ณ„์™€ ๋‹ค๋ฅด๋‹ค.

GMC(Concurrent Mark Sweep) GC

CMS GC๋Š” Parallel GC์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ์กด์˜ Serial/Parallel GC์™€๋Š” ๋‹ค๋ฅด๊ฒŒ Mark Sweep ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ Concurrentํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•œ๋‹ค.

CMS GC๊ฐ€ ์ˆ˜ํ–‰๋  ๋•Œ๋Š” ์ž์›์ด GC๋ฅผ ์œ„ํ•ด์„œ๋„ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์‘๋‹ต์ด ๋Š๋ ค์งˆ ์ˆœ ์žˆ์ง€๋งŒ ์‘๋‹ต์ด ๋ฉˆ์ถ”์ง€๋Š” ์•Š๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ GC ๋ฐฉ์‹๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ, CPU๋ฅผ ๋” ๋งŽ์ด ํ•„์š”๋กœ ํ•˜๊ณ  Compaction ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์žฅ๊ธฐ์ ์œผ๋กœ ์šด์˜๋˜๋‹ค๊ฐ€ ์กฐ๊ฐ๋‚œ ๋ฉ”๋ชจ๋ฆฌ๋“ค์ด ๋งŽ์•„(memory fragmentation) compation ๋‹จ๊ณ„๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด Stop The World ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

// deprecated in java9 and finally dropped in java14
java -XX:+UseConcMarkSweepGC -jar Application.java

G1(Garbage First) GC

์ž๋ฐ” ์ˆ˜์ง‘๊ธฐ๋Š” ์ด ๋•Œ๊นŒ์ง€ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ํž™์„ Young/Old ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ ์„œ ๊ด€๋ฆฌํ–ˆ๋Š”๋ฐ, G1์€ ํž™์„ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ์‹ ์ž์ฒด๊ฐ€ ์™„์ „ํžˆ ๋‹ค๋ฅด๋‹ค. G1 GC๋Š” Eden ์˜์—ญ์— ํ• ๋‹นํ•˜๊ณ , Survivor๋กœ ์นดํ”ผํ•˜๋Š” ๊ณผ์ •์€ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋‚˜๋ˆ„์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  Region์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋„์ž…ํ•ด์„œ Heap์„ ๊ท ๋“ฑํ•˜๊ฒŒ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ง€์—ญ์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ์ง€์—ญ์„ ์—ญํ• ๊ณผ ํ•จ๊ป˜ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

Region์— Humonogous์™€ Available/Unused๋ผ๋Š” 2๊ฐ€์ง€ ์—ญํ• ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

  • Humonogous: Region ํฌ๊ธฐ์˜ 50%๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” Region

  • Available/Unused: ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” Region

G1 GC์˜ ํ•ต์‹ฌ์€ Heap์„ ๋™์ผํ•œ ํฌ๊ธฐ์˜ Region์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ€๋น„์ง€๊ฐ€ ๋งŽ์€ region์— ๋Œ€ํ•ด ์šฐ์„ ์ ์œผ๋กœ GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

G1 GC๋„ ๋‹ค๋ฅธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 2๊ฐ€์ง€ GC๋กœ ๋‚˜๋ˆ„์–ด ์ˆ˜ํ–‰๋œ๋‹ค.

Minor GC

ํ•œ ์ง€์—ญ์— ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๋‹ค๊ฐ€ ํ•ด๋‹น ์ง€์—ญ์ด ๊ฝ‰ ์ฐจ๋ฉด ๋‹ค๋ฅธ ์ง€์—ญ์— ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๊ณ , Minor GC๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค. ์ด ๋•Œ ๊ฐ€๋น„์ง€๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์ง€์—ญ์„ ์ฐพ์•„์„œ Mark and Sweep์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Eden ์ง€์—ญ์—์„œ GC๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด Mark and Sweep์„ ์ˆ˜ํ–‰ ํ›„ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ์ง€์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ๋ณต์ œ๋˜๋Š” ์ง€์—ญ์ด Avaiable/Unused ์ง€์—ญ์ด๋ฉด ํ•ด๋‹น ์ง€์—ญ์€ ์ด์ œ Survivor ์˜์—ญ์ด ๋˜๊ณ , Eden ์˜์—ญ์€ Available/Unused ์ง€์—ญ์ด ๋œ๋‹ค.

Major GC(Full GC)

์‹œ์Šคํ…œ์ด ๊ณ„์† ์šด์˜๋˜๋‹ค๊ฐ€ ๊ฐ์ฒด๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„ ๋น ๋ฅด๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•  ์ˆ˜ ์—†์„ ๋•Œ Major GC๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

๊ธฐ์กด์˜ ๋‹ค๋ฅธ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ชจ๋“  Heap ์˜์—ญ์—์„œ GC๊ฐ€ ์ˆ˜ํ–‰๋˜์–ด ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ธ์ง€๋งŒ, G1 GC๋Š” ์–ด๋Š ์˜์—ญ์— ๊ฐ€๋น„์ง€๊ฐ€ ๋งŽ์€ ์ง€๋ฅผ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— GC๋ฅผ ์ˆ˜ํ–‰ํ•  ์ง€์—ญ์„ ์กฐํ•ฉํ•ด์„œ GC๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ด๋Ÿฌํ•œ ์ž‘์—…์ด Concurrentํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง€์—ฐ๋„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Concurrent: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ์™€ ๋™์‹œ์— ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ

G1 GC๋Š” ๋‹ค๋ฅธ GC ๋ฐฉ์‹์— ๋น„ํ•ด ์žฆ๊ฒŒ ํ˜ธ์ถœ๋˜๊ฒ ์ง€๋งŒ, ์ž‘์€ ๊ทœ๋ชจ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ ์ž‘์—… + Concurrentํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ์ง€์—ฐ์ด ํฌ์ง€ ์•Š๊ณ , ๊ฐ€๋น„์ง€๊ฐ€ ๋งŽ์€ ์ง€์—ญ์„ ์•Œ๊ณ  ์žˆ์–ด ํ•ด๋‹น ์ง€์—ญ์— ๋Œ€ํ•ด ์ •๋ฆฌ๋ฅผ ํ•˜๋ฏ€๋กœ ํ›จ์”ฌ ํšจ์œจ์ ์ด๋‹ค.

java -XX:+UseG1GC -jar Application.java

G1 GC๋Š” GC ๋ฐฉ์‹ ์ค‘์— ๊ฐ€์žฅ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ  ํฐ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์—์„œ ๋ฉ€ํ‹ฐ ํ”„๋กœ๋ ˆ์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์šด์˜๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ Java9๋ถ€ํ„ฐ ๊ธฐ๋ณธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋กœ ์‚ฌ์šฉ๋˜๊ฒŒ ๋˜์—ˆ๋‹ค.


์ฐธ๊ณ 

  • https://github.com/GimunLee/tech-refrigerator/blob/master/Language/JAVA/Garbage%20Collection.md#garbage-collection

  • https://d2.naver.com/helloworld/1329

  • https://mangkyu.tistory.com/118

  • https://wookoa.tistory.com/169

  • https://cyk0825.tistory.com/88?category=1124085

  • http://www.yes24.com/Product/Goods/72161685

Last updated