โ๐ป ๋ค์ด๊ฐ๋ฉฐ..
๊ธฐ์กด์๋ ์ฑ ๋ด์ฉ์ ๊ทธ๋๋ก ์์ฑํ๊ณ (๊ฑฐ์ ํ์ฌ์์ค,,) ๋ ์์ ์ด ์ดํดํ๊ธฐ ์ํด์ ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํ๋ค๋ฉด, ์ด์ ๋ ๋จ์๊ฒ ์ค๋ช ํ๋ฏ์ด ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํ๋ ค ํฉ๋๋ค. ์ด์ ๊ธ๋ค๊ณผ ์์ ๋ฐฉ์์ด ๋ค๋ฅผ ์ ์์ต๋๋ค.
GC๋
์ฐ๋ฆฌ๋ Java ํ๋ก๊ทธ๋๋ฐ์ ํ๋ฉด์ new
๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ด ๋ new
๊ฐ ๋ถ์ ๊ฐ์ฒด๋ Heap ์์ญ์ ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํด์ค๋๋ค. ์ด๋ ๊ฒ ๋์ ์ผ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ํด์ ๋์ด์ผ ํฉ๋๋ค. ํด์ ํ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ํด์ ์ ์ ํ๊ณ ์์ผ๋ฏ๋ก OutOfMemmory Exception
์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ๋์ ์ผ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ฃผ๋ ์์ ์ ํ๋ ๊ฒ์ด GC์ ๋๋ค. ์ ๋ฆฌํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
GC๋ Garbage Collection(์ดํ GC)์ ์ฝ์๋ก ๋ ์ด์ ์ฌ์ฉํ์ง ์๋(์ฐ๋ ๊ธฐ) ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ง์ฐ๋ ์์ ์ ํ๋ค.
Java๋ GC๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํด์ค๋๋ค. ๋ง์ฝ GC๊ฐ ์์๋ค๋ฉด ๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฒดํฌํ๊ณ ๋ฐํํ๋ ์ผ์ ์ํํด์ผ ํฉ๋๋ค.
์๊ฐ๋ง ํด๋ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค. ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค๋ ๊ฒ์ด ์ด๋ค ๊ด์ ์์ ๋ณด๋ฉด ๋นํจ์จ์ ์ด์ด ๋ณด์ผ ์๋ ์์ง๋ง, ๊ฐ๋ฐ์ ์ ์ฅ์์ ๊ฐ๋ฐ์ ์ง์คํ ์ ์๋ ํ๊ฒฝ์ ๋ง๋ค์ด ์ค๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๐ก Java์์๋ GC๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ ํธ์ถํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค. ๋ฐ๋ก System.gc() ๋ฉ์๋ ์ ๋๋ค. ํ์ง๋ง ํด๋น ๋ฉ์๋๋ ์์คํ ์ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก ์ ๋ ํธ์ถํด์๋ ์๋ฉ๋๋ค. ๊ทธ๋ฅ GC๊ฐ ์์์ ๋์ํ๋๋ก ๋๋๋ ๊ฒ์ด ์ ์ผ ๋ฒ ์คํธ์ ๋๋ค.
Stop-the-world
stop-the-world๋, GC๋ฅผ ์คํํ๊ธฐ ์ํด JVM์ด ์ดํ๋ฆฌ์ผ์ด์
์ ์คํ์ ๋ฉ์ถ๋ ๊ฒ ์
๋๋ค. GC๋ฅผ ์ํํ๋ ๋ฉ์๋๋ฅผ ์ ์ธํ ๋ชจ๋ ์ฐ๋ ๋๊ฐ ์ผ์์ ์ผ๋ก ์ ์ง๋๋ฉฐ, GC๊ฐ ๋๋ ๋ค์์ผ ์ ์ง๋๋ ์ฐ๋ ๋๊ฐ ์ ์์ ์ผ๋ก ๋์ํฉ๋๋ค.
์ด๋ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ GC๋ฅผ ์ํํ๋ Stop-and-world ์ํ๋ฅผ ๋ง์ดํ๊ฒ ๋ฉ๋๋ค. GC ํ๋์ด๋ผํ๋ฉด ์ด์ ๊ฐ์ ์ฐ๋ ๋์ ์์ ์ด ๋ฉ์ถ๋ ์๊ฐ(Stop-and-world)์ ์ต์ํ์ผ๋ก ์ค์ด๋ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
Reachability
Java ์ GC๋ Reachability
์ ๊ฐ๋
์ ์์์ผํฉ๋๋ค. ์ด๋ ํ ๊ฐ์ฒด์ ์ ํจํ ์ฐธ์กฐ๊ฐ ์๋ค๋ฉด reachable
์ด๋ผํ๊ณ , ์ ํจํ ์ฐธ์กฐ๊ฐ ์๋ค๋ฉด unreachable
์ด๋ผ ํฉ๋๋ค.
GC์๋ GC root๊ฐ ์กด์ฌํฉ๋๋ค. GC root๋ ๋ง ๊ทธ๋๋ก GC์ ๋ฟ๋ฆฌ๋ผ๊ณ ์ดํดํ๋ฉด ๋ฉ๋๋ค.
โ GC root๊ฐ ๋๋ ์กฐ๊ฑด
1. stack ์์ญ์ ๋ฐ์ดํฐ(์ง์ญ๋ณ์, ํ๋ผ๋ฏธํฐ ๋ฑ)
2. method ์์ญ์ static ๋ฐ์ดํฐ
3. ์คํ์ค์ธ ์ฐ๋ ๋
4. JNI (Java Native Interface)์ ์ํด ์์ฑ๋ ๊ฐ์ฒด
์์ ์ฌ์ง์์ ๋ณด์ด๋ ๊ฒ ์ฒ๋ผ GC Root์ ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๋ reachable
๊ทธ ์ธ๋ unreachable
์ด๋ผ๊ณ ํฉ๋๋ค. ์๋์ ๊ทธ๋ฆผ์ ํตํด ์ดํด๋ฅผ ๋์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์์ ์ฌ์ง์์ 1,3,4,5 ๋ reachable
ํ ์ํ์
๋๋ค.
- 1,5 ๋ Stack ์์ญ์ ์๋ 6, 7์ ์ฐธ์กฐํ๊ณ ์์ต๋๋ค.
- 3 ์ Method Area ์์ญ์ ์๋ 8์ ์ฐธ์กฐํ๊ณ ์์ต๋๋ค.
- 4 ๋ 7์ ์ฐธ์กฐํ๊ณ ์๋ 5๋ฅผ ์ฐธ์กฐํ๊ณ ์์ต๋๋ค.
unreachable
ํ 2 ๋ ์๋ฌด๊ฒ๋ ์ฐธ์กฐํ๊ณ ์์ง ์์ต๋๋ค. ์ฆ, GC์ ์๊ฑฐ ๋์์ด ๋ฉ๋๋ค.
๐คทโ๏ธ ๊ทธ๋ผ GC์ ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ ์ํด ๋์ํ์ง?
๋ฐ๋ก Mark and Sweep
์ด๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋์ํฉ๋๋ค.
GC root์์ ์์ํ์ฌ root๊ฐ ์ฐธ์กฐํ๋ ๋ชจ๋ ๊ฐ์ฒด ๋๋ ๊ทธ ๊ฐ์ฒด๋ค์ด ์ฐธ์กฐํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ํ์ํ๋ฉฐ ๋งํฌ(Mark)ํฉ๋๋ค. ์ด ๊ณผ์ ์ด Mark and Sweep
์๊ณ ๋ฆฌ์ฆ์ Mark
์ ํด๋นํฉ๋๋ค.
[์ฐธ์กฐ๋ ๊ฐ์ฒด : ํ๋์ / ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด : ๋
ธ๋์]
Mark
๊ฐ ๋๋๋ฉด GC๋ ๋งํฌ(Mark)๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ค์ ํด์ ํฉ๋๋ค. ์ด ๊ณผ์ ์ Sweep
์ด๋ผ๊ณ ํฉ๋๋ค.
[์ฐธ์กฐ๋๊ณ ์์ง ์์ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ ํ์ ๊ทธ๋ฆผ์
๋๋ค. ]
Mark and Sweep
์๊ณ ๋ฆฌ์ฆ ๋ฟ๋ง ์๋๋ผ compact
๋ผ๋ ์๊ณ ๋ฆฌ์ฆ๋ ์์ต๋๋ค. compact
๋ Mark and Sweep
๊ณผ์ ์ ๊ฑฐ์น๊ณ ๋๋ฉด Mark ๋์ง ์์ ๊ฐ์ฒด๋ค๋ง ๋จ์์์ ๊ฒ ์
๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ฐ์ฒด๋ค์ด ๋ฌ์ฑ๋ฌ์ฑ ์กด์ฌํ๊ฒ ์ฃ ? ์ด๋ฌํ ๊ฐ์ฒด๋ค์ ์์ถ, ์ฆ ํ ๊ณณ์ผ๋ก ๋ชจ์์ ๋ฉ๋ชจ๋ฆฌ ๋จํธํ๋ฅผ ๋ง์ต๋๋ค. compact
๊ณผ์ ์ ํตํด ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์ฝ๊ณ , ๋นจ๋ผ์ง๋๋ก ํฉ๋๋ค.
[Sweep ๊ณผ์ ํ ๋ฌ์ฑ๋ฌ์ฑ ์กด์ฌํ๋ ์ฐธ์กฐ๋ ๊ฐ์ฒด ์์ถํ ๋ชจ์ต]
๐ ๊ทธ๋์ ์ ์๊ณ ๋ฆฌ์ฆ์ด ์ธ์ ๋์ํ๋๋ฐ?
GC๋ Heap ์์ญ์ ๋์ ์ผ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์ค ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์ ํด์ค๋ค๊ณ ํ์ต๋๋ค.
Heap ์์ญ์ ๋ํด ์์๋ณด๋๋ก ํ์ฃ . Heap ์์ญ์ ์๋์ ์ฌ์ง๊ณผ ๊ฐ์ด ๋๋ฉ๋๋ค.
- Young Generation : ์ ์ ๊ฐ์ฒด
- eden : ๊ฐ์ฒด๋ฅผ ์์ฑํ์๋ง์ ์ ์ฅ๋๋ ์ฅ์
- Survivor Space 0 : ๊ฐ์์ 0
- Survivor Space 1 : ๊ฐ์์ 2
- Old Generation : ์ค๋๋ ๊ฐ์ฒด
- Parameter Generation
ํฌ๊ฒ Young Generation
, Old Generation
, Parameter Generation
์ผ๋ก ๋๋๋ฉฐ Young Generation
์ eden
, Survivor Space 0
, Survivor Space 1
๋ก ๋ ๋๋ฉ๋๋ค.
Heap ์์ญ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ๋๋๋์ง ์ดํด๋ดค์ผ๋ ์ด์ Heap ์์ญ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ GC๊ฐ ์ผ์ด๋๋ ๊ณผ์ ์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ์๋ง์ ์ ์ฅ๋๋ ์ฅ์๋ Eden ์์ญ์ ๋๋ค.
- Eden ์์ญ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค.
- Eden ์์ญ์ด ๊ฝ ์ฐจ๋ฉด Minor GC(๋ง์ด๋ GC)๊ฐ ๋ฐ์(Mark-and-Sweep)ํฉ๋๋ค.
- ์ด์์๋ ๊ฐ์ฒด๋ง Survivor 0 ์์ญ์ผ๋ก ๋ณต์ฌ๋๊ณ ,
๋ค์ Eden ์์ญ์ ์ฑ์ฐ๊ฒ ๋ฉ๋๋ค.
- Survivor 0 ์์ญ์ด ๊ฝ ์ฐจ๊ฒ ๋๋ฉด Survivor 1 ์์ญ์ผ๋ก ๊ฐ์ฒด๊ฐ ๋ณต์ฌ๋ฉ๋๋ค.
์ด ๋, Eden ์์ญ์ ์๋ ๊ฐ์ฒด๋ค ์ค ์ด์์๋ ๊ฐ์ฒด๋ค๋ Survivor 1 ์์ญ์ผ๋ก ๊ฐ๋๋ค. ์ฆ, Survivor 0 ๋๋ 1 ๋ ์ค ํ๋๋ ๋ฐ๋์ ๋น์์ ธ ์์ด์ผ ํฉ๋๋ค.
- 1~4๊ฐ ๋ฐ๋ณต๋ ๋๋ง๋ค ์ด์์๋ ๊ฐ์ฒด๋ age๊ฐ์ด ์ฆ๊ฐํฉ๋๋ค.
์ผ์ ์์ค์ age๊ฐ์ ๋๋ฌํ๋ฉด Young Generation์์ Old Generation์ผ๋ก ์ด๋ํฉ๋๋ค.
- 1~5๊ฐ ๋ฐ๋ณตํ๋ค๋ณด๋ฉด Old Generation๋ ๊ฝ ์ฐจ๊ฒ ๋ฉ๋๋ค. ์ด ๋ major GC(๋ฉ์ด์ GC) ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. (Full GC ๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.)
์์ ๊ณผ์ ์ ์ฌ์ง์ ํตํด ์ดํดํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์์ ์ฌ์ง์ 1~4 ๊น์ง์ ๊ณผ์ ์ ๋๋ค. ์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉฐ ์ค๋๋ ๊ฐ์ฒด(age๊ฐ์ผ๋ก ํ๋จ)๋ Old Generation์ผ๋ก ์ด๋ํ๊ฒ ๋ฉ๋๋ค. (์๋์ ์ฌ์ง ์ฐธ๊ณ )
๊ทธ๋ ๊ฒ Old Generation๊น์ง ๊ฝ์ฐจ๋ฉด ๋ฉ์ด์ GC๊ฐ ๋ฐ์ํ๊ฒ ๋๋ ๊ฒ ์ ๋๋ค.
๐ก minor GC vs major GC ๋๊ฐ ๋ ๋น ๋ฅผ๊น?
--> ๋ต์ minor GC!!
์ด์ ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ ์์ ๊ณต๊ฐ์ด ํ ๋น๋๊ณ , ๊ฐ์ฒด๋ค์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์๋ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์
๋๋ค.
๐คทโ๏ธ ์ GC๋ฅผ ๋๋๋์..
๊ทธ๋ฅ ํ ๋ฒ์ GC๋ฅผ ์งํํ๋ฉด ๋ ๊ฒ์ ์ ๋๋์์๊น์?
GC ์ค๊ณ์๋ค์ ๋ ๊ฐ์ง์ ๊ฐ์ค์ ์ ์ฌํ๊ณ GC๋ฅผ ๋ง๋ค์์ต๋๋ค.
- ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ๊ธ๋ฐฉ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ ์ํ(unreachable)๊ฐ ๋๋ค. ์ฆ, ๊ธ๋ฐฉ garbage๊ฐ ๋๋ค.
- ์ค๋๋ ๊ฐ์ฒด์์ ์ ์ ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ์์ฃผ ์ ๊ฒ ์กด์ฌํ๋ค.
๊ทธ๋ฆฌ๊ณ , oracle ์ฌ์ดํธ์ ์๋ GC์ ๊ธฐ๋ณธ์ฌํญ์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ํ์ ธ ์์ต๋๋ค.
JVM์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ํ์ํ๊ณ ์์ถํด์ผ ํ๋ ๊ฒ์ ๋นํจ์จ์ ์ ๋๋ค. ๋ ๋ง์ ๊ฐ์ฒด๊ฐ ํ ๋น๋จ์ ๋ฐ๋ผ ๊ฐ์ฒด ๋ชฉ๋ก์ด ๋์ด๋๊ณ ๊ฐ๋น์ง ์์ง ์๊ฐ์ด ์ ์ ๋ ๊ธธ์ด์ง๋๋ค. ๊ทธ๋ฌ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํ ๊ฒฝํ์ ๋ถ์์ ๋ฐ๋ฅด๋ฉด ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ์๋ช ์ด ์งง์ต๋๋ค.
์์ ์ด๋ ค์ด ๋ด์ฉ์ ํ ์ค๋ก ์์ฝํ์๋ฉด, ๊ธ๋ฐฉ garbage๊ฐ ๋์ด์ GC์ ๋์์ด ๋๋ ํ ๋ฒ์ ํ๋ ๊ฒ ๋ณด๋ค ์ธ๋๋ณ๋ก ๋๋์ด์ GC๋ฅผ ์ํํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ด๋ผ๋ ๋ง ์ ๋๋ค.
์ด๋ฒ ๊ธ์์ GC์ ์ข ๋ฅ๊น์ง ๋ค๋ฃฐ ์๊ฐ์ด์์ง๋ง, ์๊ฐ๋ณด๋ค ๊ธ์ด ๊ธธ์ด์ ธ GC์ ์ข ๋ฅ์ ๋ํด์๋ ๋ค์ ๊ธ์์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
๋ง์ง๋ง ํ๋ง๋..
๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ ๋ฒ์ ์์ฃผ ์ฌ์์์์ง ์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค๋ฅธ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ๋ ๊ฒ ๋ณด๋ค ๊ณต์๋ฌธ์๋ฅผ ๋ณด๊ณ ์ดํดํ๋ ๊ฒ์ด ๋ ์ฌ์ ์ต๋๋ค. ๋ฌผ๋ก ์ ํ๋ธ๋ฅผ ๋ณด๋ฉฐ ์ดํด๋ฅผ ๋์์ต๋๋ค ใ ใ
References
'Language > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] JPA์ ์์์ฑ ์ปจํ ์คํธ๋? (0) | 2022.06.25 |
---|---|
[Java] MyBatis ์ JPA ์ ์ฐจ์ด (0) | 2022.02.14 |
๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๋ ์์น (SOLID) (0) | 2021.09.27 |
[Java] ์๋ฐ๊ฐ ํ์ฅํ ๊ฐ์ฒด ์งํฅ (2) (0) | 2021.09.27 |
[Java] ์๋ฐ๊ฐ ํ์ฅํ ๊ฐ์ฒด ์งํฅ (1) (0) | 2021.09.27 |
๋๊ธ