simple JVM GC guide
ยท 4 min read
๐ 1. JVM ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ ์ดํดโ
JVM์ ์คํ ์ค ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฌ์ฉํฉ๋๋ค:
- Metaspace (ํด๋์ค ๋ฉํ์ ๋ณด)
- Heap (๊ฐ์ฒด ์ธ์คํด์ค ์ ์ฅ)
- Stack (์ง์ญ ๋ณ์, ํ๋ ์ ๋ฑ)
- Code Cache (JIT ๊ฒฐ๊ณผ ์ ์ฅ)
- Heap: ๋๋ถ๋ถ์
new
๊ฐ์ฒด๊ฐ ์ด๊ณณ์ ์์ฑ๋จ - Metaspace: static ํ๋, ํด๋์ค ๊ตฌ์กฐ, ๋ฉ์๋ ์ ๋ณด ๋ฑ ํด๋์ค ๋ก๋ฉ ์ ์ ์ฅ
- Stack: ๊ฐ ์ค๋ ๋๋ง๋ค ์กด์ฌ, ์ง์ญ ๋ณ์ ๋ฐ ํธ์ถ ์ปจํ ์คํธ ์ ์ฅ
โป๏ธ 2. GC(Garbage Collection) ๊ธฐ๋ณธ ์ฒ๋ฆฌ ๋จ๊ณโ
- ๊ฐ์ฒด ์์ฑ โ Eden ์์ญ์ ํ ๋น
- Mark โ GC Root๋ก๋ถํฐ ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด ์ถ์
- Sweep/Copy/Compact
- Young GC: ์ด์๋จ์ ๊ฐ์ฒด๋ฅผ Survivor ๋๋ Old๋ก ๋ณต์ฌ
- Old GC: Mark-Compact๋ก ๋จํธํ ํด์
- Promotion โ ์ผ์ ์์กด ํ์ ์ด์ ๊ฐ์ฒด๋ Old ์์ญ์ผ๋ก ์น๊ฒฉ
โ๏ธ 3. G1 GC ๊ตฌ์กฐ ์์ฝ (JDK 17 ๊ธฐ๋ณธ GC)โ
- ์ ์ฒด ํ์ ๊ณ ์ ํฌ๊ธฐ Region์ผ๋ก ๋๋ (Eden, Survivor, Old, Humongous)
- GC ์ ํ:
- Young GC: Eden โ Survivor
- Mixed GC: ์ผ๋ถ Old๋ ์์ง
- Full GC: ์ ์ฒด ํ ์์ง (๊ฐ๋ฅํ ํํผ)
๐ G1 GC ๋ก๊ทธ ์์โ
[2.303s][info][gc,metaspace] GC(12) Metaspace: 60293K(60736K)->60293K(60736K)
NonClass: 52643K(52864K)->52643K(52864K)
Class: 7650K(7872K)->7650K(7872K)
- Metaspace๋ ํด๋์ค ๋ฉํ๋ฐ์ดํฐ
- NonClass: ๋ฉ์๋, ์ฌ๋ณผ ๋ฑ
- Class: ํด๋์ค ๊ตฌ์กฐ ์ ๋ณด
๐ง 4. Metaspace ๊ด๋ฆฌ ํโ
- Metaspace๋ ํ์ด ์๋ ๋ค์ดํฐ๋ธ ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ์ฉ๋จ
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌด์ ํ โ
-XX:MaxMetaspaceSize
๋ก ์ ํ ๊ฐ๋ฅ - ๋์ ClassLoader, SPI ์ฌ์ฉ ์ ๋ฉํ์คํ์ด์ค ๋์ ์ํ โ
-XX:MetaspaceSize=64m
-XX:MaxMetaspaceSize=256m
๐ฆ 5. GC์ ์ ๋ฆฌํ ๊ฐ์ฒด ๊ด๋ฆฌ ์ ๋ตโ
์ ๋ต | ์ค๋ช |
---|---|
์ฐธ์กฐ ํด์ | obj = null ๋ฑ์ผ๋ก ๋ช
์์ ํด์ |
์ค์ฝํ ์ถ์ | ๋ฉ์๋ ์ง์ญ ๋ณ์, ๋ธ๋ก ์ฌ์ฉ |
Escape Analysis ์ ๋ | ์ธ๋ถ๋ก ๋ ธ์ถ๋์ง ์์ผ๋ฉด Stack ํ ๋น |
WeakReference ์ฌ์ฉ | ์บ์ ๋ฑ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ |
ThreadLocal ๊ด๋ฆฌ | ์ฌ์ฉ ํ ๋ฐ๋์ .remove() ํธ์ถ |
โ ๏ธ ์ฃผ์: ๋๋ค ์บก์ฒ์ ThreadLocalโ
- ๋๋ค ์บก์ฒ ์ ์บก์ฒ๋ ๊ฐ์ฒด๋ ๋ด๋ถ์ ์ผ๋ก ํ๋๋ก ์ ์ฅ๋จ โ Executor ๋ฑ์์ ์ฐธ์กฐ๊ฐ ๋จ์ ์์ผ๋ฉด GC ์ ๋จ
ThreadLocal
์ Thread๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ๊น์ง ์ฐธ์กฐ ์ ์ง โ ThreadPool์์ ์ฃผ์ ํ์
try {
threadLocal.set(value);
...
} finally {
threadLocal.remove();
}
๐ ์ถ์ฒ ํด & ๋ช ๋ น์ดโ
jcmd <pid> VM.native_memory summary
jcmd <pid> GC.class_stats
-XX:+PrintGCDetails -Xlog:gc*
โ GC ๋ก๊ทธ ํ์ธ- GCViewer, GCEasy.io
๐ ์ฐธ๊ณ ์๋ฃโ
- Oracle GC Tuning Guide (JDK17)
- JEP 122: Remove the Permanent Generation
- Java Metaspace Explained - Baeldung
- GCViewer
- Java Performance by Scott Oaks
๐ก JVM์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ GC ๋์์ ์ดํดํ๋ฉด, ์๊ธฐ์น ๋ชปํ ๋ฉ๋ชจ๋ฆฌ ์ด์๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ๊ณ ,
์ฑ๋ฅ ์ต์ ํ์ ์ด์ ์์ ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.