๊ฐ์
- ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ํ์ํ ์ด์
- ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ํ ์ ๋ฐ์ ์ธ ์ดํด
- ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์ ๋ฐฉ๋ฒ
https://ybdeveloper.tistory.com/36
[JAVA] JVM์ด๋ ๋ฌด์์ผ๊น?
JVM์ด๋? ์๋ฐ ๊ฐ์ ๋จธ์ (Java Virtual Machine)์ ์ฝ์๋ก์, ์ง์ญํ์๋ฉด '์๋ฐ๋ฅผ ์คํํ๊ธฐ ์ํ ๊ฐ์ ๊ธฐ๊ณ'๋ผ๊ณ ํ ์ ์์ต๋๋ค. '๊ฐ์ ๊ธฐ๊ณ'๋ SW๋ก ๊ตฌํ๋ HW๋ฅผ ๋ปํ๋ ๋์ ์๋ฏธ์ ์ฉ์ด์ด๋ฉฐ, ์ปดํจํฐ ์ฑ๋ฅ์ด ํฅ..
ybdeveloper.tistory.com
๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ํ์ํ ์ด์ ?
C๋ C++ Language๋ฅผ ์ฌ์ฉํ ๋๋, OS ๋ ๋ฒจ์ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ free()๋ผ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํ ๋น๋ฐ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ช ์์ ์ผ๋ก ๊ฐ๋ฐ์๊ฐ ํด์ ํด์ฃผ์ด์ผ ํฉ๋๋ค. ๋ง์ฝ ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๊ฒ ๋๊ณ , ํ์ฌ ์คํ์ค์ด๋ ํ๋ก๊ทธ๋จ์ ์น๋ช ์ ์ธ ํผํด๋ฅผ ์ ํ ์ ์์ต๋๋ค.
๋ฐ๋ฉด์, ์๋ฐ๋ OS์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ์ง ์๊ณ , JVM์ ์ด์ฉํด์ ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํฉ๋๋ค. JVM์ C๋ก ์์ฑ๋ ๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ธ๋ฐ, JVM์ด ์์์ free()๋ฅผ ํธ์ถํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ๊ฒ ๋ฉ๋๋ค. ์ฆ, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ผ๋ ๊น๋ค๋ก์ด ๋ถ๋ถ์ ์ ๋ถ JVM์๊ฒ ๋์ ๋งก๊ฒจ๋ฒ๋ฆฌ๋ ๊ฒ์ ๋๋ค.
์ด๋ JVM์ด ๋ฉ๋ชจ๋ฆฌ ๋์ํ์์ ๋ฐฉ์งํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋๋ค.
๊ฐ๋น์ง ์ปฌ๋ ์
๊ฐ๋ฐ์๊ฐ ํ์ ์์ ๋กญ๊ฒ ์ฌ์ฉํ๊ณ , ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ์ค๋ธ์ ํธ๋ค์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ด๋นํ๋ ํ๋ก์ธ์ค๊ฐ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ๋๋ก ํ๋ ๊ฒ์ด ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋๋ค.
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์์ฃผ ๋จ์ํ ๊ท์น์ ์ ์ฉ์์ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณด์ํต๋๋ค.
Heap ์์ญ์ ์ค๋ธ์ ํธ ์ค Stack์์ ๋๋ฌ ๋ถ๊ฐ๋ฅํ (Unreachable) ์ค๋ธ์ ํธ๋ค์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ด ๋๋ค.
์ฆ, ์ด๋ ํ ์ฐธ์กฐ๋ณ์๋ ๊ฐ๋ฆฌํค๊ณ ์์ง ์์ Heap ์์ญ์ ์ค๋ธ์ ํธ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ด ๋๋ค๋ ์๋ฏธ์ ๋๋ค. ๋ง์ฝ Stringํ ๋ฐ์ดํฐ๋ค์ ๋ํด ๋ํ๊ธฐ ์ฐ์ฐ์ ์ํํ๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
1
2
3
4
5
|
String a = "Lee";
a += "yunbok"; // ์ฌ๊ธฐ์ a์๊ฒ ๋ฌด์จ์ผ์ด ๋ฒ์ด์ง๊น์?
|
์ฒซ๋ฒ์งธ ๋ผ์ธ์์ ๋ฒ์ด์ง๋ ์ผ์ Stack ์์ญ์ a ์ฐธ์กฐ ๋ณ์๊ฐ ์ ์ฅ๋๊ณ , Heap ์์ญ์๋ "Lee"๋ผ๋ ๋ฌธ์์ด์ด ์ ์ฅ๋๊ฒ ์ฃ ?
๊ทธ ๋ค์ ๋ผ์ธ์์ a์ "yunbok" ๊ฐ์ ๋ง์ ์ฐ์ฐ์ ์ํํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ค์ผ์ด ๋ฒ์ด์ง๊น์? "Lee"๋ผ๋ ๋ฌธ์์ด์ ์ ์ฅํ๊ณ ์๋ ์์น์ "yunbok"์ ์ถ๊ฐ์ํค๋ ๊ฒ์ด ์๋, ์์ ๋ค๋ฅธ ์ฃผ์๊ฐ์ "Leeyunbok"์ ํ ๋น์ํจ ํ, ์ฐธ์กฐ ๋ณ์ a๊ฐ ํด๋น ๋ฌธ์์ด์ ๊ฐ๋ฆฌํค๊ฒ ํฉ๋๋ค.
"Leeyunbok"๋ ์ค์ํ์ง๋ง, ๋ ์ด์ ์๋ฌด๋ ์๊ฐ๋ฆฌํค๊ฒ ๋ "Lee"์ ํฌ์ปค์ค๋ฅผ ๋ง์ถ์ด ๋ด ์๋ค. ์ด๋ฌํ ์ค๋ธ์ ํธ๋ฅผ ๋๋ฌ ๋ถ๊ฐ๋ฅํ. ์ฆ, Unreachable ์ค๋ธ์ ํธ๋ผ๊ณ ๋งํฉ๋๋ค. ์ด๋ฐ ์ค๋ธ์ ํธ๊ฐ ์ด์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ชฉํ๊ฐ ๋๋ ๊ฒ์ด์ง์.
JVM์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ Unreachable ์ค๋ธ์ ํธ๋ฅผ ์ฐ์ ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ฒ ๋ฉ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ์ ์ Mark and Sweep ์ด๋ผ๊ณ ๋ ํฉ๋๋ค. JVM์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์คํ์ ๋ชจ๋ ๋ณ์๋ค์ ์ค์บํ๋ฉฐ ๊ฐ๊ฐ ์ด๋ค ์ค๋ธ์ ํธ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋์ง ์ฐพ๋ ๊ณผ์ ์ด Mark์ ๋๋ค. ์ฒซ๋ฒ์งธ ๋จ๊ณ์ธ Marking ์์ ์ ์ํด ๋ชจ๋ ์ค๋ ๋๊ฐ ์ ์ง๋๋๋ฐ ์ด๋ฌํ ์ด์ ๋๋ฌธ์, ์๋์ผ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์งํ์ํฌ ์ ์๋ System.gc()๋ฅผ ์๊ฐ์์ด ํธ์ถํ๋ฉด ์๋๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋์ unreachable ์ค๋ธ์ ํธ๋ค์ ํ์์ ์ ๊ฑฐํ๋ ๊ณผ์ ์ด Sweep ์ ๋๋ค. ์ฆ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ์ ์ garbage ์ค๋ธ์ ํธ๊ฐ ์๋ ๊ฒ๋ค์ mark ํด๋๊ณ ๊ทธ ์ธ์ ๊ฒ์ ๋ชจ๋ ์ง์ฐ๋ ๊ณผ์ ์ด๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค.
Heap์ ์ธ๋ถํ
Heap์ ์ ์ฌ์ง ์ฒ๋ผ Young Generation, Old Generation์ผ๋ก ํฌ๊ฒ ๋๊ฐ์ ์์ญ์ผ๋ก ๋๋์ด ์ง๊ณ , Young Generation์ ๋๋ค์ Eden, Survivor0,1๋ก ์ธ๋ถํ ๋์ด์ง๋๋ค. ๊ฐ ์์ญ์ ์ญํ ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ํ๋ก์ธ์ค๋ฅผ ์ค๋ช ํ๋ฉฐ ์ธ๊ธํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ฐ๋น์ง ์ปฌ๋ ์ ํ๋ก์ธ์ค
- ์๋ก์ด ์ค๋ธ์ ํธ๋ Eden ์์ญ์ ํ ๋น๋ฉ๋๋ค. ๋ ๊ฐ์ Survivor๋ ๋น์์ง ์ํ๋ก ์์๋๊ฒ ๋ฉ๋๋ค.
- Eden ์์ญ์ด ์ค๋ธ์ ํธ๋ก ๊ฐ๋์ฐจ๋ฉด, MinorGC๊ฐ ๋ฐ์ํฉ๋๋ค.
- MinorGC๊ฐ ๋ฐ์ํ๋ฉด, Reachable ์ค๋ธ์ ํธ๋ค์ Survivor0์ผ๋ก ์ฎ๊ฒจ์ง๊ฒ ๋ฉ๋๋ค. Unreachable ์ค๋ธ์ ํธ๋ค์ Eden ์์ญ์ด ์ด๊ธฐํ ๋ ๋ ํจ๊ป ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ๋ผ์ง๊ฒ ๋ฉ๋๋ค.
- ๋ค์ MinorGC๊ฐ ๋ฐ์ํ ๋, Eden ์์ญ์๋ 3๋ฒ๊ณผ ๊ฐ์ ๊ณผ์ ์ด ๋ฐ์ํฉ๋๋ค. Unreachable ์ค๋ธ์ ํธ๋ค์ ์ง์์ง๊ณ , Reachable ์ค๋ธ์ ํธ๋ค์ Survivor๋ก ์ด๋ํ๊ฒ ๋ฉ๋๋ค. ๊ธฐ์กด์ Survivor1์ ์์๋ Reachable ์ค๋ธ์ ํธ๋ค์ Survivor2๋ก ์ฎ๊ฒจ์ง๋๋ฐ, ์ด๋ age ๊ฐ์ด ์ฆ๊ฐ๋๋ฉฐ ์ฎ๊ฒจ์ง๋๋ค. ์ด์๋จ์ ๋ชจ๋ ์ค๋ธ์ ํธ๋ค์ด Survivor1์ผ๋ก ๋ชจ๋ ์ฎ๊ฒจ์ง๋ฉด, Survivor0๊ณผ Eden์ ์ด๊ธฐํ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ Survivor0์์ Survivor1๋ก์ ์ด๋์ ๋ age ๊ฐ์ ์ฆ๊ฐ๋ฅผ ๋ณํํ๊ฒ ๋ฉ๋๋ค.
- ๋ค์ MinorGC๊ฐ ๋ฐ์ํ๋ฉด, 4๋ฒ ๊ณผ์ ์ด ๋ฐ๋ณต๋๋๋ฐ, Surviovr1์ด ๊ฐ๋์ฐจ ์์์ผ๋ฏ๋ก Survivor1์์ ์ด์๋จ์ ์ค๋ธ์ ํธ๋ค์ Survivor0์ผ๋ก ์ฎ๊ฒจ์ง๋ฉด์, Survivor1๊ณผ Eden์ ์ด๊ธฐํ ๋ฉ๋๋ค. ์ด๋์๋, age๊ฐ์ด ์ฆ๊ฐ๋์ด ์ฎ๊ฒจ์ง๊ฒ ๋ฉ๋๋ค.
- Young Generation์์ ๊ฒ์ํด์ ์ด์๋จ์ผ๋ฉฐ age๊ฐ์ด ์ฆ๊ฐํ๋ ์ค๋ธ์ ํธ๋ค์ age๊ฐ์ด ํน์ ๊ฐ ์ด์์ด ๋๋ฉด Old Generation์ผ๋ก ์ฎ๊ฒจ์ง๊ฒ ๋๋๋ฐ ์ด ๋จ๊ณ๋ฅผ Promotion์ด๋ผ๊ณ ํฉ๋๋ค.
- MinorGC๊ฐ ๊ณ์ํด์ ๋ฐ๋ณต๋๋ฉด, Promotion ์์ ๋ ๊พธ์คํ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
- Promotion ์์ ์ด ๊ณ์ํด์ ๋ฐ๋ณต๋๋ฉด์ Old Generation์ด ๊ฐ๋์ฐจ๊ฒ ๋๋ฉด MajorGC๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
์ด ๊ณผ์ ๋ค์ด ๋ฐ๋ณต๋๋ ๊ฒ์ด ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋๋ค.
MinorGC : Young Generation์์ ๋ฐ์ํ๋ GC
MajorGC : Old Generation์์ ๋ฐ์ํ๋ GC
FullGC : Heap ์ ์ฒด๋ฅผ clearํ๋ ์์
Reference
- https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
- https://yaboong.github.io/java/2018/05/26/java-memory-management/
- https://yaboong.github.io/java/2018/06/09/java-garbage-collection/
์๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ - ๊ฐ๋น์ง ์ปฌ๋ ์
๊ฐ์ Java ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ํด์ ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณธ๋ค. Java ์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง ์ดํดํ๊ณ ์์ผ๋ฉด ์ข๋ค. ์๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ - ์คํ & ํ ๋ฅผ ๋จผ์ ์ฝ๋ ๊ฒ์ ์ถ์ฒํ๋ค. ๋ชจ๋ํฐ๋ง ํด VisualVM ๊ณผ VisualGC ํ๋ฌ๊ทธ์ธ์ ๋ํด ์์๋ณธ๋ค. Metaspace, Young/Old Generation ์ ๋ํด ์์๋ณธ๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์ ํ๋ก์ธ์ค์ ๋ํด ์์๋ณธ๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ข ๋ฅ์ ๋ํด ์์๋ณธ๋ค
yaboong.github.io
์๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ - ์คํ & ํ
๊ฐ์ Java ์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง ์์๋ณด๊ธฐ ์ํจ. Stack ๊ณผ Heap ์์ญ ๊ฐ ์ญํ ์ ๋ํด ์์๋ณธ๋ค. ๊ฐ๋จํ ์ฝ๋์์ ์ ํจ๊ป ์ค์ ์ฝ๋์์ ์ด๋ป๊ฒ Stack ๊ณผ Heap ์์ญ์ด ์ฌ์ฉ๋๋์ง ์ดํด๋ณธ๋ค. Wrapper Class ์ Immutable Object ์ ๋ํด์๋ ์ด์ง ์์๋ณธ๋ค. Garbage Collection ์ด ๋ฌด์์ธ์ง๋ ์์ฃผ ์ด์ง ์์๋ณธ๋ค.
yaboong.github.io
Java Garbage Collection Basics
Java Overview Java is a programming language and computing platform first released by Sun Microsystems in 1995. It is the underlying technology that powers Java programs including utilities, games, and business applications. Java runs on more than 850 mill
www.oracle.com