๐ค ์๋ก์ด ์ ๋ณด๋ฅผ ์ฐพ์ผ๋ฉด ๊ณ์ ์ ๋ฐ์ดํธ ๋ ๊ธ์ ๋๋ค!
- ์๋ฐ์ ์คํ ๊ณผ์
- ์๋ฐ๋ JVM์ด OS๋ก๋ถํฐ ์ด ํ๋ก๊ทธ๋จ์ด ํ์๋ก ํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๋๋ค.
- ์๋ฐ ํ์ผ์ด ์๋ฐ ์ปดํ์ผ๋ฌ์ ์ํด ์๋ฐ ๋ฐ์ดํธ ์ฝ๋(.class)๋ก ๋ณํ๋๋ค.
- ํด๋์ค ๋ก๋๋ฅผ ํตํด ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ JVM์ผ๋ก ๋ก๋ฉํ๋ค.
- ํด์๋ ๋ฐ์ดํธ ์ฝ๋๋ ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ๋ฐฐ์น๋๋ค.
- ์คํ ์์ง์ ํตํด ์คํ๋๋ค.
- JVM์ ํ์์ ๋ฐ๋ผ GC์ ๊ฐ์ ์์ ์ ์ํํ๋ค.
JVM์ ๊ตฌ์กฐ
ํด๋์ค ๋ก๋
์๋ฐ๋ ๋์ ๋ก๋, ์ฆ ๋ฐํ์์ ํด๋์ค๋ฅผ ๋ก๋ํ๊ณ ๋งํฌํ๋ ํน์ง์ด ์๋ค. ์ด ๋์ ๋ก๋๋ฅผ ๋ด๋นํ๋ ๋ถ๋ถ์ด JVM์ ํด๋์ค๋ก๋์ด๋ค.
- ๋ก๋
- ์ฐ์ ํด๋์ค ๋ก๋๋ .class ํ์ผ์ ์ฝ๊ณ , ๊ทธ ๋ด์ฉ์ ๋ฐ๋ผ ์ ์ ํ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค๊ณ , ๋ฉ์๋ ์์ญ์ ์ ์ฅํ๋ ๋์์ ์ํํ๋ค.
- ๋งํฌ
- ๊ฒ์ฆ: ์ฝ์ด๋ค์ธ ํด๋์ค๊ฐ ์๋ฐ ์ธ์ด,JVM ๋ช ์ธ์ ๋ช ์๋ ๋๋ก ์ ๊ตฌ์ฑ๋์ด ์๋์ง ๊ฒ์ฌํ๋ค.
- ์ค๋น: ํด๋์ค๊ฐ ํ์ํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ , ํด๋์ค์์ ์ ์๋ ํ๋, ๋ฉ์๋, ์ธํฐํ์ด์ค๋ฅผ ๋ํ๋ด๋ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ค๋นํ๋ค.
- ๋ถ์: ์ฌ๋ณผ๋ฆญ ๋ฉ๋ชจ๋ฆฌ ๋ ํผ๋ฐ์ค(์ฐธ์กฐํ๋ ๋์์ ์ด๋ฆ๋ง์ ๊ฐ๊ณ ์์)๋ฅผ ๋ฉ์๋ ์์ญ์ ์๋ ์ค์ ๋ ํผ๋ฐ์ค๋ก ๊ต์ฒดํ๋ค. ์ฆ, ๊ทธ ์ด๋ฆ์ ๋ง๋ ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ์ฐพ์์ ์ฐ๊ฒฐํ๋ ์์ ์ ์งํํ๋ค.
- ์ด๊ธฐํ
- ํด๋์ค ๋ณ์๋ค์ ์ค์ ๋ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ค. (static ๋ณ์)
- ํด๋์ค๊ฐ ๋ก๋ฉ๋ ๋ static ๋ณ์๊ฐ ์์ฑ๋๊ณ , ๋ฉ๋ชจ๋ฆฌ์ ๋ฑ ํ๋ฒ๋ง ์ฌ๋ผ๊ฐ๋ค. public์ ๋ถ์ด๋ฉด ๊ฐ์ ํ๋ก๊ทธ๋จ ์ด๋์๋ ์ ๊ทผํ ์ ์๋ค.
ํ๋ง๋๋ก ์์ฝํ๋ฉด ํด๋์ค ๋ก๋๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ฝ๊ณ ๋ฉ์๋ ์์ญ์ ์ ์ฅํ๊ณ , ํด๋์ค๋ฅผ ๊ฒ์ฆํ๊ณ , ํด๋์ค๊ฐ ํ์๋ก ํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ,๊ฐ์ฒด์ ์ฃผ์๋ฅผ ์ฐ๊ฒฐํ๋ ์์ ์ ํ ํ, ํด๋์ค ๋ณ์ ๋ค์ ์ ์ ํ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ค.
์คํ ์์ง
- ์ธํฐํ๋ฆฌํฐ
- ์๋ฐ๋ ํ๋ซํผ ๋ ๋ฆฝ์ ์ด๊ณ , ์ด์์ฑ์ด ๋๋ค.
- ๊ฐ ํ๋ซํผ์ ๋ง๋ ์ธํฐํ๋ฆฌํฐ๊ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ ์ด๋ค OS์์๋ ์ง ์คํ๋ ์ ์๋ค.
- ์ธํฐํ๋ฆฌํฐ๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ํ ์ค์ฉ ์ฝ๊ณ , ์ด์์ฒด์ ๊ฐ ์คํํ ์ ์๋๋ก ๊ธฐ๊ณ์ด๋ก ๋ณ๊ฒฝํ๋ ์ญํ ์ ์ํํ๋ค. ๊ทธ๋ฌ๋ ์ธํฐํ๋ฆฌํฐ๋ ๋ฐ๋ณต ํธ์ถ๋๋ ๋ฉ์๋๋ฅผ ๋งค๋ฒ ์ธํฐํ๋ฆฌํ ํด์ผ ํด์ ๋นํจ์จ์ ์ด๋ค.
- ์๋ฐ๋ javac ๋ช ๋ น์ด๋ฅผ ํตํด ์ปดํ์ผํ๊ณ , ์ด ์ปดํ์ผ ๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ธํฐํ๋ฆฌํฐ๊ฐ ํ ์ค์ฉ ์ฝ์ผ๋ฉด์ ์ํํ๋ค. ๋ฐ๋ผ์ ์๋ฐ๋ ์ปดํ์ผ ์ธ์ด์ด๋ฉด์ ์ธํฐํ๋ฆฌํ ์ธ์ด์ด๋ค.
- Compiler VS Interpreter: https://velog.io/@jaeyunn_15/OS-Compiler-vs-Interpreter
- JIT ์ปดํ์ผ๋ฌ
- ์์ฃผ ์คํ๋๋ ๋ฐ์ดํธ ์ฝ๋ ์์ญ์ ๋ฐํ์ ์ค์ ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผํ์ฌ Native Method Stack์ ์ ์ฅ๋๋ฉฐ, ๋ณํ๋ ๋ถ๋ถ์ ์ธํฐํ๋ฆฌํฐ์ ์ํด ์คํ๋์ง ์๊ณ native code ํํ๋ก ๊ณง๋ฐ๋ก ์คํ๋๋ค. ์ธํฐํ๋ฆฌํฐ์ ๋จ์ ์ ๊ทน๋ณตํ๊ธฐ ์ํด ๊ณ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
- GC
- ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ค. ์ฐ์ ์์ธํ ๊ฒ์ ํ ์์ญ์ ๋ค๋ฃจ๊ณ ๋ฐ์์ ์ค๋ช ํ๊ฒ ๋ค.
์คํ ์์ง์ ๋ํด ์ ๋ง ์ ์ ๋ฆฌํด๋์ผ์ ๊ธ! : https://junhyunny.github.io/information/java/jvm-execution-engine/
๋ฉ๋ชจ๋ฆฌ ์์ญ
๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ๋ถ๋ถ
๋๋ถ๋ถ ์๋ช ์ด ๊ธด ๊ฒ๋ค์ ๋ค๋ฃจ๋ ๊ณต๊ฐ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
- ํ
- new ์ฐ์ฐ์๋ก ์์ฑ๋ ๊ฐ์ฒด, Array์ ๊ฐ์ ๋์ ์ผ๋ก ์์ฑ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ.
- Reference Type(Integer, String, ArrayList..) ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ด๋ค.
- Heap์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ Garbage Collector๊ฐ ์ฐธ์กฐ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ธํ๊ณ ์ ๊ฑฐํ๋ ์์ญ์ด๋ค.
- ๋ฉ์๋ ์์ญ
- ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก, ๋ฉ์๋ ์์ญ์ ํด๋์ค, ์ธํฐํ์ด์ค, ๋ฉ์๋, ํ๋, static ๋ณ์ ๋ฑ์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ณด๊ดํ๋ค.
- JVM์ ๋ฉ์ธ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์์ํ๋ค. ์ฐ๋ฆฌ๊ฐ ๋ฉ์ธ ๋ฉ์๋์์ ์ฌ์ฉํ๋ ํด๋์ค์ static ๋ณ์๊ฐ ์๊ณ , ๊ทธ๊ฒ๋ค์ด ๋ฉ์๋ ์์ญ์ ์ฌ๋ผ์จ๋ค.
- Runtime Constant Pool์ Type, Field, Method๋ก์ ๋ชจ๋ ๋ ํผ๋ฐ์ค๋ฅผ ์ ์ฅํ๋ฉฐ, JVM์ ์ฌ๊ธฐ๋ฅผ ํ์ํด์ ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ์ฐพ์ ์ฐธ์กฐํ๋ค.
์ค๋ ๋๋ง๋ค ํ๋์ฉ ์์ฑ๋๋ ๋ถ๋ถ
- ์คํ
- ์คํ ์์๋ ์ง์ญ๋ณ์, ๋งค๊ฐ๋ณ์, ๋ฆฌํด ๊ฐ๋ฑ๊ณผ ๊ฐ์ด ์ ์ ์ฌ์ฉ๋๊ณ ํ์ ์์ด์ง๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค.
- ์์ ํ์ ์ ๋ฐ์ดํฐ๋ค์ ๋ํด์ ์ค์ ๊ฐ์ ์คํ์ ์ง์ ์ ์ฅ๋๋ค.
- ์ง์ญ ๋ณ์์ด์ง๋ง ์ฐธ์กฐ ์๋ฃํ ๋ฐ์ดํฐ๋ค์ heap์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์ฃผ์๊ฐ์ ์คํ์ ์ ์ฅํด์ ์ฌ์ฉํ๊ฒ ๋๋ค.
- ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด stack ํ๋ ์์ด ํ๋ ์๋ก ์์ฑ๋์ด push๋๊ณ , ๊ทธ ์์์ ๋ฉ์๋์ ๊ด๊ณ๋ ์ง์ญ๋ณ์, ๋งค๊ฐ ๋ณ์ ๋ฑ์ ์คํ ์์ญ์ ์ ์ฅํ๋ค. ํธ์ถ์ด ์๋ฃ๋๋ฉด pop๋๋ค.
- PC Register
- ์ค๋ ๋๊ฐ ์ด๋ ๋ช ๋ น์ด๋ฅผ ์ฒ๋ฆฌํ๊ณ ์๋์ง ์ฃผ์๋ฅผ ๋ฑ๋กํ๋ค.
- JVM์ด ์คํํ๊ณ ์๋ ํ์ฌ ์์น๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ : ์คํ์ ์์น๋ฅผ ๋ํ๋ด๊ณ ์๋ค.
- Native Method Stack
- ์๋ฐ ์ธ ์ธ์ด๋ก ์์ฑ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ค.
Garbage Collector
- Garbage Collector(์ดํ GC)๋ ์ ํ์ํ ๊น?
- ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด ์ ํจํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ์ธ Garbage๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. c++๊ฐ์ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ค์ผํ์ง๋ง, java๋ ์ฝํ๋ฆฐ์ ์ฌ์ฉํ๋ฉด JVM์ GC๊ฐ ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์์ ์ ๋ฆฌํด์ค๋ค.
- GC์ ์๋ฆฌ๋ฅผ ์ค๋ช
ํ๊ธฐ ์ํด์ Heap์ ๊ตฌ์กฐ๋ฅผ ์ดํดํด์ผ ํ๋ค.
- JVM์ Heap ์์ญ์ ์ฒ์ ์ค๊ณ๋ ๋ 2๊ฐ์ง๋ฅผ ์ ์ ๋ก ํ๊ณ ์ค๊ณ๋์๋ค.
- ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ๊ธ๋ฐฉ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ ์ํ๊ฐ ๋๋ค.
- ์ค๋๋ ๊ฐ์ฒด์์ ์๋ก์ด ๊ฐ์ฒด์์ ์๋ก์ด ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ์์ฃผ ๋๋ฌผ๋ค.
- ๊ฐ์ฒด๋ ๋๋ถ๋ถ ์ผํ์ฑ์ด๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ์ ์ค๋ ๋จ์์๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌผ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด ์์กด ๊ธฐ๊ฐ์ ๋ฐ๋ผ ๋ฌผ๋ฆฌ์ ์ธ Heap ์์ญ์ ๋๋๊ฒ ๋์๋ค.
- JVM์ GC๋ Unreachable Object๋ฅผ ์ฐ์ ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๋ค. Unreachable Object๋ Stack์์ ๋๋ฌํ ์ ์๋ Heap ์์ญ์ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค.
- JVM์ Heap ์์ญ์ ์ฒ์ ์ค๊ณ๋ ๋ 2๊ฐ์ง๋ฅผ ์ ์ ๋ก ํ๊ณ ์ค๊ณ๋์๋ค.
- GC ์๊ณ ๋ฆฌ์ฆ
- Stop The World
- ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์คํํ๊ธฐ ์ํด JVM์ด ์ดํ๋ฆฌ์ผ์ด์ ์ ์คํ์ ๋ฉ์ถ๊ฒ ๋๋ค. ๋น์ฐํ ๋ชจ๋ ์ค๋ ๋๋ค์ ์์ ์ด ์ค๋จ๋๋ฉด ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ฉ์ถ๊ฒ ๋๊ณ , GC์ ์ฑ๋ฅ ๊ฐ์ ์ ์ํด ํ๋์ ํ๋ค๋ ๊ฒ์ ์ด Stop the world ์๊ฐ์ ์ค์ด๋ ค๊ณ ํ๋ ๊ฒ์ด๋ค.
- Mark And Sweep
- JVM์ GC๊ฐ ์คํ์ ๋ชจ๋ ๋ณ์๋ฅผ ์ค์บํ๋ฉด์ ๊ฐ๊ฐ ์ด๋ค Object๋ฅผ ๋ ํผ๋ฐ์คํ๊ณ ์๋์ง ์ฐพ๋ ๊ณผ์ ์ด Mark๋ค. Reachable Object๊ฐ ๋ ํผ๋ฐ์คํ๊ณ ์๋ Object๋ํ ๋งํนํ๋ค.
- ๊ทธ๋ฆฌ๊ณ Mark๋์ง ์์ ๋ชจ๋ ์ค๋ธ์ ํธ๋ค์ ํ์์ ์ ๊ฑฐํ๋ ๊ณผ์ ์ด Sweep์ด๋ค.
- Mark And Sweep์ ๊ณผ์ (Java 8๊ธฐ์ค)
- ๋จผ์ Eden ์์ญ์ด ๊ฝ ์ฐจ๋ฉด Minor GC๊ฐ ๋ฐ์ํ๋ค.
- ์ด๋ Reachable์ด๋ผ๊ณ ํ๋จ๋ ๊ฐ์ฒด๋ Surivival 0 ์์ญ์ผ๋ก ์ฎ๊ฒจ์ง๋ค. minor gc์์ ์ด์๋จ์ ๊ฐ์ฒด๋ age bit๊ฐ 1์ฉ ์ฆ๊ฐํ๋ค.
- ๋๋ค์ Eden ์์ญ์ด ๊ฝ ์ฐจ๋ฉด Minor GC๊ฐ ๋ฐ์ํ๊ณ , Reachable์ด๋ผ๊ณ ํ๋จ๋ ๊ฐ์ฒด๋ค์ Survival 1 ์์ญ์ผ๋ก ์ด๋ํ๋ค.
- ์ด๋ฅผ ๊ณ์ ๋ฐ๋ณตํ๋ค๊ฐ ์ผ์ ์์ค์ age bit๊ฐ ๋์ด๊ฐ๋ฉด Old Generation์ผ๋ก ๋๊ฒจ์ฃผ๋๋ฐ, ์ด๋ฅผ Promotion์ด๋ผ๊ณ ํ๋ฉฐ, age bit๊ฐ 15๊ฐ ๋๋ฉด Promotion์ด ์งํ๋๋ค.
- ์ด๋ Old Generation์ด ๋ค ์ฐจ๋ฉด Major GC๊ฐ ๋ฐ์ํ๋ค.
- Major GC๋ ๊ฐ์ฒด๋ค์ด ๊ณ์ ํ๋ก๋ชจ์ ๋์ด Old ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋ฉด ๋ฐ์ํ๋ค. Young ์์ญ์ old ์์ญ์ ๋นํด ํฌ๊ธฐ ์๊ธฐ ๋๋ฌธ์ ๋ณดํต 1์ด ์์ ๋๋๊ธฐ ๋๋ฌธ์ Minor GC๋ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ์ฃผ์ง ์์ง๋ง, Major GC๋ ์ผ๋ฐ์ ์ผ๋ก Minor GC์ ๋นํด 10๋ฐฐ ์ด์์ผ๋ก ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค.
- ๋จผ์ Eden ์์ญ์ด ๊ฝ ์ฐจ๋ฉด Minor GC๊ฐ ๋ฐ์ํ๋ค.
- Stop The World
GC์ ์ข ๋ฅ์๋ ์ด๋ค ๊ฒ๋ค์ด ์์๊น?
- Serial GC
- Serial GC์ young ์์ญ์ Mark Sweep ๋๋ก ์ํ๋๋, Old์์ญ์์ Mark Sweep Compact ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉ๋๋ค. c์ถ๊ฐ๋ Compact ๋จ๊ณ๋ Heap ์์ญ์ ์ ๋ฆฌํ๊ธฐ ์ํ ๋จ๊ณ๋ก, ์ ์ฉํ ๊ฐ์ฒด๋ค์ด ์ฐ์๋๊ฒ ์์ด๋๋ก ํ์ ๊ฐ์ฅ ์ ๋ถ๋ถ๋ถํฐ ์ฑ์์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ๋ถ๋ถ๊ณผ ์กด์ฌํ์ง ์๋ ๋ถ๋ถ์ผ๋ก ๋๋๊ฒ ๋๋ค.
- Serial GC๋ ์๋ฒ์ CPU ์ฝ์ด๊ฐ 1๊ฐ์ผ ๋ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ๋ฐ๋์์ผ๋ฉฐ, ๋ชจ๋ GC์ ์ญํ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด 1๊ฐ์ ์ฐ๋ ๋๋ง์ ์ฌ์ฉํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ CPU ์ฝ์ด๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ์ด์ ์๋ฒ์์ Serial GC๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๋์ ํผํด์ผ ํ๋ค.
- Parellel GC
- Java 8๊น์ง Default GC๋ก ์ฌ์ฉ๋์๋ค. ๊ทธ๋ผ์๋ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ฉ์ถ๋ ๊ฒ์ ํผํ ์ ์์๊ณ , ์ด๋ฌํ ๋ถ๋ถ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ๋ค์ด ๋ฑ์ฅํ๊ฒ ๋์๋ค.
- ๊ธฐ๋ณธ์ ์ธ ์ฒ๋ฆฌ ๊ณผ์ ์ Serial GC์ ๋์ผํ๋, Parallel GC๋ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๋ฅผ ํตํด Parellelํ๊ฒ GC๋ฅผ ์ํํจ์ผ๋ก์จ GC์ ์ค๋ฒํค๋๋ฅผ ์๋นํ ์ค์ฌ์ค๋ค. Parellel GC๋ ๋ฉํฐ ํ๋ก์ธ์ ๋๋ ๋ฉํฐ ์ค๋ ๋ ๋จธ์ ์์ ์ค๊ฐ ๊ท๋ชจ๋ถํฐ ๋๊ท๋ชจ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ํด ๊ณ ์๋์๋ค.
- CMS GC (Concurrent Mark Sweep)
- ๊ธฐ์กด GC์๋ ๋ค๋ฅด๊ฒ ์ดํ๋ฆฌ์ผ์ด์ ์ค๋ ๋์ Mark-Sweep ์๊ณ ๋ฆฌ์ฆ์ Concurrentํ๊ฒ ์ํํ๋ค.
- CMS GC๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ง์ฐ ์๊ฐ์ ์ต์ํํ๊ธฐ ์ํด ๊ณ ์๋์์ผ๋ฉฐ, ์ดํ๋ฆฌ์ผ์ด์ ์ด ๊ตฌ๋์ค์ผ ๋ ํ๋ก์ธ์์ ์์์ ๊ณต์ ํ์ฌ ์ด์ฉํ ์ ์์ด์ผ ํ๋ค. CMS GC๊ฐ ์ํ ๋ ๋๋ ์์์ด GC๋ฅผ ์ํด์๋ ์ฌ์ฉ๋๋ฏ๋ก, ์๋ต์ด ๋๋ ค์ง ์๋ ์์ผ๋ ๋ฉ์ถ์ง ์๊ฒ ๋๋ค.
- CMS GC๋ ๋ค๋ฅธ GC๋ณด๋ค ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์๋ก ํ๋ฉฐ, Compaction ๋จ๊ณ๋ฅผ ์ํํ์ง ์๋๋ค๋ ๋จ์ ์ด ์๋ค. ์ถํ์ ๋ฉ๋ชจ๋ฆฌ ๋จํธํ๋ก ์ธํด Compaction ์์ ์ ์ํํ๋๋ฐ, ์ด ๋์ Compaction ์์ ์ด Parallel GC๋ณด๋ค ์ค๋ ์์๋ ์ ์๋ค.
- ํด๋น ๋ฐฉ์์ java9๋ฒ์ ๋ถํฐ Deprecated๋์๋ค.
- G1 GC
- Java 9์์๋ถํฐ ์ฑํ๋ G1 GC๋ ์ฐ๋ฆฌ๊ฐ ์๋ ํ ๊ตฌ์กฐ์๋ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ๋์ํ๋ค.
- Eden, Survivor, Old ์์ญ์ด ๊ณ ์ ๋ ํฌ๊ธฐ๊ฐ ์๋๋ฉฐ, ์ ์ฒด ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ Region์ด๋ผ๋ ํน์ ํ ํฌ๊ธฐ๋ก ๋๋๋ค. Region์ ์ํ์ ๋ฐ๋ผ ๊ทธ Region์ ์ญํ (Eden..)์ด ๋์ ์ผ๋ก ๋ณ๋ํ๋ค. ๋ํ ๋ ์์ญ์ด ์ถ๊ฐ๋์ด์๋ค.
- Humonogous : region ํฌ๊ธฐ์ 50%๋ฅผ ์ด๊ณผํ๋ ํฐ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๊ณต๊ฐ
- Available/Unused: ์์ง ์ฌ์ฉ๋์ง ์์ Region์ ์๋ฏธํ๋ค.
- Minor GC
- ํ ์ง์ญ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ค๊ฐ ํด๋น ์ง์ญ์ด ๊ฝ ์ฐจ๋ฉด ๋ค๋ฅธ ์ง์ญ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ณ , Minor GC๊ฐ ์ํ๋๋ค. G1 GC๋ ๊ฐ ์ง์ญ์ ์ถ์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋น์ง๊ฐ ๊ฐ์ฅ ๋ง์ ์ง์ญ์ ์ฐพ์์ Mark and Sweep์ ์ํํ๋ค.
- Eden ์์ญ์์ GC๊ฐ ์ํ๋๋ฉด ์ด์๋จ์ ๊ฐ์ฒด๋ฅผ markํ๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ฅผ sweepํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์๋จ์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ์ง์ญ์ผ๋ก ์ด๋์ํค๋๋ฐ, ์ด ์ง์ญ์ด Available/unused ์ง์ญ์ด๋ฉด ์ด ์์ญ์ด ์ด์ Survivor ์์ญ์ด ๋๊ณ , Eden ์์ญ์ด Available/Unused ์ง์ญ์ผ๋ก ๋ฐ๋๋ค.
- Major GC
- ์์คํ ์ด ๊ณ์ ์ด์๋๋ค๊ฐ, ๊ฐ์ฒด๊ฐ ๋๋ฌด ๋ง์ ๋น ๋ฅด๊ฒ ๋ฉ๋ชจ๋ฆฌ ํ์๊ฐ ์๋ ๋ Major GC๊ฐ ์ํ๋๋ค. ์ฌ๊ธฐ์ G1 GC์ ๋ค๋ฅธ GC์ ์ฐจ์ด์ ์ ๋ฐ๊ฒฌํ ์ ์๋ค. ๊ธฐ์กด์ ๋ค๋ฅธ GC ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ heap์ ์์ญ์์ GC๊ฐ ์ํ๋์์ผ๋ฉฐ, ๊ทธ์ ๋ฐ๋ผ ์ฒ๋ฆฌ ์๊ฐ์ด ์๋นํ ์ค๋๊ฑธ๋ ธ๋ค.
- ๊ทธ๋ฌ๋ G1 GC๋ ์ด๋ ์์ญ์ ๊ฐ๋น์ง๊ฐ ๋ง์์ง๋ฅผ ์๊ณ ์๊ธฐ ๋๋ฌธ์ GC๋ฅผ ์ํํ ์์ญ์ ์กฐํฉํ๊ณ , ํด๋น ์์ญ์์๋ง GC๋ฅผ ์ํํ๋ค. ์ด๋ฌํ ์์ ์ Concurrentํ๊ฒ ์ํ๋๊ธฐ ๋๋ฌธ์ ์ง์ฐ์ด ํฌ์ง ์์ผ๋ฉฐ, ๊ฐ๋น์ง๊ฐ ๋ง์ ์ง์ญ์ ์ ๋ฆฌํ๊ฒ ๋๋ฏ๋ก ํจ์จ์ ์ด๋ค.
- G1 GC์ ๊ณผ์ ์ ์ด๋ณด๋ค ํจ์ฌ ๋ณต์กํ๋ค. ์ฐ์ ์ ๊ฐ๋ ์ ๋๋ฅผ ์๊ณ ๋์ด๊ฐ๋๋ก ํ๊ณ ์ถํ์ ๊ธ์ ํ๋ ๋ ํ ๋นํด์ ์ ์ด๋ณด๋๋ก ํ๊ฒ ๋ค.
๐ค ๊ทธ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ์ ์ค์ํ๋ฐ? ๋ญ ์ด๋ ๊ฒ๊น์ง ๋ค ์์์ผ ํด..? ๊ฐ ๊ถ๊ธํด์ง๋ค๋ฉด.. ์ด ์์ ๋ ๋ ๊ธด๊ธด ์๊ธฐ๋ค์ ๋ด๊ฐ ๋ช ๋ฌ ์ ์ฒ์ ๋ง๋ OOME๋ผ๋ ์๋ฌ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๋ฐ๋ฐฅ์ด์๋ค.
OOME๋?
java.lang.OutOfMemoryError๋ jvm์ด ํ ๋ฉ๋ชจ๋ฆฌ์ ๋์ด์ Object๋ฅผ ํ ๋นํ ์ ์์ ๋ ๋ฐ์ํ๋ค.
- OOME์ ์ข
๋ฅ
- Java Heap Space : Java์ Heap ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ (๋ํดํธ 64MB)
- PermGen Space : ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ ์ค Permenant ์์ญ์ String Pool, Class Method์ ๊ด๋ จ๋ ๊ฐ์ข ๋ฉํ ๋ฐ์ดํฐ๋ฑ์ ์ ์ฅํ๋ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค. ๋ฐ๋ผ์ JVM ๊ธฐ๋ ์์ ๋ก๋ฉ๋๋ Class ๋๋ String์ ์๊ฐ ๋ง์ ๊ฒ์ด ์์ธ์ด ๋๋ค.
- ๋ด๊ฐ ๋ง๋ OOME - Java Heap Space
- ํด๊ฒฐ ๋ฐฉ๋ฒ
- -Xmx ์ต์ ์ ์ฌ์ฉํ์ฌ Heap Memory์ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ์ํค๋ ๋ฐฉ๋ฒ์ด ์์ง๋ง, GC Time์ ์ฆ๊ฐ์ํค๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ์คํธ๊ฐ ํ์ํ๋ค.
- ๋๋ OOME๊ฐ ๋ฐ์ํ ์์ ์ ์์ฑ๋ Heap Dump ๋ถ์์ ๊ธฐ๋ฐ์ผ๋ก ์ธ๋ฐ์์ด ๋ง์ Memory๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ Memory Leak๋ฅผ ์ ๋ฐํ๋ ๋ก์ง์ ์ฐพ์๋ด์ด ์์ ํ๋ค.
- Heap ๋ชจ๋ํฐ๋ง ๋ฐฉ๋ฒ - Heap Dump
- VisualVM, MAT ๋ฑ์ ํด์ ์ฌ์ฉํ ์๋ ์์ผ๋, IntellJ์์ VM option์ ์ถ๊ฐํ๋ฉด ์๋์ผ๋ก ํ ๋คํ๋ฅผ ๋ ์ฃผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค.
- ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๋์์ ํ์ผ ์ ๋ก๋ API์ ํ ๋คํ๋ฅผ ํ์ธํด๋ณธ ๊ฒฐ๊ณผ byte[] ๋ฐฐ์ด์ด ๊ณผ๋ํ๊ฒ ์์ฑ์ด ๋๋๋ฐ, byte[]๋ ๊ธ๋ฐฉ ์ฐ๊ณ , ๋ฒ๋ฆฌ๋ ์ฌ์ฉ ๋น๋ ์๊ฐ ๋๊ธฐ ๋๋ฌธ์ GC๊ฐ ์์ฃผ ์๋ํ๊ฒ ๋๊ณ , ์ฑ๋ฅ์ ์ํฅ์ ์ค๋ค. ๋ก์ง์ ๋ฌธ์ ์ ์ ๋์์ ํ์ผ์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ ๋ฐ์ ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ๋ฅผ ๋ฏ์ด๋ณด๋, ByteArrayOutputStream์ ์ฌ์ฉํ๋ฉด์ ๋ชจ๋ byte[] ๋ฐฐ์ด์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ฅํด๋๊ณ ์์๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ํด๋น API๋ก ๊ตณ์ด MultipartFile์ byte array๋ก ๋ณ๊ฒฝํ๊ณ -> ๊ทธ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋ฆฌํดํ๋ ๋์ file์ ํฌ๊ธฐ๋ฅผ ๋ฐ๋ก ๋ฆฌํดํ๋๋ก ์ฌ์ฉํ๋ MulipartFile์ getSize() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝํ์๋ค.
- https://linked2ev.github.io/java/2021/05/16/Java-FILE-(6)-ByteArrayInputStream-%EA%B3%BC-ByteArrayOutputStream-%EB%B0%94%EC%9D%B4%ED%8A%B8-%EB%B0%B0%EC%97%B4-%EC%8A%A4%ED%8A%B8%EB%A6%BC/
- https://stackoverflow.com/questions/7255232/java-memory-efficient-bytearrayoutputstream
- ๋ญ ๋๋จํ ๋ก์ง์ ์์ ํ ๊ฒ์ ์๋์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ํ API ์ฑ๋ฅ์ ์ง๋ํ ์ํฅ์ ๋ฏธ์น ์ ์๋ค๋ ์ ์ ๊นจ๋ซ๊ณ ํ ๋ฒ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ํ ๊ณต๋ถ๋ ํด๋ณด๊ณ ์๋ ์ค์ด๋ค! ์๋ฐ๋ ์ด๋ ต๋ค~
๐ ์ฐธ๊ณ ์๋ฃ
https://steady-coding.tistory.com/305
https://mangkyu.tistory.com/118
https://jeong-pro.tistory.com/148
'Computer Science > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JAVA) ์ค๋ ๋ (0) | 2019.12.09 |
---|---|
JAVA) ์ด๋ฒคํธ ๊ตฌ๋ ํ๋ก๊ทธ๋๋ฐ (0) | 2019.12.07 |
Java -GUI ํ๋ก๊ทธ๋๋ฐ (0) | 2019.12.05 |
Java) ์ ์ถ๋ ฅ ์คํธ๋ฆผ- 11์ฃผ์ฐจ ์์ (0) | 2019.12.03 |