์๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ฉด JVM์ด OS๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋น๋ฐ๊ณ
JVM์ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฉ๋์ ๋ฐ๋ผ ์ฌ๋ฌ ์์ญ์ผ๋ก ๋๋์ด ๊ด๋ฆฌํ๊ฒ ๋๋๋ฐ
๊ด๋ฆฌํ๋ ์ ์ฒด ์์ญ์ Runtime Data Area๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ฉ๋ชจ๋ฆฌ ์์ญ์ Method Area,
Heap Area,
Stack Area,
PC register,
Native Method Stack์ผ๋ก ๋๋๋ค.
์ฌ์ง์์ ๋ณด์ด๋ฏ์ด Method Area, Heap Area ์์ญ์ ๋ชจ๋ Thread๊ฐ ๊ณต์ ํ๊ณ
Stack Area, PC register, Native Method Stack ์์ญ์ Thread ๋ณ๋ก ์์ฑ๋๋ค.
์ฐ๋ ๋(Thread)๋?
๋ชจ๋ Thread๊ฐ ๊ณต์ ํ๋ Method Area, Heap Area๋ Java Vertual Machine ์์ ์ ์์ฑ๋๊ณ , JVM์ด ์๋ฉธ๋ ๋ ์๋ฉธํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง ์์ญ์ ์ฐ๋ ๋๊ฐ ์์ฑ๋ ๋ ์์ฑ๋๊ณ , ์ฐ๋ ๋ ์ข
๋ฃ๋ ๋ ์๋ฉธํ๋ค.
Java๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด์, ์์ํ๊ฒ Java๋ก ๊ตฌ์ฑ๋ ์ฝ๋๋ง์ ์ฌ์ฉํ ์ ์๋ ์์คํ
์ ์์์ด๋ API๊ฐ ์กด์ฌํ๋ค.
์ด๋ ๊ฒ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑ๋ ๋ฉ์๋๋ค์ Native Method๋ผ๊ณ ํ๋ค.
Native Method Stacks๋ ์ด๋ฐ Native Method๋ฅผ ๋ค๋ฃจ๋ ์์ญ์ ๋งํ๋ค. โC Stacksโ๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
JVM์ ํ ๋ฒ์ ๋ง์ Thread๋ฅผ ์คํํ ์ ์๊ณ , ๊ฐ Thread๋ ๊ฐ์์ ๋ฉ์๋๋ฅผ ์คํํ๋ค.
์ด ๋ Thread๋ณ๋ก ๋์์ ์คํํ๋ ํ๊ฒฝ์ด ๋ณด์ฅ๋์ด์ผ ํ๋ฏ๋ก PC Register๋ Thread์์ ์คํํ ๋ค์ ๋ช
๋ น์ด์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ค.
๋ค์ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ์ด์ CPU๋ ์ฐ๋ ๋ ์ฌ์ด๋ฅผ ์ ํํ๋ฉฐ ๋ช ๋ น์ ์ํํ๊ธฐ ๋๋ฌธ์ Context Switching์ด ์ผ์ด๋๋ ์๊ฐ์ ์คํํ ์์น๋ฅผ ์์์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๊ฒ์ ์ด์ฉํด ๋ค์์ ์ฐ๋ ๋๋ค์ด ๋ช ๋ น์ ํ๋ฆ์ ์์ง ์๊ณ ์คํ๋๋ค.
JVM Stack์ Thread์์ ๋ก์ปฌ ๋ณ์, ๋ถ๋ถ ๊ฒฐ๊ณผ, ๋ฉ์๋ ํธ์ถ ๋ฐ ๋ฐํ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋๋ฐ ์ฌ์ฉ๋๋ค.
๊ฐ Thread๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ง๋ค Frame์ด๋ผ๋ ๋จ์๋ก Stack Area์ ์ถ๊ฐํ๋ค. ๋ฉ์๋๊ฐ ์คํ๋์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ฉด ํด๋น Frame์ Stack Area์์ ์ ๊ฑฐ๊ฐ ๋๋ค.
ํ๋ ์์ ๋ฐ์ดํฐ ๋ฐ ๋ถ๋ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅ, ๋์ ์ฐ๊ฒฐ, ๋ฉ์๋ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ, ์์ธ ์ ๋ฌ์ ์ํํ๋ค.
ํ๋ ์์ ๋ฉ์๋ ํธ์ถ์ด ์๋ฃ๋๋ฉด ๊ฒฐ๊ณผ๊ฐ ์ ์์ด๋ ๊ฐ์์ค๋ฌ์ด ์ข
๋ฃ(์์ธ ๋ฐ์)์ด๋ ์๊ด์์ด ์์ด์ง๋ค.
Frame์ Local vaiable array, Operand Stack, Constant Pool Reference ์ด๋ ๊ฒ ์ธ๋ถ๋ถ์ผ๋ก ๋๋๋ค.
Local Variable : ๋ฉ์๋ ์์ ์ง์ญ ๋ณ์๋ค์ด ์๋ ๊ณต๊ฐ
Operand Stack : ๋ฉ์๋ ๋ด ์ฐ์ฐ์ ์ํด์, ๋ฐ์ดํธ ์ฝ๋ ๋ช
๋ น๋ฌธ๋ค์ด ๋ค์ด์๋ ๊ณต๊ฐ
Constant Pool Reference : Constant Pool ์ฐธ์กฐ๋ฅผ ์ํ ๊ณต๊ฐ
Class/Interface์ ๋ํ
Metadata๐ฌ
๋ฐ์ดํฐ์ ๊ดํ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ก, ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ค๋ช
ํด ์ฃผ๋ ๋ฐ์ดํฐ
๋ฅผ ์ ์ฅํ๋ค.
ํด๋์ค ๋ก๋์ ์ํด์ ๋ก๋๋ Class์ ์ ๋ณด(Class์ Method, Field์ด๋ฆ, Fieldํ์
, Class ์ด๋ฆ ๋ฑ)๊ฐ ์ฌ๊ธฐ์ ์ ์ฅ๋๋ค.
๋ํ, Runtime Constant Pool ๊ณผ static ๋ณ์์ ๊ฐ์ ๊ฒ๋ค๋ ์ ์ฅ์ด ๋๋ค.
Method Area๋ Heap Area์ ์ผ๋ถ์ผ ์๋ ์๊ณ ์๋ ์๋ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ ์ฅํ ์์น๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ ์ ์ ์ผ๋ก JVM ๊ตฌํ์ ๋ฌ๋ ค ์๋ค.
Java8 ๋ฒ์ ์ด์ ์์๋ Method Area๋ PermGen(Permanent Generation Space)์ ํ ๋น๋์๋ค.
Java8 ๋ฒ์ ์ดํ์๋ PermGen์ด ์์ ํ ์ ๊ฑฐ๋๊ณ Method Area๋ MetaSpace์ ํ ๋น๋๋ค.
PermGen์ OS, JVM ๋ฒ์ ๋ง๋ค ๊ฐ๊ธฐ ๋ค๋ฅธ default ๊ฐ์ ๊ฐ์ง๊ณ ์์๊ณ , ๋๋ถ๋ถ ์๊ฒ ํ ๋น๋์ด ์์๋ค.
๊ทธ๋์ ํด๋์ค ๋ก๋ฉ์ ๋ง์ด ํ๊ฒ ๋๋ฉด PermGen์ด ๋ถ์กฑํด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
MetaSpace๋ Class์ Metadata๋ฅผ Native ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ ๋ถ์กฑํ ๊ฒฝ์ฐ ์๋์ผ๋ก ๋๋ ค์ค๋ค.
Heap Area์ ๋ฉ์๋ ์์์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด๋ค์ ์ํ ์์ญ์ผ๋ก new๋ฅผ ํตํด ์์ฑ๋ ๊ฐ์ฒด, ๋ฐฐ์ด, immutal ๊ฐ์ฒด ๋ฑ์ ๊ฐ์ด ์ ์ฅ๋๋ค.
ํด๋น ์์ญ์์ ์์ฑ๋ ๊ฐ์ฒด๋ค์ JVM Stack Area์ ๋ณ์๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋์์ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์, Heap ์์๋ ์ฐธ์กฐ๋์ง ์๋ ์ธ์คํด์ค์ ๋ฐฐ์ด์ ๋ํ ์ ๋ณด ๋ํ ์์ ์ ์๊ธฐ ๋๋ฌธ์ GC ์ ์ฃผ ๋์์ด ๋๋ค.
Hotspot JVM์ ๋ฏธ๊ตญ์ Longview Technologies LLC๋ผ๋ ํ์ฌ์์ 1999๋ ์ ์ฒ์ ๋ฐํ๋ JVM์ด๋ค. ์ดํ ์ด ํ์ฌ๋ ๊ฐ์ ํด SUN์ ์ํด ์ธ์๋์ด 1.3๋ฒ์ ๋ถํฐ SUN์ ๊ธฐ๋ณธ์ ์ธ JVM์ด ๋์๋ค. Hotspot JVM์ ํ์ฌ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ JVM ์ค์ ํ๋๋ก Windows, Linux, Solaris๋ ๋ฌผ๋ก Mac OS์ ๊ธฐํ UJnix OS์๋ ํ์ฌ๊ฐ ๊ฐ๋ฅํ๋ค. HP Unix์์๋ Hotspot JVM์ ์ ๊ณตํ๊ณ ์๊ณ , ์ฌ์ง์ด Oracle์ ์ค์นํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์น๋์ด ๊ตฌ๋๋๋ JVM ์กฐ์ฐจ Hotspot JVM์ด๋ค. ๋ฐ๋ผ์ย Sun, Oracle, HP, Windows, Linux, MacOS์์ ์ ๊ณตํ๋ JVM์ Hotspot JVM์ผ๋ก ๋ช ๋ช ํ๊ณ IBM์์ ์ ๊ณตํ๋ JVM์ IBM JVM์ด๋ผ ๋ถ๋ฅด๊ธฐ๋ย ํ๋ค.
Hotspot JVM์ Heap์ ํฌ๊ฒ Young Generation๊ณผ Old Generation์ผ๋ก ๋๋์ด์ ธ ์๋ค.
Young Generation์ ๋ค์ Survivor ์์ญ๊ณผ Eden ์์ญ์ผ๋ก ๋๋๋ค.
Eden์์ญ์ Object๊ฐ Heap์ ์ต์ด๋ก ํ ๋น๋๋ ์ฅ์์ด๋ฉฐ, Eden์์ญ์ด ๊ฝ ์ฐจ๊ฒ ๋๋ฉด Object์ ์ฐธ์กฐ ์ฌ๋ถ๋ฅผ ๋ฐ์ ธ ์ฐธ์กฐ๊ฐ ๋์ด์๋ Object๋ผ๋ฉด Survivor ์์ญ์ผ๋ก ๋๊ธฐ๊ณ ์ฐธ์กฐ๊ฐ ๋์ด์์ง ์์ Garbage Object๋ผ๋ฉด ๊ทธ๋ฅ ๋จ๊ฒจ ๋๋๋ค.
์ฐธ์กฐ๋์ด์๋ ๋ชจ๋ Object๊ฐ Survivor์์ญ์ผ๋ก ๋์ด๊ฐ๋ฉด Eden์์ญ์ ๋ชจ๋ ์ฒญ์ํ๋ค.
Young Generation์์ GC๊ฐ ๋์ํ๋ ๊ฒ์ Minor GC๋ผ๊ณ ํ๋ค.
Survivor ์์ญ์ Eden ์์ญ์์ ๋์ด์จ Object๋ค์ด ๋จธ๋ฌด๋ฅด๋ ์ฅ์์ด๋ค.
Survivor ์์ญ์ ๋ ๊ฐ์ ์์ญ(Survivor1, Survivor2)์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
Survivor ์์ญ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฝ ์ฐจ๊ฒ ๋๋ฉดMinor GC๊ฐ ์๋ํ๋ค. ์๋ฅผ ๋ค์ด Survivor1์ด ๊ฐ๋์ฐจ์ GC๊ฐ ์๋ํ๋ฉด Survivor2๋ก ์ด๋ํ๊ฒ๋๋ค. ์ด๋ ๊ฒ ์ด์๋จ์ ๋ค๋ฅธ Survivor ์์ญ์ผ๋ก๊ฐ๋ฉด Object๋ค์ Age๊ฐ ์ฌ๋ผ๊ฐ๋ค.
(๋ฐ๋ผ์ Survovir์ ์์ญ์ค ํ ๊ณณ์ ๋ฐ๋์ ๋น์ด์๋ ์ํ์ด๋ค.)
์๋์ ๊ทธ๋ฆผ์ผ๋ก ์ค๋ช ์ ํ์ธํด๋ณด์.
Young Generation์์ ์ค๋ ์ด์๋จ์ ์ผ์ Age์ด์์ด ๋ Object๋ Promotion์ด ๋ฐ์ํด Old Generation ์์ญ์ผ๋ก ์ด๋ํ๋ค.
Old Generation ์์ญ์ด ์ฑ์์ง๋ค๊ฐ ๊ฐ๋์ฐจ๊ฒ ๋๋ฉด Young Generation ์์ ์ฒ๋ผ GC๊ฐ ๋์ํ๋๋ฐ ์ฌ๊ธฐ์ ๋์ํ๋ GC๋ Major GC๋ผ๊ณ ํ๋ค.
https://tecoble.techcourse.co.kr/post/2021-08-09-jvm-memory/ https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.6 https://stackoverflow.com/questions/17795597/method-area-of-java-and-stack-area https://mia-dahae.tistory.com/101 https://stackoverflow.com/questions/17474246/do-java-classes-metadata-go-on-the-heap https://blog.voidmainvoid.net/315 https://smjeon.dev/etc/jvm-gc/ https://12bme.tistory.com/382 https://alvinalexander.com/scala/fp-book/recursion-jvm-stacks-stack-frames/ http://www.herongyang.com/JVM/Stack-Overflow-What-Is-JVM-Stack.html https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8_%EC%B9%B4%EC%9A%B4%ED%84%B0 https://stackoverflow.com/questions/40666484/what-is-meant-by-each-jvm-thread-has-its-own-program-counter