Execution Engine
JVM์ Heap ์์ญ
Garbage Collection(GC)
javac๊ฐ ์ปดํ์ผํ ๋ฐ์ดํธ์ฝ๋๋ฅผ Class Loader๋ฅผ ์ด์ฉํด Runtime Data Area์ ์คํ๊ฐ๋ฅํ ์ํ๋ก ์ ์ฌํ๋ค. ์ด ๋ Execution Engine(์คํ ์์ง)
์ Runtime Data Area์ ์ ์ฌ๋ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ๋ ์ญํ ์ ์ํํ๋ค.
Execution Engine์ ๊ตฌ์ฑ ์์
Execution Engine์ Interpreter
, JIT(Just-In-Time) Compiler
, Garbage Collector
๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
-
Interpreter
๋ฐ์ดํธ์ฝ๋๋ฅผ ๊ธฐ๊ณ๊ฐ ์ดํดํ ์ ์๋ Native Code๋ก ๋ณํํ๋ ์์ ์ ์ํํ๋ค. ๋ฐ์ดํธ์ฝ๋์ ๋ํ ํด์์ ๊ธฐ๋ณธ์ ์ผ๋ก Interpreter ๋ฐฉ์์ผ๋ก ์งํ๋๋ค.
- ๋ฐ์ดํธ์ฝ๋๋ฅผ ํ ์ค ์ฉ ์ฝ์ด์ ํด์ํ๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ๋๋ฆฌ๋ค.
- Interpreter๋ ์ค๋ณต๋ ๋ฐ์ดํธ์ฝ๋์ ๋ํด์๋ ๋ณํ ์์ ์ ์ํํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๋ค. ๋ฐ๋ผ์ ์ค๋ณต๋ ๋ฐ์ดํธ์ฝ๋์ ๋ํด์๋ JIT Compiler๋ฅผ ์ฌ์ฉํ๋ค
-
JIT Compiler
Interpreter์ ํจ์จ์ ๋ํ๊ธฐ ์ํด์ JVM์ด ์ผ์ ์์ค ์ด์์ผ๋ก ๋ฐ๋ณต๋์ด ๋ํ๋๋ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ๋ฉด JIT Compiler์ ์ํด ๋ฐ๋ณต๋ ์ฝ๋๋ค์ ํ๋ฒ์ Native Code๋ก ๋ณํํ๋ค.
-
๋ฐ์ดํธ์ฝ๋์์
foo()
๋ฉ์๋๊ฐ ์ฌ๋ฌ๋ฒ ์ค๋ณต๋๋ฉด, JIT Compiler๊ฐfoo()
๋ฉ์๋๋ฅผ Native Code๋ก ๋ณํํ๋ค.Native Code๋ ์บ์์ ๋ณด๊ด๋๊ธฐ ๋๋ฌธ์ JIT Compiler๊ฐ ํ๋ฒ ์ปดํ์ผ ํด๋๋ฉด ๋น ๋ฅด๊ฒ ์ํ๋๋ค
-
JIT Comple ๊ณผ์ ์ Interpreter ๋ฐฉ์๋ณด๋ค ์ค๋๊ฑธ๋ฆฐ๋ค.
๋ฐ๋ผ์ ํ๋ฒ๋ง ์คํ๋๋ ์ฝ๋์ ๊ฒฝ์ฐ Interpreter ๋ฐฉ์์ ์ฌ์ฉํ๊ณ , ์ฌ๋ฌ๋ฒ ์คํ๋๋ ์ฝ๋๋ JIT Compiler ๋ฐฉ์์ ์ฌ์ฉํ๋๊ฒ ๋ฐ๋์งํ๋ค
-
-
Garbage Collector
Runtime Data Area์ Heap ์์ญ์์ ๋ ์ด์ ์ฐธ์กฐ๋์ง ์๋ Unreachable ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ์ญํ ์ ์ํํ๋ค.
Heap์ ๊ตฌ์ฑ๊ณผ GC ๋ฐฉ์์ JVM vendor(๊ณต๊ธ ์ ์ฒด)์ ์ฌ๋์ด๋ค. ์์ผ๋ก ์ธ๊ธํ๋ JVM์ Heap๊ณผ GC ๋ฐฉ์์ Oracle Vendor์ HotSpot JVM๊ณผ GC ๋ฐฉ์์ด๋ค.
JVM์ Heap ์์ญ
JVM์ด ์ด์์ฒด์ ๋ก๋ถํฐ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ธ Runtime Data Area
์ Heap
์์ญ์ด ์กด์ฌํ๋ค.
Heap์์ญ์ JVM์ด ๊ด๋ฆฌํ๋ ํ๋ก๊ทธ๋จ ์์์ ์ธ์คํด์ค/๊ฐ์ฒด๊ฐ ๋์ (new)์ผ๋ก ํ ๋น๋๋ ์์ญ์ด๋ค. ์ด๋ ๊ฒ Heap ์์ญ์ ์์ฑ๋๋ ์ธ์คํด์ค๋ Stack ์์ญ์ ๋ณ์/๊ฐ์ฒด์ ์ํด ์ฐธ์กฐ๋๋ค.
์ธ์คํด์ค ์์ฑ ์ ์ผ์ด๋๋ ๊ณผ์
- ์์ฑํ๋ ค ํ๋ Class Object๊ฐ Heap์ ์กด์ฌํ๋์ง ํ์ธํ๋ค
- ์๋ค๋ฉด, Class Object๋ฅผ Heap์ ์์ฑํ๊ณ ํด๋น Class์ ๋ํ Data(Class Data)๋ฅผ Method Area์ ์ ์ฅํ๋ค
- ์ด ํ JVM์ ํด๋น Class Object์ ์๋ก์ด ์ธ์คํด์ค(Object)๋ฅผ Heap์ ์์ฑํ๊ณ , Method Area์ Class Data๋ฅผ ๊ฐ๋ฆฌํจ๋ค
- (Heap์ ํด๋น Class Object๊ฐ ์กด์ฌํ๊ณ Method Area ์์ญ์ Class Data๊ฐ ์กด์ฌํ๋ ์ํฉ์์) ํด๋น Class Object์ ์๋ก์ด ์ธ์คํด์ค๊ฐ ์์ฑํ๋ค๋ฉด, Heap์ ํด๋น Class Object์ ์๋ก์ด ์ธ์คํด์ค(Object)๋ง ์์ฑ์ํจ๋ค.
GC๊ฐ ์ ํ์ํ ๊น?
Java๋ ์ฝ๋์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํ ๋ฟ ์ด๋ฅผ ํด์ ํ์ง ์๋๋ค. ๋ฐ๋ผ์ Garbage Collector๊ฐ ๋์ด์ ํ์์๋(Unreachable) ์ฐ๋ ๊ธฐ(Garbage) ๊ฐ์ฒด๋ฅผ ์ฐพ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ฃผ๋ Garbage Collection ์์ ์ด ํ์ํ๋ค
-
๊ฐ๋ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ช ์์ ์ผ๋ก ํด์ ํ๊ธฐ ์ํด ๊ฐ์ฒด๋ฅผ null๋ก ์ง์ ํ๊ฑฐ๋
System.gc()
๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ๋ํ๋ค.๊ฐ์ฒด๋ฅผ null๋ก ์ง์ ํ๋ ๊ฒ์ ํฐ ๋ฌธ์ ๊ฐ ์๋์ง๋ง,
System.gc()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์์คํ ์ฑ๋ฅ์ ๋งค์ฐ ํฐ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ์ ๋๋ก ์ฌ์ฉํ๋ฉด ์๋๋ค.
์์ ์ ์ฐธ์กฐํ๋ ๋ณ์/๊ฐ์ฒด๊ฐ ์๋ค๋ฉด(Unreachable ํ๋ค๋ฉด) โ Garbage Collection(GC)์ ๋์
Heap ์์ญ์ ์์ฑ๋ ์ธ์คํด์ค/๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๋ค๋ฅธ ๋ณ์/๊ฐ์ฒด๊ฐ ์๋ค๋ฉด Garbage Collector๊ฐ ํด๋น ์ธ์คํด์ค/๊ฐ์ฒด๋ฅผ Heap ์์ญ์์ ์ญ์ ํ๋ค. ์ด๋ฅผ Garbage Collection
(GC) ์ด๋ผ ํ๋ค.
String a = "https";
a += "www.example.com";
"https"
์ด๋ผ๋ String ๊ฐ์ฒด๋ Heap ์์ญ์ ์์ฑ๋์์ง๋ง +=
์ฐ์ฐ์ด ์คํ๋๋ฉด์ ๋์ด์ a๋ณ์์ ์ฐธ์กฐ๋ฅผ ๋ฐ์ง ์๋๋ค. "https"
์ฒ๋ผ ๋์ด์ ์ฐธ์กฐ๋ฅผ ๋ฐ์ง ์๋ ๊ฐ์ฒด๋ฅผ Unreachable ๊ฐ์ฒด
๋ผ๊ณ ๋ถ๋ฅธ๋ค.
stop-the-world
stop-the-world
๋ GC๋ฅผ ์คํํ๊ธฐ ์ํด JVM์ด ์ดํ๋ฆฌ์ผ์ด์
์คํ์ ๋ฉ์ถ๋ ๊ฒ์ ๋งํ๋ค. ์ฆ, GC๋ฅผ ์คํํ๋ ์ฐ๋ ๋๋ฅผ ์ ์ธํ ๋๋จธ์ง ์ฐ๋ ๋์ ์์
์ ๋ฉ์ถ๋ ๊ฒ์ด๋ค.
- GC ์์ ์ด ์๋ฃ๋ ์ดํ์์ผ ์ค๋จํ๋ ์์ ์ ๋ค์ ์์ํ๋ค.
- GC ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ, ๋ชจ๋ stop-the-world๊ฐ ๋ฐ์ํ๋ค. stop-the-world ์๊ฐ์ GC ํ๋์ ํตํด ์ค์ผ ์ ์๋ค.
GC๊ฐ ๋ฐ์ํ๋ ์์ญ โ Heap์
Young Generation ์์ญ
,Old Generation ์์ญ
***Weak Generational Hypothesis
์ ์ ์กฐ๊ฑด์ ๋ฐํ์ผ๋ก GC๊ฐ ๋ฐ์ํ๋ ์์ญ์ 2๊ฐ์ ๋ฌผ๋ฆฌ์ ๊ณต๊ฐ(Young, Old Generation ์์ญ)์ผ๋ก ๋๋์๋ค.***
Weak Generational Hypothesis
์ ์ ์กฐ๊ฑด์ด๋ ๋ค์๊ณผ ๊ฐ๋ค
- ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ๊ธ๋ฐฉ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ(Unreachable) ์ํ๊ฐ ๋๋ค.
- Old ์์ญ์ ๊ฐ์ฒด์์ Young ์์ญ์ ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ๋งค์ฐ ๋๋ฌผ๋ค.
Young Generation = Eden + Survivor0 + Survivor1
์๋กญ๊ฒ ์์ฑ๋ ๊ฐ์ฒด์ ๋๋ถ๋ถ์ Young Gen ์์ญ
์ ํ ๋น๋๋ค.
- ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ๊ธ๋ฐฉ Unreachableํ ์ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ Young Gen ์์ญ์์ ์์ฑ๋์๋ค๊ฐ ์ฌ๋ผ์ง๋ค.
Eden ์์ญ
Object๊ฐ ์ต์ด๋ก ํ ๋น๋๋ ์์ญ์ด๋ค. ๋ง์ฝ Eden ์์ญ์ด ๊ฐ๋ ์ฐจ๋ฉด Minor GC๊ฐ ์ผ์ด๋๊ณ Minor GC์์ ์ด์๋จ์ Object(LiveObject)๋ Survivor ์์ญ์ผ๋ก ์ฎ๊ฒจ์ง๋ค.
- Minor GC์์ ์ด์๋จ๋ ๊ฐ์ฒด๋ Stack ์์ญ์ ๋ณ์๋ ๊ฐ์ฒด์ ์ํด ์ฐธ์กฐ๋ฅผ ๋ฐ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค.
Survivor ์์ญ
Eden ์์ญ์์ ์ด์๋จ์ Object๊ฐ ์ ์ ๋จธ๋ฌด๋ ์์ญ์ด๋ค. ํ๋์ Survivor ์์ญ์ด ๊ฐ๋์ฐจ๋ฉด Minor GC๊ฐ ๋ฐ์ํ๊ณ ์ด์๋จ์ Object๊ฐ ๋ค๋ฅธ Survivor ์์ญ์ผ๋ก ์ด๋ํ๋ค.
- ์ด ๋, Minor GC์ ์ ๊ฐ๋์ฐผ์๋ Survivor ์์ญ์ ์๋ฌด ๋ฐ์ดํฐ๋ ์๋ ์ํ๊ฐ ๋๋ค
Survivor0 โ Survivor1/Survivor0 โ Survivor1 ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค ๊ณ์ ์ด์๋จ์ Object๋ Old Gen์์ญ์ผ๋ก ์ฎ๊ฒจ์ง๋ค
Young Gen ์์ญ์์ ๋ฐ์ํ๋ Garbage Collection์ Minor GC
๋ผ๊ณ ํ๋ค.
Eden & Survivor0 & Survivor1 ์์ญ์ ์ฒ๋ฆฌ ์ ์ฐจ
-
์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ ๋๋ถ๋ถ Eden ์์ญ์ ์์นํ๋ค
-
Eden ์์ญ์์ Minor GC๊ฐ ๋ฐ์ํ ํ ์ด์๋จ์ ๊ฐ์ฒด๋ Survivor ์์ญ ์ค ํ๋๋ก ์ด๋ํ๋ค
-
์ดํ์ Eden ์์ญ์์ ์ฌ๋ฌ ๋ฒ์ Minor GC๊ฐ ๋ฐ์ํ์ฌ Survivor์์ญ์ ๊ฐ์ฒด๊ฐ ์์ธ๋ค
-
ํ๋์ Survivor ์์ญ์ด ๊ฐ๋์ฐจ๋ฉด, Minor GC๊ฐ ๋ฐ์ํ๊ณ ๊ทธ ์ค ์ด์๋จ์ ๊ฐ์ฒด๋ค์ ๋ ๋ค๋ฅธ Survivor ์์ญ์ผ๋ก ์ฎ๊ฒจ์ง๋ค.
- ํ๋์ Survivor ์์ญ์์ ๋ ๋ค๋ฅธ Survivor ์์ญ์ผ๋ก ์ฎ๊ฒจ์ง ๋๋ง๋ค ํด๋น ๊ฐ์ฒด์ age๊ฐ์ด ์ฆ๊ฐํ๋ค.
- Survivor ์์ญ ์ค ํ๋๋ ๋ฐ๋์ ๋น์ด์๋ ์ํ๋ก ๋จ์์์ด์ผ ํ๋ค. ๋ ์์ญ์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๊ฑฐ๋ ์ฌ์ฉ๋์ด 0์ด๋ผ๋ฉด ๋น์ ์์ ์ธ ์ํ์ด๋ค.
-
1 ~ 4
๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค๊ฐ ๊ฐ์ฒด์ age๊ฐ์ด ์ผ์ ์์ค ์ด์์ด ๋๋ฉด Old Gen ์์ญ์ผ๋ก ์ด๋ํ๋ค. ์ด ๋จ๊ณ๋ฅผPromotion
์ด๋ผ๊ณ ํ๋ค.Minor GC๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์ผ์ด๋๋ฉด์ Promotion๋ ๊พธ์คํ ๋ฐ์ํ๋ค. Promotion ์์ ์ด ๋ฐ๋ณต๋์ด Old Gen ์์ญ์ ๊ฐ์ฒด๊ฐ ๊ฐ๋์ฐจ๋ฉด Major GC๊ฐ ๋ฐ์ํ๋ค.
HotSpot JVM์์ ๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ํด ์ฌ์ฉํ๋ 2๊ฐ์ง ๊ธฐ์
-
bump-the-pointer
๋ง์ง๋ง ๊ฐ์ฒด๋ Eden ์์ญ์ ๋งจ ์(top)์ ์กด์ฌํ๋๋ฐ,
bump-the-pointer
๋ top์์น์ ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ด๋ค.- Eden ์์ญ์ ๋ง์ง๋ง์ผ๋ก ํ ๋น๋ ๊ฐ์ฒด๋ฅผ ์ถ์ ํ๋ ๊ธฐ์ ์ด๋ค.
- ๋ค์์ ์์ฑ๋๋ ๊ฐ์ฒด๊ฐ ์์ ๋, Eden ์์ญ์ ๊ฐ์ฉ๊ณต๊ฐ์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด bump-the-pointer๋ฅผ ํ์ฉํ์ฌ top์ ์์นํ ๊ฐ์ฒด๋ง ์ ๊ฒํ๊ณ Eden์ ๋ฃ์ ์ ์์์ง ํ์ธํ๋ค.
-
TLABS(Thread-Local Allocation Buffers)
๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ bump-the-pointer์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ Locking ๊ธฐ๋ฒ์ด ์ฌ์ฉ๋๋ค. ํ์ง๋ง Locking ๊ธฐ๋ฒ์ผ๋ก ์ธํด ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ฑ๋ฅ์ด ๋งค์ฐ ๋จ์ด์ ธ HotSpot JVM์์๋
TLABS
๊ธฐ์ ์ ์ฌ์ฉํ๋ค.๊ฐ๊ฐ์ ์ค๋ ๋๋ง๋ค ๋ ๋ฆฝ์ ์ผ๋ก Eden ์์ญ์ ์ผ๋ถ(TLABS)๋ฅผ ๋ถ์ฌํ์ฌ Locking ์์ด bump-the-pointer๋ฅผ ํ์ฉํ์ฌ ๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ๊ฐ๋ฅํด์ง๋ค.
Young Gen ์์ญ์์ ์ด์๋จ์ ๊ฐ์ฒด๋ Old Gen ์์ญ
์ผ๋ก ๋ณต์ฌ๋๋ค.
- Old Gen ์์ญ์ ๋๋ถ๋ถ Young Gen ์์ญ๋ณด๋ค ํฌ๊ธฐ๊ฐ ํฌ๊ณ , ํฌ๊ธฐ๊ฐ ํฐ๋งํผ GC๊ฐ ์ ๊ฒ ๋ฐ์ํ๋ค
Old Gen ์์ญ์์ ๋ฐ์ํ๋ Garbage Collection์ Minor GC
๋ผ๊ณ ํ๋ค.
- Old Gen ์์ญ์ ๋ฐ์ดํฐ๊ฐ ๊ฐ๋์ฐฐ ๋์๋ง Major GC๊ฐ ๋ฐ์ํ๋ค.
Old Gen์ Card Table โ Young Gen์ ์ํ ๊ฒ
Old Gen ์์ญ์ ๊ฐ์ฒด๊ฐ Young Gen ์์ญ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ, 512byte์ Card Table
์ ํ์ํ์ฌ Minor GC์ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํด์ฃผ์ด ์ ๋ฐ์ ์ธ GC ์๊ฐ์ ์ค์ฌ์ค๋ค.
-
์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ์์ง๋ง Minor GC๊ณผ์ ์์ Young Gen ์์ญ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ Old Gen ์์ญ์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๊ธฐ ์ํด Card Table๋ฅผ ํ์ฉํ๋ค.
Old Gen ์์ญ์ ๋ชจ๋ ๊ฐ์ฒด์ ์ฐธ์กฐ๊ด๊ณ๋ฅผ ํ๋์ฉ ํ์ธํ์ง ์๊ณ Card Table์ ์ ๋ณด๋ง์ผ๋ก Young Gen ์์ญ์ ํน์ ๊ฐ์ฒด๊ฐ GC ๋์์ ํฌํจ๋๋์ง ์๋ณํ ์ ์๋ค.
JDK7 ๊ธฐ์ค์ผ๋ก Major GC ๋ฅผ ๋ด๋นํ๋ Garbage Collector์๋ 5๊ฐ์ง๊ฐ ์กด์ฌํ๋ค
- Serial GC
- Parallel GC
- Parallel Old GC (Parallel Compacting GC)
- Concurrent Mark & Sweep GC (CMS GC)
- G1 (Garbage First) GC
Java SE 5,6์ ๊ธฐ๋ณธ Garbage Collector์ด๋ค.
- Minor GC์ Major GC๋ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ค
- Minor GC๋ ์์ ์ค๋ช ํ ๋ฐฉ์์ผ๋ก ์คํ๋๋ค
- Major GC๋
Mark-Sweep-Compact ์๊ณ ๋ฆฌ์ฆ
์ ์ฌ์ฉํ์ฌ ์คํ๋๋ค
Mark-Sweep-Compact ์๊ณ ๋ฆฌ์ฆ
Mark-Sweep-Compact ์๊ณ ๋ฆฌ์ฆ
์ด๋ ์๋ก์ด ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด์ ๊ธฐ์กด ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๋ ๊ฐ์ฒด๋ค์ Heap ์์ญ์ ์์ ์์น์๋ถํฐ ์ฐจ๋ก๋๋ก ์ฎ๊ฒจ๋๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- Mark โ Old Gen ์์ญ์์ ์ด์์๋ ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ ๊ณผ์
- Sweep โ Heap ์ ์์ ์์น๋ถํฐ ์ด์์๋ ๊ฐ์ฒด๋ง ๋จ๊ฒจ๋๊ณ Unreachable ๊ฐ์ฒด๋ค์ ์ง์ฐ๋ ๊ณผ์
- Compact โ Heap์ ์์ ์์น์๋ถํฐ ๊ฐ์ฒด๋ค์ด ์ฐ์์ ์ผ๋ก ์์นํ๋๋ก ์ฑ์ฐ๋ ๊ณผ์ (Compact ๊ณผ์ ์ด ์ํ๋๋ฉด ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ๋ถ๋ถ๊ณผ ์กด์ฌํ์ง ์๋ ๋ถ๋ถ์ผ๋ก ๋๋๋ค)
Parallel GC์ Serial GC์ ๊ธฐ๋ณธ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ๋์ผํ๋ค.
Parallel GC์ Serial GC์ ์ฐจ์ด์
- Serial GC๋ GC๋ฅผ ์ํํ๋ ์ฐ๋ ๋๊ฐ ์ค์ง ํ๋ ๋ฟ์ด๋ค (Single Thread)
- Parallel GC๋ GC๋ฅผ ์ํํ๋ ์ฐ๋ ๋๊ฐ ์ฌ๋ฌ ๊ฐ์ด๋ค (Multi Thread). ๋ฐ๋ผ์ Serial GC๋ณด๋ค ๋น ๋ฅด๊ฒ Garbage Collection์ ์ํํ ์ ์๋ค.
โJDK 5 update 6โ ๋ถํฐ ์ ๊ณตํ๋ GC์ด๋ค
- Parallel GC์ ๋น๊ตํ๋ฉด Major GC์์ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ๋ง ๋ค๋ฅด๋ค
- Parallel GC๋ Mark-Sweep-Compact ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ง๋ง, Parallel Old GC๋
Mark-Summary-Compaction
์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
- Parallel GC๋ Mark-Sweep-Compact ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ง๋ง, Parallel Old GC๋
Mark-Summary-Compaction ์๊ณ ๋ฆฌ์ฆ์ Summary ๋จ๊ณ
Summary ๋จ๊ณ๋ Major GC๋ฅผ ์ํํ ์์ญ์์ ์ด์๋จ์ ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ค. (Sweep๊ณผ ๋ค๋ฅด๋ค)
CMS GC๋ ๋ณต์กํ๋ค
CMS GC์ Garbage Collection ๊ณผ์ : Concurrent Mark-Sweep
-
Initial Mark
Class Loader์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฐ์ฒด ์ค ์ด์์๋ ๊ฐ์ฒด๋ง ์ฐพ๋ ๊ณผ์ ์ด๋ค
-
Concurrent Mark
Initial Mark์์ ํ์ธํ ์ด์์๋ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด๋ค์ ์ฌ๊ท์ ์ผ๋ก ๋ฐ๋ผ๊ฐ๋ฉด์ ํ์ธํ๋ ๊ณผ์ ์ด๋ค. ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ๋์์(Concurrent) ์งํ๋๋ค.
-
Remark
Concurrent Mark์์ ์๋กญ๊ฒ ์ถ๊ฐ๋๊ฑฐ๋ ์ฐธ์กฐ๊ฐ ๋๊ธด ๊ฐ์ฒด๋ฅผ ํ์ธํ๋ ๊ณผ์ ์ด๋ค
-
Concurrent Sweep
Unreachable ๊ฐ์ฒด๋ฅผ ์ ๋ฆฌํ๋ ๋จ๊ณ์ด๋ค. ์ด ๋ํ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ๋์์ ์งํ๋๋ค.
์ฅ๋จ์
- ์ฅ์
- CMS GC๋ stop-the-world ์๊ฐ์ด ์งง๋ค
- ๋จ์
- ๋ค๋ฅธ GC ๋ฐฉ์๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ์ CPU๋ฅผ ๋ ์ฌ์ฉํ๋ค.
- Compaction ๋จ๊ณ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ๋์ง ์๊ธฐ ๋๋ฌธ์ ์กฐ๊ฐ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ง์์ง ์ ์๋ค. ์ด๋ ๊ฒฐ๊ตญ ๋ค๋ฅธ GC ๋ฐฉ์๋ณด๋ค stop-the-world ์๊ฐ์ ๋ ๊ฑธ๋ฆฌ๊ฒ ํ ์ ์๋ค.
G1 GC๋ CMS GC๋ฅผ ๋์ฒดํ๊ธฐ ์ํด ๋ง๋ค์ด์ง Garbage Collector์ด๋ค. G1 GC๋ฅผ ์ดํดํ๊ธฐ ์ํด ๊ธฐ์กด์ Young Gen, Old Gen ์์ญ์ ๋ํด์ ์์ด์ผ ํ๋ค.
- Eden โ SurvivorX โ SurvivorY โ Old Gen ์์ญ์ผ๋ก ๊ฐ์ฒด๊ฐ ์ด๋ํ๋ ๋จ๊ณ๊ฐ ์ฌ๋ผ์ง Garbage Collection ๋ฐฉ์์ด๋ค.
- Java 11์ Default GC๋ G1 GC์ด๋ค.
G1 GC์ Garbage Collection ๊ณผ์
- ๋ฐ๋ํ์ ๊ฐ ์์ญ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ค.
- ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ ค๋ ์์ญ์ด ๊ฐ๋์ฐผ๋ค๋ฉด, ๋ค๋ฅธ ์์ญ์ ํด๋น ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ณ ๊ฐ๋์ฐฌ ์์ญ์ Major GC๋ฅผ ์ํํ๋ค.
์ฅ์
๋ค๋ฅธ Garbage Collector๋ค ๋ณด๋ค ๋ ์ข์ ์ฑ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.
G1 GC์ CMS GC์ ์ฐจ์ด์
- G1 GC : Heap ์์ญ์ ๋ฐ๋ํ ๋ชจ์์ N๊ฐ์ ์์ญ์ผ๋ก ์ชผ๊ฐ์ด ๊ฐ ์์ญ์ Major GC๋ฅผ ์งํํ๋ค
- CMS GC : Heap ์์ญ ์ ์ฒด๋ฅผ Concurrent Mark-Sweep์ ํ์ฌ Major GC๋ฅผ ์งํํ๋ค.
Perm Gen ์์ญ
์ ํด๋์ค, ๋ฉ์๋์ ๋ฉํ์ ๋ณด, static ๋ณ์ ๋ฐ ์์ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ์์ญ์ด๋ค.
Perm Gen ์์ญ์ ํ์
Perm Gen ์์ญ์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๊ธธ๋ค๊ณ ํ๋จ๋๋ ๊ฐ์ฒด๋ค์ Perm Gen ์์ญ์ ํ ๋นํ์ฌ GC ๋์์์ ์ ์ธํ๊ธฐ ์ํด ๋ง๋ค์ด์ก๋ค.
- ์๋ช ์ฃผ๊ธฐ๊ฐ ๊ธธ๋ค๊ณ ํ๋จ๋๋ ๊ฐ์ฒด๋ค : Class ๊ฐ์ฒด, String ๊ฐ์ฒด
Java 8๋ถํฐ Perm Gen ์์ญ์ด ์ฌ๋ผ์ง๊ณ MetaSpace๊ฐ ์๊ฒผ๋ค
Java8 ์ด์ ์ Perm
์์ญ์ ๋ณดํต Class์ Meta ์ ๋ณด๋ Method์ Meta ์ ๋ณด, Static ๋ณ์์ ์์ ์ ๋ณด๋ค์ด ์ ์ฅ๋๋ ๊ณต๊ฐ์ผ๋ก ํํ ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ ์์ญ์ด๋ผ๊ณ ๋ ํ๋ค. ์ด ์์ญ์ Java 8 ๋ถํฐ๋ Native ์์ญ์ผ๋ก ์ด๋ํ์ฌ Metaspace
์์ญ์ผ๋ก ๋ณ๊ฒฝ๋์๋ค. (๋ค๋ง, ๊ธฐ์กด Perm์์ญ์ ์กด์ฌํ๋ Static Object๋ Heap ์์ญ์ผ๋ก ์ฎ๊ฒจ์ ธ์ GC์ ๋์์ด ์ต๋ํ ๋ ์ ์๋๋ก ํ์๋ค)
์ฆ, ๊ฐ์ข
๋ฉํ ์ ๋ณด๋ฅผ OS๊ฐ ๊ด๋ฆฌํ๋ ์์ญ์ผ๋ก ์ฎ๊ฒจ Perm ์์ญ์ ์ฌ์ด์ฆ ์ ํ์ ์์ค ๊ฒ์ด๋ผ ํ ์ ์๋ค
๊ทธ๋ฆฌ๊ณ MetaSpace ์์ญ์ Heap์ด ์๋ Native Memory ์์ญ์ผ๋ก ์ทจ๊ธํ๋ค.
- Heap ์์ญ์ JVM์ ์ํด ๊ด๋ฆฌ๋๋ ์์ญ์ด๊ณ
- Native ์์ญ์ OS ๋ ๋ฒจ์์ ๊ด๋ฆฌํ๋ ์์ญ์ด๋ค
๊ทธ๋ผ Java8 ์ด์ ์ Perm Gen ์์ญ์ Heap ์์ญ์ ํฌํจ๋์์๊น? โ NO
OutOfMemoryError ์๋ฌ๋ฉ์์ง๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ํ์ธํ ์ ์๋ค.
- Heap ์์ญ์ด ๋ถ์กฑํ ๋
java.lang.OutOfMemoryError: Heap space space
์๋ฌ๊ฐ ๋ฐ์ํ๊ณ , PermGen ์์ญ์ด ๋ถ์กฑํ๋ฉดjava.lang.OutOfMemoryError: PermGen space
์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๋ํ 3๊ฐ์ Oracle ๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๋ฉด PermGen์ด Heap ์์ญ์ ํฌํจ๋์ง ์๋๋ค๊ณ ๋งํ๋ค. (์ฐธ๊ณ )
- Java์ Heap ์์ญ : Perm Gen์ ์๋ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ
- Perm Gen ์์ญ : ํด๋์ค์ ๋ฉ์๋์ ๋ฉํ๋ฐ์ดํฐ, ์์ ํ ์ ๋ณด, JVM/JIT ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ
[naver d2] Java Garbage Collection
์๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ - ๊ฐ๋น์ง ์ปฌ๋ ์
[JAVA] JVM Execution Engine (์คํ์์ง)
Execution Engine์ Interpreter์ JIT Compiler์ ๋ํด ์์๋์?
๊ฐ๋น์ง ์ปฌ๋์ ์ด ์ ์ผ์ด๋์ฃ ? ์ด๋์์ ์ผ์ด๋๋์?
Minor GC์ Major GC์ ๋ํด ์ค๋ช ํด๋ณด์ธ์
Java8๋ถํฐ Permanent Generation ์์ญ์ด ์ฌ๋ผ์ง ์ด์ ๋ฅผ ์์๋์?