Tistory ๋ธ๋ก๊ทธ ํฌ์คํ ๋ฐ๋ก๊ฐ๊ธฐ
Java Virtual Machine(JVM) ๊ตฌ์กฐ๋ ํฌ๊ฒ Class Loader, Runtime Data Area, Execution ์ด๋ ๊ฒ ์ธ ๊ฐ์ง๋ก ๋๋ ์ ์๋๋ฐ, ์ฌ๊ธฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ธ Runtime Data Area์ ๋ํ ๋ด์ฉ์ ๋ค๋ฃน๋๋ค.
Runtime Data Area๋, JVM์ด ํ๋ก๊ทธ๋จ์ ์ํํ๊ธฐ ์ํด OS๋ก๋ถํฐ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋๋ค.
์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ 5๊ฐ์ง ์์ญ์ผ๋ก ์ชผ๊ฐ์ด์ ธ ์์ผ๋ฉฐ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๋ถ๋ฅ๋ฉ๋๋ค.
JVM ์์์ ์์ฑ๋๋ฉฐ JVM ์ข ๋ฃ ์ ์๋ฉธ๋๋ ์์ญ๋ค๋ก๋ Method Area์ Heap์ด ์์ผ๋ฉฐ, ๋ชจ๋ ์ฐ๋ ๋ ๊ฐ ์์์ด ๊ณต์ ๋ฉ๋๋ค.
๊ฐ ์ฐ๋ ๋๊ฐ ์์ฑ๋ ๋ ์์ฑ๋๊ณ ํด๋น ์ฐ๋ ๋๊ฐ ์ข ๋ฃ๋ ๋ ์๋ฉธ๋๋ ์์ญ๋ค์๋ Stack, PC Register, Native Method Stack์ด ์์ต๋๋ค.
Method Area๋ JVM ๋ฒค๋๋ง๋ค ๋ค๋ฅด๊ฒ ๊ตฌํ๋์ด ์์ต๋๋ค.
Oracle Hotspot JVM์ Method Area๋ JDK 7๊น์ง๋ Permanent Generation(PermGen)์ด๋ผ๊ณ ๋ถ๋ ๊ณ , JDK 8 ๋ฒ์ ๋ถํฐ๋ Metaspace๋ก ์์ ํ ๋์ฒด๋์์ต๋๋ค.
PermGen๊ณผ Metaspace์ ์ฐจ์ด๋ ์๋์์ ์ดํด๋ณด๊ณ ์ฐ์ PermGen์ด ๋ฌด์์ ํ๋ ๊ณต๊ฐ์ธ์ง์ ๋ํด ๋จผ์ ์์๋ณด๊ฒ ์ต๋๋ค.
PermGen์ Runtime Constant Pool(๋ฐํ์ ์์ ํ), ํ๋ ๋ฐ ๋ฉ์๋ ๋ฐ์ดํฐ์ ๊ฐ์ ๋ชจ๋ ํด๋์ค ๋ ๋ฒจ ๋ฐ์ดํฐ์ ๋ฉ์๋ ๋ฐ ์์ฑ์์ ์ฝ๋๊ฐ ์ ์ฅ๋๋ ๊ณณ์ ๋๋ค.
์ ์ญ ๋ณ์๋ static ๋ณ์๋ค ๋ํ ์ด ์์ญ์ ์ ์ฅ๋๋ฉฐ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋๊น์ง ๋ฉ๋ชจ๋ฆฌ ๋จ์์๊ฒ ๋๊ณ , ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋๊น์ง ์ด๋์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ ๋ค๊ณ ๋ชจ๋ static ๋ณ์๊ฐ PermGen์ ์ ์ฅ๋๋ ๊ฒ์ ์๋๋๋ค. ๋ง์ฝ ํด๋น static ๋ณ์๊ฐ ์ด๋ค object์ ๋ํ ๋ ํผ๋ฐ์ค๋ผ๋ฉด ์ฐธ์กฐ ๋์์ด ๋๋ object๋ ๋ค๋ฅธ object๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก heap ์์ญ์ ์ ์ฅ๋ฉ๋๋ค.
(Heap ์์ญ์ ๋ํ ๋ด์ฉ์ ์๋ ์์ต๋๋ค.)
public class Dog {
private String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
}์์ ๊ฐ์ ํด๋์ค๊ฐ ์๋ค๊ณ ํ๋ค๋ฉด, name ๊ณผ age ๊ฐ์ ํ๋ ๋ฐ์ดํฐ์ ์์ฑ์ ์ ๋ณด๊ฐ ๋ฐ๋ก ์ด Method Area(PermGen)์ ์ ์ฅ๋ฉ๋๋ค.
์์์ ์ค๋ช ํ๋ฏ์ด Method Area๋ JVM ์์ ์ ์์ฑ๋๋ฉฐ JVM ์ข ๋ฃ ์ ์๋ฉธ๋๊ณ ๋ชจ๋ ์ฐ๋ ๋ ๊ฐ ์์์ด ๊ณต์ ๋๋ฉฐ, JVM ๋น Method Area๋ ํ๋๋ง ์กด์ฌํฉ๋๋ค.
๋ง์ฝ Method Area์ ๊ณต๊ฐ์ด ๋ถ์กฑํ์ฌ ์๋ก์ด ๊ณต๊ฐ ํ ๋น์ด ๋ถ๊ฐ๋ฅํ๋ค๋ฉด OutOfMemoryError๊ฐ throw ๋ฉ๋๋ค.
๋ฐํ์ ์์ ํ์๋ ํด๋์ค/์ธํฐํ์ด์ค์ ๋ฉ์๋, ํ๋, ๋ฌธ์์ด ์์ ๋ฑ์ ๋ ํผ๋ฐ์ค๊ฐ ์ ์ฅ๋๋ฉฐ, ์ด๋ค์ ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ์ฐธ์กฐํ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
JVM์ ์ด ์์ํ์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๋ ๋ค๋ฅธ ํด๋์ค๋ค๊ณผ ์ฐ๊ฒฐ์์ผ์ค๋๋ค.
JDK 7 ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ (PermGen)
JDK 8 ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ (Metaspace)
์ด PermGen ์์ญ์ด JDK 8๋ถํฐ๋ Metaspace์ ์์ ํ ๋์ฒด๋์๋ค๊ณ ํ๋๋ฐ, ์ ์ด๋ฐ ๋ณํ๊ฐ ์์์๊น์?
๊ธฐ์กด PermGen ์์ญ์ ํฌ๊ธฐ๊ฐ ์ ํ์ ์ด๋ผ OutOfMemoryError๋ฅผ ์ ๋ฐํ๋ค๋ ๋จ์ ์ด ์์์ต๋๋ค.
ํฌ๊ธฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ JVM์ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ฐ๋น์ง ์ปฌ๋ ์ (GC)์ ์์๋ก ์ํํด ํ์ํ ๊ณต๊ฐ์ ํ๋ณดํด์ผ ํ๊ณ , class loader๋ค์ด ์ ๋๋ก GC๋์ง ์๋ ๋ฌธ์ ๋ก ์ธํด memory leak์ด ๋ฐ์ํ๊ณค ํ์ต๋๋ค. ๊ทธ๋ ๋ค๊ณ ์ด PermGen ์์ญ์ ๊ณต๊ฐ์ ํ์์ ๋ฐ๋ผ ์๋์ผ๋ก ์ฆ๊ฐ์ํค๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ๋ํ ํ๋์ด ์ด๋ ค์ด ๋ฌธ์ ๊ฐ ์์๋ ๊ฒ์ด์ฃ .
์ด๋ฐ ๋ฌธ์ ๋ก ์ธํด, PermGen์ JDK 8 ๋ฒ์ ๋ถํฐ ์์ ํ Metaspace๋ผ๋ ์์ญ์ผ๋ก ๋์ฒด๋์์ต๋๋ค.
๊ธฐ์กด PermGen๊ณผ Metaspace์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐฉ์์ ๋๋ค.
Metaspace๋ ๊ธฐ์กด Java Heap ๋ฉ๋ชจ๋ฆฌ ์์ ๋ถ์ด์์ง ์๊ณ , OS์์ ์ ๊ณตํ๋ native ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ํ์์ ์๋์ผ๋ก ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ์์ผ ๊ณต๊ฐ์ ํ๋ณดํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ ๋ณ๊ฒฝ์ฌํญ์ผ๋ก ์ธํด ํด๋์ค ๋ฉํ๋ฐ์ดํฐ ์ฌ์ฉ๋์ด ๋ฉํ์คํ์ด์ค์ ์ต๋ ํฌ๊ธฐ์ ๋๋ฌํ ๋ ์๋์ผ๋ก GC๊ฐ ๋๊ฒ ๋๋ฉด์ JVM์ OutOfMemoryError์ ๋ฐ์ํ๋ฅ ์ ์ค์ผ ์ ์์ต๋๋ค.
Heap ์์ญ์ Object ํด๋์ค๋ฅผ ์์๋ฐ๋ ๋ชจ๋ ๊ฐ์ฒด๋ค(ํด๋์ค ์ธ์คํด์ค๋ค)๊ณผ ํด๋น ์ธ์คํด์ค์ ๋ณ์๋ค์ ๋ด๋ ๊ณต๊ฐ์ ๋๋ค.
Dog bubbles = new Dog("Bubbles", 7);์ ์ฝ๋์์ new ํค์๋๋ฅผ ํตํด ์๋ก์ด Dog ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ , ์์ฑ๋ Dog ์ธ์คํด์ค๋ heap ์์ญ์ ํ ๋น๋ฉ๋๋ค.
Heap ์์ญ์ Garbage Collection์ด๋ผ๋ ๋ฉ์ปค๋์ฆ์ ํตํด ์๋์ผ๋ก ์ ์ฅ๊ณต๊ฐ์ด ๊ด๋ฆฌ๋ฉ๋๋ค.
Heap ์์ญ์ ํฌ๊ฒ Young Generation๊ณผ Old Generation์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
Young Gen์ Eden ์์ญ๊ณผ Survivor Memory Spaces๋ผ ๋ถ๋ฆฌ๋ S0, S1 ์์ญ์ผ๋ก ๋๋ฉ๋๋ค.
์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ ํญ์ Eden ์์ญ์ ์์ฑ๋ฉ๋๋ค.
GC ์ธ์ดํด์ ๊ฑฐ์น๋ฉด์ (Young Gen์์๋ Minor GC) ๋ ์ด์ ๋ ํผ๋ฐ์ค ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฆฌํจ๊ณผ ๋์์ ์ง์์ ์ผ๋ก ์ฐธ์กฐ๋๊ณ ์๋ ๊ฐ์ฒด๋ฅผ S0, S1 ์์ญ์ ํ์ฉํ์ฌ ๋ชจ์๋ก๋๋ค.
์ฌ๋ฌ ๋ฒ์ Minor GC ์ธ์ดํด์ (threshold๋ฅผ ์ค์ ํ ์ ์์) ๊ฑฐ์น ๋ค์๋ ์ค๋ซ๋์ ์ด์๋จ๋ ๊ฐ์ฒด๋ค์ Old Generation ์์ญ์ผ๋ก ์ฎ๊ฒจ์ง๊ฒ ๋ฉ๋๋ค.
Old Gen ์์ญ๋ ๊ฐ๋ ์ฐจ๊ฒ ๋๋ ๊ฒฝ์ฐ Major GC์ ์ํด ๊ณต๊ฐ์ด ์ ๋ฆฌ๋ฉ๋๋ค.
์ฌ๊ธฐ์๋ ๊ฐ๋จํ๊ฒ Heap ์์ญ์ ๊ตฌ์กฐ๋ฅผ ์ค๋ช ํ์ง๋ง, ์ค์ ๋ก Heap ์์ญ์ ๋ํ ์ดํด๊ฐ ์์ด์ผ GC ๋ฉ์ปค๋์ฆ์ ์ดํดํ ์ ์์ต๋๋ค.
์ ๋ง ์ค์ํ๊ณ ๋ด์ฉ์ด ๋ฐฉ๋ํ๊ธฐ ๋๋ฌธ์ GC๋ฅผ ์ฃผ์ ๋ก ๋ฐ๋ก ํฌ์คํธ๋ฅผ ์์ฑํ ์์ ์ ๋๋ค.
Heap ์์ญ ๋ํ JVM ์์ ์ ์์ฑ๋๋ฉฐ JVM ์ข ๋ฃ ์ ์๋ฉธ๋์ด JVM ๋น Heap ์์ญ์ ํ๋๋ง ์กด์ฌํ๊ณ , ๋ชจ๋ ์ฐ๋ ๋ ๊ฐ ์์์ด ๊ณต์ ๋๊ธฐ ๋๋ฌธ์ ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
Stack์ ์์์ ์ธ๊ธํ๋ ์๋ก์ด ์ฐ๋ ๋๊ฐ ์์ฑ๋ ๋๋ง๋ค ์์ฑ๋๋ ์์ญ์ ๋๋ค.
์คํ ์์ญ์ ์ฐ๋ ๋๊ฐ ์คํ๋๋ฉด์ ์คํํ๋ ๋ฉ์๋ ๋ณ๋ก ํด๋น ์ค์ฝํ ๋ด ํ ๋น๋ ๋ก์ปฌ ๋ณ์ ๋ฐ ๊ธฐ๋ณธํ ํ์ (Primitive type) ๋ณ์์ ๊ฐ์ ๋ด๊ณ , heap ์์ญ์ ์กด์ฌํ๋ ๊ฐ์ฒด์ ๋ํ ๋ ํผ๋ฐ์ค๋ฅผ ๋ด์ต๋๋ค.
ํด๋น ๊ฐ๋ค์ Stack Frame์ด๋ผ๋ ๋ธ๋ก์ ๋ด๊ฒ ๋๊ณ , ์๋ก์ด ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์ด์ ์ ์กด์ฌํ๋ Stack Frame ์์ ์๋ก์ด Stack Frame์ด ์์ด๊ฒ ๋ฉ๋๋ค.
JVM Stack์ ์ฐ๋ฆฌ๊ฐ ์ตํ ์๊ณ ์๋ Last-In-First-Out(LIFO)๋ฅผ ๊ตฌํํ๋ ์๋ฃ๊ตฌ์กฐ์ธ Stack๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
JavaScript์ Call Stack(ํธ์ถ ์คํ)์ ๋ํด ์๊ณ ์๋ค๋ฉด ๊ฐ๋ค๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
๋ฉ์๋๊ฐ ์คํ์ ๋ง์น๊ฒ๋๋ฉด ํด๋นํ๋ stack frame์ ์ฌ๋ผ์ง๊ณ ๊ฐ์ฅ ์ต๊ทผ ์ถ๊ฐ๋์๋ stack frame์ ํด๋นํ๋ ๋ฉ์๋๊ฐ ์ด์ด์ ์คํ๋ฉ๋๋ค.
Stack ์์ญ ๋ด์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ ํด๋น stack frame ์ด ์กด์ฌํ๋ ํ ์ด์์๊ฒ ๋ฉ๋๋ค.
๋ง์ฝ stack ์์ญ์ด ๊ฐ๋ ์ฐจ๊ฒ ๋๋ค๋ฉด Java๋ java.lang.StackOverFlowError๋ฅผ throw ํฉ๋๋ค.
ํน์ Stack Overflow์ ๋ํด ์ ๋ชจ๋ฅผ๊น ๋ด ์ค๋ช
์ ๋ง๋ถ์ด์๋ฉด,
์๋ ๋ฒ ์ดํฐ์์ ์์ชฝ์ ๊ฑฐ์ธ์ด ์์ด์ ๋ด ๋ชจ์ต์ด ์ฌ๋ฌ ๊ฒน์ผ๋ก ๋์์ด ๋ฐ์ฌ๋๋ ๊ฒ์ ๋ณธ ์ ์ด ์์ ํ
๋ฐ ์ด๋ฐ ํ์๊ณผ ๋น์ทํฉ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ์์์ ์์๋ก๋, ์ฌ๊ท ํจ์๋ฅผ ๊ตฌํํ๊ณ ์ข
๋ฃ๋๋ ์์ ์ ๋ช
ํํ๊ฒ ๋ง๋ค์ด๋์ง ์์ ํน์ ๋ฉ์๋์ body์์ ๋ณธ์ธ์ ํธ์ถํ๊ณ , ํธ์ถ๋ ๋ณธ์ธ์ body์์ ๋ ๋ณธ์ธ์ ํธ์ถํด์ Stack Frame์ด ๋์์ด ์์ด๊ฒ ๋๋ ํ์์ ๋งํฉ๋๋ค.
Stack ์์ญ์ ์ฐ๋ ๋ ๋ณ๋ก ๋ฐ๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋์์ ์คํ๋๊ณ ์๋ ๋ค๋ฅธ ์ฐ๋ ๋์ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
์ด๊ฑธ threadsafe ํ๋ค๊ณ ํฉ๋๋ค.
Java SE8 Specification์ ์ํ๋ฉด, JVM์ ํ ๋ฒ์ ๋ง์ ์ฐ๋ ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ์คํ๋๋ ๊ฐ ์ฐ๋ ๋ ๋ณ๋ก Program Counter ๋ ์ง์คํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
Program Counter Register๋, ๋ฉ๋ชจ๋ฆฌ์์ ์คํ๋ ๋ค์ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ๊ฐ์ง ํ๋ก์ธ์์ ๋ ์ง์คํฐ๋ฅผ ๋ปํฉ๋๋ค. ์คํ๋๋ ๊ฐ ๋ช ๋ น๋ง๋ค ๋ค์ ์์๋ก ์คํํ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ํธ๋ํ๋๋ฐ ํ์ํ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค.
JVM์ PC Register๋ JVM ์ฐ๋ ๋๊ฐ ํ์ฌ ์คํ์ค์ธ ๋ฉ์๋์ ๋ช ๋ น์ ๋ด๊ณ ์๋ ์ฃผ์๋ฅผ ํฌํจํ๊ฒ ๋๊ณ , ์คํ์ค์ธ JVM ์ฐ๋ ๋๊ฐ ๋ฌด์์ ํ๋์ง๋ฅผ ๊ด๋ฆฌํ๋ ์ผ์ข ์ ๊ด๋ฆฌ์๋ผ๊ณ ํํํ ์ ์์ต๋๋ค.
Native Method๋ Java๊ฐ ์๋ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ๋ฉ์๋์ ๋๋ค. C, C++ ๋๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ผ ์ ์์ต๋๋ค.
Native Method Stack์ JVM Stack ์์ญ๊ณผ ๋น์ทํ๊ฒ LIFO๋ฅผ ๊ตฌํํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ฉฐ, Java ๋ฉ์๋๊ฐ ์๋ ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ค์ ํธ์ถ ์์๋ฅผ ๋ด์ ๊ด๋ฆฌํ๋ stack์ ๋๋ค.
- https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html
- https://openjdk.java.net/jeps/122
- https://docs.deistercloud.com/content/Axional%20development%20libraries.20/Studio%20J2EE%20Server.4/Tunning.xml?embedded=true
- https://www.baeldung.com/java-stack-heap
- https://medium.com/platform-engineer/understanding-java-memory-model-1d0863f6d973
- https://stackoverflow.com/questions/41358895/permgen-is-part-of-heap-or-not




