JVM
JVM ๊ตฌ์ฑ์์
- ์ ์ ๋ชจ๋ ์ดํ๋ฆฌ์ผ์ด์ ํ๋ก์ธ์ค, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ์ฉ, ๋จธ์ ์ผ๋ก์ ์ฐ์ฐ, os์ ์ผ๋ถ๊ธฐ๋ฅ
- jvm ๊ตฌ์ฑ์์
- ํด๋์ค ๋ก๋(Class Loader)
- ์๋ฐ ํด๋์ค ํ์ผ(.class)์ ๋ก๋ํ๊ณ ๋งํฌํ๋ ์ญํ
- ๋ก๋ฉ, ๋งํน, ์ด๊ธฐํ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋จ
- ๋ถํธ์คํธ๋ฉ ํด๋์ค ๋ก๋, ํ์ฅ ํด๋์ค ๋ก๋, ์ ํ๋ฆฌ์ผ์ด์ ํด๋์ค ๋ก๋๋ก ๊ตฌ์ฑ
- ํด๋์ค ๋ก๋ฉ ๋งํน๋ฑ์ด ๋ฐํ์์ ์ผ์ด๋ ์ ์๋ค.
- ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ(Runtime Data Area)
- ๋ฉ์๋ ์์ญ(Method Area): ํด๋์ค ๊ตฌ์กฐ, ๋ฉ์๋ ๋ฐ์ดํฐ, ์์, ์ ์ ๋ณ์ ๋ฑ ์ ์ฅ
- ํ(Heap): ๊ฐ์ฒด์ ์ธ์คํด์ค ๋ณ์๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ
- ์คํ(Stack): ์ค๋ ๋๋ง๋ค ๋ณ๋๋ก ์กด์ฌํ๋ฉฐ ์ง์ญ ๋ณ์, ๋งค๊ฐ๋ณ์, ๋ฆฌํด ๊ฐ ๋ฑ ์ ์ฅ
- PC ๋ ์ง์คํฐ(Program Counter Register): ํ์ฌ ์คํ ์ค์ธ ๋ช ๋ น์ด ์ฃผ์ ์ ์ฅ
- ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ(Native Method Stack): ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์ํ ์คํ
- ์คํ ์์ง(Execution Engine)
- ์ธํฐํ๋ฆฌํฐ(Interpreter): ๋ฐ์ดํธ์ฝ๋๋ฅผ ํ ์ค์ฉ ํด์ํ๊ณ ์คํ
- JIT ์ปดํ์ผ๋ฌ(Just-In-Time Compiler): ์์ฃผ ์ฌ์ฉ๋๋ ์ฝ๋๋ฅผ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ปดํ์ผํ์ฌ ์ฑ๋ฅ ํฅ์
- ๊ฐ๋น์ง ์ปฌ๋ ํฐ(Garbage Collector): ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ์๋ ์ ๋ฆฌ
- ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์ธํฐํ์ด์ค(JNI, Java Native Interface)
- ์๋ฐ ์ฝ๋๊ฐ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ C, C++ ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํธ์์ฉํ ์ ์๊ฒ ํจ
- ๋ค์ดํฐ๋ธ ๋ฉ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Native Method Libraries)
- C, C++ ๋ฑ์ผ๋ก ์์ฑ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชจ์
- ํด๋์ค ๋ก๋(Class Loader)
ํด๋์ค๋ก๋
.class file(์คํ ๋ฐ์ด๋๋ฆฌ)
ClassFile {
u4 magic; // ๋งค์ง๋๋ฒ(0xCAFEBABE), JVM์ด ์ ํจํ ํด๋์ค ํ์ผ์ธ์ง ์๋ณ
u2 minor_version; // ํด๋์ค ํ์ผ ํฌ๋งท์ ๋ง์ด๋ ๋ฒ์
u2 major_version; // ํด๋์ค ํ์ผ ํฌ๋งท์ ๋ฉ์ด์ ๋ฒ์
u2 constant_pool_count; // ์์ ํ ํญ๋ชฉ ์ + 1
cp_info constant_pool[constant_pool_count-1]; // ์์ ํ ํ
์ด๋ธ
u2 access_flags; // ํด๋์ค์ ์ ๊ทผ ์ ์ด์
u2 this_class; // ํ์ฌ ํด๋์ค๋ฅผ ๋ํ๋ด๋ ์์ ํ ์ธ๋ฑ์ค
u2 super_class; // ๋ถ๋ชจ ํด๋์ค๋ฅผ ๋ํ๋ด๋ ์์ ํ ์ธ๋ฑ์ค
u2 interfaces_count; // ๊ตฌํ๋ ์ธํฐํ์ด์ค ์
u2 interfaces[interfaces_count]; // ๊ตฌํ๋ ์ธํฐํ์ด์ค๋ค์ ์์ ํ ์ธ๋ฑ์ค
u2 fields_count; // ํ๋ ์
field_info fields[fields_count]; // ํ๋ ์ ๋ณด
u2 methods_count; // ๋ฉ์๋ ์
method_info methods[methods_count]; // ๋ฉ์๋ ์ ๋ณด
u2 attributes_count; // ์์ฑ ์
attribute_info attributes[attributes_count]; // ํด๋์ค์ ์ถ๊ฐ ์์ฑ ์ ๋ณด
}
- ์ถ๊ฐ์ ์ผ๋ก .class๋ฅผ ๋ณด๊ณ ์ค์ ๋ค์ดํฐ๋ธ ๋จธ์ ์ฝ๋๋ก interprete, ๋ฐ๋ณต๋๋ ์ ๋ค์ ๋ฏธ๋ฆฌ ๋ฒ์ญํด๋๋(์ปดํ์ผ) ์ ๋ค์ด jit compiler
- ์ด๋ฆ์ ์๊ณ ์๋ ํน์ ํด๋์ค์ ๋ํ ์ ์(byte stream)์ ๊ฐ์ ธ์ค๋ ์ญํ ์ ์ํ
- ๊ฐ์ ธ์จ๋ค๋ ๊ฒ์ ๋คํธ์ํฌ๋ฅผ ํตํด ๊ฐ์ ธ์ค๋๊ฒ์ ํฌํจ
- ๋ถํธ์คํธ๋ฉ ํด๋์ค ๋ก๋
- (๋น์ ํ์๋ง, ์ค์ cpu์ ๋ถํธ๋ก๋๊ฐ ํ์ํ์ผ์ ๋ง์น๊ณ , os์ฝ๋์ ์ง์ ์ง์ ์ ์คํ์ํค๊ณ ์ข ๋ฃ๋๋๋ฐ ๋ง์ฐฌ๊ฐ์ง)
- jvm์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ทจ๊ธ๋๋๊ฒ๋ค(rt.jar, tools.jar)์ ๋ก๋
- ํ๋ซํผ ํด๋์ค ๋ก๋ (๊ธฐ์กด ํ์ฅ ํด๋์ค ๋ก๋)
- ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ก๋
- ์ดํ๋ฆฌ์ผ์ด์ ํด๋์ค ๋ก๋
- ๋ถํธ์คํธ๋ฉ ํด๋์ค ๋ก๋
- Java ํด๋์ค ๋ก๋ฉ
- java๋ ์คํ๊ณผ์ ์ ๋งํน ๊ณผ์ ์ด ํฌํจ๋์ด์์
- ๊ธฐ์กด์ ์ปดํ์ผ - ๋งํฌ - ๋ฐํ์๋ณด๋ค๋
- ์ค์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ก๋ฉํ๊ณ , ๋งํฌ ๋ฐํ์์ด ์คํ๋จ๊ณ์ ๋ถ๋ฅ๋์ด์์
- ์ค์ง์ ์ผ๋ก๋ Loading -> Linking -> Using -> Unloading(GC)
- ํด์ (Resolution)๋จ๊ณ๋ ๋์ ๋ฐ์ธ๋ฉ(ํน์ lazy binding)์ ์ง์ํ ๋ชฉ์ ์ผ๋ก ์ด๊ธฐํ ํ๋ก ์ง์ฐ๋ ์์์
ํด๋์ค ๋ก๋๊ฐ ํ๋ ์ผ
- ํด๋์ค ๊ฒ์ฆ
- ๊ท์น๊ณผ ์ ์ฝ์ ๋ง์กฑํ๋์ง
- ํ์ผํ์
- ๋ฉํ๋ฐ์ดํฐ
- ๋ฐ์ดํธ์ฝ๋
- ์ฌ๋ฒ์ฐธ์กฐ
- ๋ณด์์ํ์ ๋ํ ๊ฒ์ฆ ํฌํจ
- ๊ท์น๊ณผ ์ ์ฝ์ ๋ง์กฑํ๋์ง
- ์ค๋น ๋ฐ ํด์
- java.lang.Class ์ธ์คํด์ค(๋ฉํ๋ฐ์ดํฐ)๊ฐ ํ ์์ญ์ ์์ฑ, ํด๋์ค ๋ณ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ 0์ผ๋ก ์ด๊ธฐํ
- ๋ก๋๋๋ ํด๋์ค์ ์ธ์คํด์ค๋ Using๋จ๊ณ์์ ํ์ฌ์ฉ
- final์ ์ธ๋ ๋ณ์ ์ ๋ฆฌ
- ์์ฑ์ ํธ์ถ ์ ์ํ
- ํ๋ ์ด๊น๊ฐ์ ์์ฑ์ ํธ์ถ์ ์ ์
- ์ ์ ํ๋์ ์ด๊ธฐ๊ฐ ํ ๋น
- ํด์์ ์์ํ์ ์ฌ๋ฒ ์ฐธ์กฐ๋ฅผ ์ง์ ์ฐธ์กฐ๋ก ๋์ฒดํ๋ ๊ณผ์
- java.lang.Class ์ธ์คํด์ค(๋ฉํ๋ฐ์ดํฐ)๊ฐ ํ ์์ญ์ ์์ฑ, ํด๋์ค ๋ณ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ 0์ผ๋ก ์ด๊ธฐํ
- Heap ์์ญ์ ๊ฐ์ฒด ์์ฑ
- jvm์ ๊ฐ์ฒด ์ ์ฅ์ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณด ํ 0์ผ๋ก ์ด๊ธฐํ (๊ฐ์ฒด ํค๋ ์ ์ธ)
- ๊ฐ์ฒด ์ด๊ธฐํ๋ฅผ ์ํ ๊ตฌ์ฑ์ค์ ์ค์
- ๊ธฐ๋ณธ์ ์ผ๋ก object header, instance data, padding์ผ๋ก ๋์ด์์
- object header(์ klass word)๋ฅผ ํตํด ์๊น ๋ก๋ํ metadata์ ์ ๊ทผ
- ํด๋์ค ์ด๋ฆ ๋ฐ ๋ฉํ ์ ๋ณด ํ์ธ ๋ฐฉ๋ฒ
- ๊ฐ์ฒด์ ๋ํ ํด์์ฝ๋
- GC์ธ๋ ๋์ด
- ๊ธฐ๋ณธ์ ์ผ๋ก object header, instance data, padding์ผ๋ก ๋์ด์์
- ์์ฑ์ ํธ์ถ
๋ฐํ์ ๋ฐ์ดํฐ ์์ญ
ํ๋ก๊ทธ๋จ ์นด์ดํฐ
- ํ๋ก๊ทธ๋จ ์นด์ดํฐ ๋ ์ง์คํฐ๋ ์์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก ํ์ฌ ์คํ์ค์ธ ์ค๋ ๋์ โ๋ฐ์ดํธ ์ฝ๋ ์ค ๋ฒํธ ํ์๊ธฐโ๋ผ๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค.
- ๋ฐ์ดํธ์ฝ๋ ์ธํฐํผ๋ฅดํฐ๋ ์ด ์นด์ดํฐ ๊ฐ์ ๋ฐ๊ฟ ๋ค์์ ์คํํ ๋ฐ์ดํธ์ฝ๋ ๋ช ๋ น์ด๋ฅผ ์ ํํ๋์์ผ๋ก ๋์
- ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ, ๋ถ๊ธฐ, ์ํ, ์ ํ๋ฑ์ ํํ
- ์์ธ์ฒ๋ฆฌ๋ ์ค๋ ๋๋ณต์๊ฐ์ ๊ธฐ๋ฅ์ด ์ด ํ์๊ธฐ๋ฅผ ํ์ฉํด ๋์
- jvm์ ๋ฉํฐ์ค๋ ๋ฉ์ cpu์ฝ์ด๋ฅผ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ต๋๋ก ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋๊ธฐ ๋๋ฌธ์, ํน์ ์๊ฐ์ ํ ์ฝ์ด๋ ํ ์ค๋ ๋์ ๋ช ๋ น์ด๋ง ์คํํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ค๋ ๋ ์ ํ ํ ์ด์ ์ ์คํํ๋ค ๋ฉ์ถ ์ง์ ์ ์ ํํ๊ฒ ๋ณต์ํ๋ ค๋ฉด ์ค๋ ๋ ๊ฐ๊ฐ์๋ ๊ณ ์ ํ ํ๋ก๊ทธ๋จ ์นด์ดํฐ๊ฐ ํ์ํ๋ค.
- ๋ฐ๋ผ์ ๊ฐ ์ค๋ ๋์ ์นด์ดํฐ๋ ์๋ก ์ํฅ์ ์ฃผ์ง ์๋ ๋ ๋ฆฝ๋ ์์ญ์ ์ ์ฅ๋๋ค. ์ด ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ๋ผ์ด๋น ๋ฉ๋ชจ๋ฆฌ๋ผ๊ณ ํ๋ค.
- ์ค๋ ๋๊ฐ ์๋ฐ ๋ฉ์๋๋ฅผ ์คํ์ค์ผ ๋๋ ์คํ์ค์ธ ๋ฐ์ดํธ์ฝ๋ ๋ช ๋ น์ด์ ์ฃผ์๊ฐ ํ๋ก๊ทธ๋จ ์นด์ดํฐ์ ๊ธฐ๋ก๋๋ค.
- ํ ํธ ์ค๋ ๋๊ฐ ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ์คํ์ค์ผ ๋ ํ๋ก๊ทธ๋จ ์นด์ดํฐ ๊ฐ์ undefined๋ค ํ๋ก๊ทธ๋จ ์นด์ดํฐ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ oom ์กฐ๊ฑด์ด ๋ช ์๋์ง ์์ ์ ์ผํ ์์ญ์ด๊ธฐ๋ ํ๋ค.
์๋ฐ ๊ฐ์ ๋จธ์ ์คํ
- ๋ง์ฐฌ๊ฐ์ง๋ก ์ค๋ ๋ ํ๋ผ์ด๋นํ๋ฉฐ, ์ค๋ ๋์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๊ฐ๋ค.
- ๊ฐ์๋จธ์ ์คํ์ ๋ฉ์๋๋ฅผ ์คํํ๋ ์ค๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ์ค๋ช ํด์ค๋ค.
- ๋ฉ์๋ ํธ์ถ์ ์คํํ๋ ์๋ง๋ค๊ณ , ์ง์ญ๋ณ์ ํ ์ด๋ธ, ํผ์ฐ์ฐ์ ์คํ, ๋์ ๋งํฌ, ๋ฉ์๋ ๋ฐํ๊ฐ๋ฑ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
- ๊ทธ๋ค์ ์คํํ๋ ์์ ๊ฐ์๋จธ์ ์คํ์ ํธ์ํ๊ณ , ๋ฉ์๋๊ฐ ๋๋๋ฉด ํํ๋์ผ์ ๋ฐ๋ณตํ๋ค.
- ์ง์ญ ๋ณ์ ํ ์ด๋ธ์๋ jvm์ด ์ปดํ์ผํ์์ ์์์๋ ๋ค์ํ ๊ธฐ๋ณธ๋ฐ์ดํฐํ์ , ๊ฐ์ฒด ์ฐธ์กฐ, ๋ฐํ์ฃผ์ ํ์ ์ ์ ์ฅํ๋ค.
- ์ด๊ฑธ ์ ์ฅํ๋ ๊ณต๊ฐ์ ์ง์ญ ๋ณ์ ์ฌ๋กฏ์ด๋ผ ํ๊ณ ์ฌ๋กฏ์ ํฌ๊ธฐ๋ ์ผ๋ฐ์ ์ผ๋ก 32๋นํธ์ด๋ค.
- ์ง์ญ ๋ณ์ ํ ์ด๋ธ์ ๊ตฌ์ฑํ๋๋ฐ ํ์ํ ๋ฐ์ดํฐ ๊ณต๊ฐ์ ์ปดํ์ผ ๊ณผ์ ์ ํ ๋น๋๋ค. ์๋ฐ ๋ฉ์๋๋ ์คํํ๋ ์์์ ์ง์ญ๋ณ์์ฉ์ผ๋ก ํ ๋น๋ฐ์์ผ ํ ๊ณต๊ฐ์ ํฌ๊ธฐ๊ฐ ์ด๋ฏธ ์๋ฒฝํ๊ฒ ๊ฒฐ์ ๋์ด์๋ค.
๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ
- jvm ์คํ๊ณผ ๋น์ท!
- ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ ์คํ๋๋ค. (๋ณดํต ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ๋ฉ์๋, jni๋ฅผ ํตํด ํธ์ถ๋จ, ์ฆ jvm์ด ์ง์ญ ์คํํ ์์๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํ ๋ฉ์๋)
์๋ฐ ํ
- ๋ชจ๋ ์ค๋ ๋ ๊ณต์
- ๋ค๋ฅธ ์ธ์ด์ ํ๊ณผ ๋์ผ
- ๊ฑฐ์ ๋ชจ๋ (์ฌ์ค์ ๋ชจ๋ )๊ฐ์ฒด๊ฐ ํ์ ์ ์ฅ๋จ.
- gc๊ฐ ๊ด๋ฆฌํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๊ธฐ์, gcํ์ด๋ผ๊ณ ํจ
- ๊ฐ์ฒด ํ ๋น ํจ์จ์ ๋์ด๊ณ ์ ์ค๋ ๋ ๋ก์ปฌ ํ ๋น ๋ฒํผ ์ฌ๋ฌ๊ฐ๋ก ๋๋๋ค. (๊ทธ๋๋ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ํ์ ์ ์ฅ๋๋ค๋ ์ฌ์ค์ ๋ง์ฐฌ๊ฐ์ง, ์ผ๋ถ ๋ฉ๋ชจ๋ฆฌํ์์ ํ ๋น์ ์กฐ๊ธ ๋ ๋น ๋ฅด๊ฒ ํ๊ธฐ์ํด ์ผ์ ํ ์ธ๋ถ์์ญ์ด ์์ ๋ฟ)
- ํ์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋จ์ด์ง ๋ฉ๋ชจ๋ฆฌ์ ์์นํด๋ ์๊ด์์ผ๋ ๋ ผ๋ฆฌ์ ์ผ๋ก๋ ์ฐ์๋์ด์ผ ํ๋ค.
๋ฉ์๋ ์์ญ
- ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ์์ญ์ผ๋ก, JVM์ด ์์๋ ๋ ์์ฑ๋จ
- ๋ฐํ์ ์์ ํ, ํ๋์ ๋ฉ์๋ ๋ฐ์ดํฐ, ๋ฉ์๋์ ์์ฑ์ ์ฝ๋, ํด๋์ค์ ์ธํฐํ์ด์ค ์ด๊ธฐํ์ ์ฌ์ฉ๋๋ ์ฝ๋ ๋ฑ์ ํฌํจ
- ํด๋์ค ๋ก๋๊ฐ ํด๋์ค ํ์ผ์ ๋ก๋ํ ๋, ํด๋น ํด๋์ค์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ด ์์ญ์ ์ ์ฅ
- JDK 8๊น์ง๋ ์ด ์์ญ์ โ์๊ตฌ ์์ฑ(Permanent Generation)โ ๋๋ โPermGen"์ด๋ผ๊ณ ๋ถ๋ ์
- JDK 8 ์ดํ์๋ ๋ฉ์๋ ์์ญ์ ๊ตฌํ์ด โ๋ฉํ์คํ์ด์ค(Metaspace)โ๋ก ๋ณ๊ฒฝ๋จ
- ๋ฉํ์คํ์ด์ค๋ ๊ธฐ์กด PermGen๊ณผ ๋ฌ๋ฆฌ OS๊ฐ ๊ด๋ฆฌํ๋ ๋ค์ดํฐ๋ธ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฌ์ฉํ๋ฏ๋ก ๋ ์ด์ JVM ํ ๋ฉ๋ชจ๋ฆฌ์ ์ผ๋ถ๊ฐ ์๋
- ์ด ๋ณ๊ฒฝ์ผ๋ก OutOfMemoryError: PermGen Space ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๊ฒ ๋จ
- ํด๋์ค ๋ฉํ๋ฐ์ดํฐ, ๋ฉ์๋์ ๋ฐ์ดํธ์ฝ๋, static ๋ณ์์ ์์ ์ ๋ณด ๋ฑ์ด ์ ์ฅ๋จ
- ๋ฐํ์ ์์ ํ์ ๋ฆฌํฐ๋ด ์์, ํ๋ ์ฐธ์กฐ, ๋ฉ์๋ ์ฐธ์กฐ ๋ฑ์ ํฌํจํ๋ฉฐ ์ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ฅผ ์ค์ ์ฐธ์กฐ๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋จ
- ํด๋์ค์ ์ ์ ๋ณ์๋ ์ฌ๊ธฐ์ ์ ์ฅ๋์ง๋ง, Java 8 ์ดํ์๋ static ๋ณ์์ ์ค์ ๋ฐ์ดํฐ๋ ํ์ ์ ์ฅ๋จ
- JIT์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผํ ์ฝ๋๋ฅผ ์บ์ฑํ๋ค.
๋ฐํ์ ์์ ํ
- ํด๋์ค ๋ฒ์ , ํ๋, ๋ฉ์๋, ์ธํฐํ์ด์ค๋ฑ ํด๋์คํ์ผ์ ํฌํจ๋ ์ ๋ณด ๋ฐ ๋ฆฌํฐ๋ด, ์ฌ๋ณผ์ฐธ์กฐ๊ฐ ์ ์ฅ๋๋ ์์ญ
- ํด๋์ค๋ก๋๊ฐ ํด๋์ค ๋ก๋์ ์๊ธฐ ์ ๋ณด๋ฅผ ์ ์ฅ
- ๋์ ์ผ๋ก ์ด์๋๋ฉฐ ๋ฐํ์์ ์๋ก์ด ์์๊ฐ ์ถ๊ฐ๋ ์ ์์
JVM ์คํ ๊ตฌ์กฐ
- ์ง์ญ๋ณ์ ํ ์ด๋ธ, ํผ์ฐ์ฐ์ ์คํ, ๋ฉ์๋ ๋ฐํ๊ฐ๋ฑ์ ์ ์ฅ
- ๋ณดํต ์ง์ญ๋ณ์ ํ ์ด๋ธ์ ์คํ์ผ๋ก ์ง์นญ
- ์ง์ญ๋ณ์ ํ ์ด๋ธ์ ์ฌ๋กฏ์ผ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ, ๊ธฐ๋ณธํ ๋ณ์ ํ๋๊ฐ ์ฌ๋กฏํ๊ฐ๋ฅผ ์ฌ์ฉ
- java ์คํ์ ํฌ๊ธฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ด ์๋ ์ฌ๋กฏ์ ๊ฐ์
- jvm์ด ํ์ฉํ๋ ์คํ์ ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ ๊ฒฝ์ฐ stackoverflow
์คํ ํ๋ ์ ๊ตฌ์กฐ
๊ตฌ์ฑ ์์ | ์ค๋ช |
---|---|
์ง์ญ ๋ณ์ ๋ฐฐ์ด(Local Variable Array) | โข ๋ฉ์๋์ ์ง์ญ ๋ณ์ ์ ์ฅ โข ๋ฉ์๋ ํ๋ผ๋ฏธํฐ๋ ์ฌ๊ธฐ ์ ์ฅ โข ์ธ๋ฑ์ค 0๋ถํฐ ์์ โข ์ธ์คํด์ค ๋ฉ์๋์ ๊ฒฝ์ฐ ์ธ๋ฑ์ค 0์ โthisโ ์ฐธ์กฐ โข ๊ฐ ์ฌ๋กฏ์ 32๋นํธ ํฌ๊ธฐ โข long, double์ ๋ ์ฌ๋กฏ ์ฐจ์ง |
ํผ์ฐ์ฐ์ ์คํ(Operand Stack) | โข ๋ฉ์๋ ์คํ ์ค ์์ ์์
๊ณต๊ฐ โข ๋ฐ์ดํธ์ฝ๋ ๋ช ๋ น์ด์ ํผ์ฐ์ฐ์๋ฅผ push/pop โข ๋ฉ์๋ ํธ์ถ ์ ์ธ์๊ฐ ์ ๋ฌ์ ์ฌ์ฉ โข JVM์ ์คํ ๊ธฐ๋ฐ ํด์๊ธฐ |
๋์ ๋งํฌ(Dynamic Linking) | โข ์์ ํ์ ์ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ฅผ ์ค์ ์ฐธ์กฐ๋ก ๋ณํ โข ์คํ ์ ๋ฉ์๋๋ ํ๋ ์ฐธ์กฐ ํด๊ฒฐ โข ๋ฐํ์์ ํด๋์ค ๊ฐ ์ฐ๊ฒฐ ์ค์ |
๋ฐํ ์ฃผ์(Return Address) | โข ๋ฉ์๋ ํธ์ถ ์๋ฃ ํ ๋์๊ฐ ์ฃผ์ โข ํธ์ถ์์ ์คํ ํ๋ ์ ์์น ์ ๋ณด โข ํธ์ถ๋ ๋ฉ์๋๊ฐ ์ ์/์์ธ์ ์ผ๋ก ์ข ๋ฃ๋ ๋ค ์ฌ์ฉ |
๋ถ๊ฐ ์ ๋ณด(Additional Information) | โข ์์ธ ์ฒ๋ฆฌ ์ ๋ณด โข ๋๋ฒ๊น ์ ๋ณด โข JVM ๊ตฌํ์ ๋ฐ๋ผ ์ถ๊ฐ ์ ๋ณด ํฌํจ ๊ฐ๋ฅ |
JVM ํ ๊ตฌ์กฐ
- GC๊ฐ ๊ด๋ฆฌํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ
- ๊ฐ์ฒด์ ์ธ์คํด์ค ๋ฐ ๋ฐฐ์ด์ด ์ ์ฅ๋๋ ๊ณต๊ฐ
- ์ค์ ์๋ฐ๋ผ ํฌ๊ธฐ ๋ณ๊ฒฝ ๊ณ ์ ๊ฐ๋ฅ
- ์ธ๋๋ณ ์ปฌ๋ ์
์ด๋ก (Generational collection thory)์ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ ๋ฐ ์ด์
- Eden, Survivor
- New/Old Generation
- ์๊ตฌ ์ธ๋ (Metaspace)
JVM GC
- Heap์์ญ์์ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์์ง ๋ฐ ์ ๊ฑฐํด ๋ฉ๋ชจ๋ฆฌ ํ์
- Minor/Major(Full) GC
- GC์ํ์ ํ๋ก๊ทธ๋จ ์ผ์ ์ ์ง
- stop-the-world
- GC ์๋
- Minor GC ๋ณดํต 1์ด์ด๋ด
- Full GC 1์ด์ด์ ์ง์ฐ๋๊ธฐ๋ ํจ -> ๋ฌธ์ ๋ db์ปค๋ฅ์ ์ด ๋๊ธฐ๊ฑฐ๋ ํ๋ ์ด์๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์
GC๊ฐ ์ฒ๋ฆฌํด์ผํ ๋ฌธ์ ์ ํต์ฌ 3์์
- ํ์ ๋์์ ํ๋จํ๋ ๊ฒ
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ๋ ์์
- ๋ฉ๋ชจ๋ฆฌ ํ์ ๋ฐฉ๋ฒ
์ธ๋ ๋จ์ ์ปฌ๋ ์ ์ด๋ก
๋ฐํ์ด ๋๋ ๊ฐ์ค
- ๋๋ค์ ๊ฐ์ฒด๋ ์ผ์ฐ ์ฌ๋ผ์ง(์ฝํ ์ธ๋ ๊ฐ์ค)
- gc๊ณผ์ ์์ ์ด์๋จ์ ํ์๊ฐ ๋์ด๋ ์๋ก (์์ผ๋ก๋) ์์กด ๊ฐ๋ฅ์ฑ์ด ๋์์ง(๊ฐํ์ธ๋ ๊ฐ์ค)
- ๋ค๋ฅธ์ธ๋์ ์ํ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ๋ ๊ฐ์์ธ๋์ ์ํ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ๋ณด๋ค ํจ์ฌ ์ ์ (์ธ๋ ๊ฐ ์ฐธ์กฐ ๊ฐ์ค)
- ํซ์คํ vm์์ ์๋ด๊ณผ ์์กด์ ๊ณต๊ฐ๋น์จ์ ๋ณดํต 8:1
- IBM ์ฐ๊ตฌ์ ๋ฐ๋ฅด๋ฉด ๋ณดํต ์ฒซ GC์ ๋๋ต 98% ๊ฐ์ฒด๊ฐ ์๋ฉธ
- 10% ๋ฉ๋ชจ๋ฆฌ ํํธํ ๋ฐฉ์ง๋ฅผ ์ํด ํ์ฉ (Overhead)
jvm heap ์์ญ ์ธ๋๋ณ space
์ถ์ฒ : https://medium.com/@khurshidbek-bakhromjonov/java-memory-management-understanding-the-jvm-heap-method-area-stack-24a4d4fa2363
Young generation
- eden
- ๊ฐ์ฒด ์์ฑ์งํ ์ ์ฅ๋๋ ์์ญ
- Minor GC ๋ฐ์์ Survivor ์์ญ์ผ๋ก ์ด๋
- Copy & Scavenge ์๊ณ ๋ฆฌ์ฆ
- Survivor 0,1
- Minor GC ๋ฐ์์ Eden, S0์์ ์ด์๋จ์ ๊ฐ์ฒด๋ S1 (S0, S1 ์๋ก ๊ต๋)
- S1์์ ์ด์๋จ์ ๊ฐ์ฒด๋ Old๋ก
- age bit ์ฌ์ฉ (์ฐธ์กฐ ๊ณ์)
Old generation
- Young generation ์์ญ์์ ์๋ฉธํ์ง ์๊ณ ๋จ์ ๊ฐ์ฒด๋ค์ด ์ฌ์ฉํ๋ ์์ญ
- Full GC ๋ฐ์์ ๊ฐ์ฒด ํ์ (๋น์ฉ์ด ํฌ๊ณ ๋ํ ์ผํจ, ์ค์ ๋ก ์ ๋ง ์ฌ์ฉ๋๋์ง ์ฐพ์)
- Mark & Compact ์๊ณ ๋ฆฌ์ฆ
Permanent
- Metaspace
- ๋ก๋๋๋ ํด๋์ค, ๋ฉ์๋ ๋ฑ์ ๊ดํ ๋ฉํ ์ ๋ณด ์ ์ฅ
- java heap์ด ์๋ native๋ฉ๋ชจ๋ฆฌ ์์ญ์ฌ์ฉ
- ๋ฆฌํ๋ ์ ํด๋์ค ๋ก๋์ ์ฌ์ฉ
GC ์๊ณ ๋ฆฌ์ฆ
Mark and sweep
- 1๋จ๊ณ ๋งํฌ(ํ์๋์ ํ๋จ)
- 2๋จ๊ณ ํ์
- ๋จ์
- ํจ์จ์ด ์ผ์ ํ์ง ์์ (ํ์ด ๋ง์ด ์ฑ์์ ธ์์๊ฒฝ์ฐ ํนํ)
- ๋ฉ๋ชจ๋ฆฌ ํํธํ ๋ฐ์
Mark and copy
- ๊ฐ์ฉ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋๋ก ๋๋ํ ํ์ชฝ๋ง ์ฌ์ฉ (S0, S1)
- ์ด์๋จ์ ์ธ์คํด์ค๋ฅผ ์ฎ๊ธธ๋ ์ฎ๊น (Copy)
- ์ฆ ์ด์๋จ์ ์ธ์คํด์ค๋ฅผ ๋ค๋ฅธ ์์ญ์ผ๋ก ๋ณต์ฌํ๊ณ
- ์ฌ์ฉํ๋ ๊ณต๊ฐ์ ๋ชจ๋ ๋น์ด๋ค.
- ๋จ์
- ๊ฐ์ฉ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์ ๋ฐ์ผ๋ก ์ค์ด๋ฆ
- Andrew Appen์ ์ ์์ผ๋ก ๊ฐ์ (์์ ์ฐ๊ตฌ)
Mark and compact
- ์์กดํ ๊ฐ์ฒด๋ฅผ ๋ชจ์ (copy ๊ณผ์ ์์ compact)
- ๋จ์
- ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ๋ง์์๋ก ๋ถ๋ด์ด ํฌ๊ฒ ์ฆ๊ฐ (์ฌ์ค์ ๋ชจ๋ ์๊ณ ๋ฆฌ์ฆ ๊ณตํต)
- ์ธ์คํด์ค ์ด๋ ๊ณผ์ ์์ ์์ฉํ๋ก๊ทธ๋จ์ ์ฐ์ฐ์ด ์ผ์์ ์ง (Stop the world!) (์ฌ์ค์ ๋ชจ๋ ์๊ณ ๋ฆฌ์ฆ ๊ณตํต)
๋๋ฌ ๊ฐ๋ฅ์ฑ ๋ถ์
- ๋๋ฌ ๊ฐ๋ฅ์ฑ ๋ถ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ์ดํด ํ์ ๋์ ์ธ์คํด์ค๋ฅผ ํ๋จ
- GC ๋ฃจํธ ๊ฐ์ฒด๋ค์ ๊ธฐ์ ์ผ๋ก ์ฐธ์กฐํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ํ์ํ๋ ๋ฐฉ์
GC ๋ฃจํธ ๊ฐ์ฒด๊ฐ ๋ ์ ์๋ ๊ฒ๋ค
- jvm stack frame ์ง์ญ๋ณ์ ํ ์ด๋ธ์์ ์ฐธ์กฐํ๋ ๊ฐ์ฒด
- Synchronized ํค์๋๋ก ์ ๊ฒจ์๋ ๊ฐ์ฒด
- JNI๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด
- ๋ฉ์๋ ์์ญ์์ ํด๋์ค ์ ์ ํ๋๋ก ์ฐธ์กฐํ๋ ๊ฐ์ฒด
- ๋ฉ์๋ ์์ญ์์ ์์๋ก ์ฐธ์กฐ๋๋ ๊ฐ์ฒด
- JVM ๋ด๋ถ์์ ์ฌ์ฉ๋๋ ์ฐธ์กฐ
Garbage First GC
ํด๋์ GC ์ข ๋ฅ ์ผ๋ถ
- Serial
- ๋จ์ผ ์ค๋ ๋๋ก ์๋, ํ์๊ฐ ๋๋ผ๋๊น์ง ๋ชจ๋ ๋ฉ์ถค
- ๊ฐ๋จํ๊ณ ํจ์จ์ ์ด๋ฉฐ ์๊ณ ๋ฆฌ์ฆ ์์ค์์ ๋ฆฌ์์ค ์ฌ์ฉ๋ ์ ์
- ParNew
- ์๋ฆฌ์ผ ์ปฌ๋ ํฐ๋ฅผ ๋ณ๋ ฌ์ฒ๋ฆฌ
- Parallel scavenge
- ์ฌ์ฉ์ ์ฝ๋ ์ฒ๋ฆฌ ์คํ ํจ์จ ๊ทน๋ํ๋ฅผ ๋ชฉํ๋ก ์ค๊ณ
- CMS GC
- java 14๊น์ง ์ฌ์ฉ๋์์
- G1 GC
- 4gb ์ด์ ๋์ฉ๋ heap ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฉํฐ์ค๋ ๋ ๊ธฐ๋ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ํนํ๋ GC
- Heap์ ์์ญ (1~32mb)๋จ์๋ก ๋ถํ ํ ํ ๋ฉํฐ์ค๋ ๋ ์ค์บ G1 GC
- jdk 9๋ถํฐ
- ์๋ฒ์ฉ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ง์คํ GC
- JVM ํ์ ์ธ๋๋จ์๊ฐ ์๋ ๋ ๋ฆฝ ์์ญ์ผ๋ก ๊ตฌ๋ถํ์
- ํ์ ๋ชจ๋ ์์ญ์ ํ์ ์งํฉ (Collection set)์ ํฌํจ์์ผ ์์ญ๋จ์ ์ฒ๋ฆฌ
- ๊ฐ์ฅ ์ฐ๋ ๊ธฐ๊ฐ ๋ง์ ์์ญ์ ํ์
- ํ์์ ๊ฐ์ฅ ๋์ด ๋๋ ์์ญ ํ์
๊ฐ์ฒด ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์๊ณผ ํด์์ฝ๋
- Object Header
- klass word : ๋ฉํ์คํ์ด์ค์ ์๋ ํด๋์ค ์ ๋ณด์ ๋ํ ์ฐธ์กฐ์
- Mark word
- Hashcode๋ Object.hashCode() ํจ์๊ฐ ํธ์ถ๋๋ ์์ ์ ๊ณ์ฐ
- ์๋ฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ๋ชปํ๋๊น ์ฌ์ฉ
- ๊ฐ์ ์ธ์คํด์ค์ธ์ง ์๋ณ ๋ฑ
- age๋ GC์์ ์ด์๋จ์ ํ์
- Lock flag๋ ๊ฐ์ฒด๋ฅผ ์ค์ฌ์ผ๋ก ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๊ฒฝ์์กฐ๊ฑด์ด ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์
- Hashcode๋ Object.hashCode() ํจ์๊ฐ ํธ์ถ๋๋ ์์ ์ ๊ณ์ฐ
์ํ | ์ค๋ช |
---|---|
Unlocked | ๊ฐ์ฒด๊ฐ ์ ๊ธ๋์ง ์์ ์ํ (Mark Word์ ๊ฐ์ฒด ํด์ ์ฝ๋ ์ ์ฅ) |
Lightweight Lock (Thin Lock) | spinlock, ๊ฒฝ๋ ๋ฝ์ด ์ ์ฉ๋ ์ํ (์ค๋ ๋๊ฐ Mark Word๋ฅผ ์์ ์ Lock Record๋ก ๋ณ๊ฒฝ) |
Inflated Lock (Fat Lock) | ์ค๊ฐ ์ด์์ ๊ฒฝ์์ด ๋ฐ์ํด OS์ ๋ชจ๋ํฐ(lock)๋ก ๊ด๋ฆฌ๋๋ ์ํ |
Biased Lock | ํธํฅ ๋ฝ์ด ํ์ฑํ๋ ์ํ (ํน์ ์ค๋ ๋๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ) |
Heavyweight Lock | ๋ฎคํ ์ค ๋๊ธฐํ |
Monitor Locked | OS ๊ธฐ๋ฐ ๋ชจ๋ํฐ ๋ฝ์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ณดํธํ๋ ์ํ |
- Instance Data
- Padding
Object ํด๋์ค
- java์ ๋ชจ๋ ํด๋์ค๋ object์ ํ์ํ์
- equals()
- ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ ์ฐธ์กฐ์์ this๊ฐ ๊ฐ๋ฆฌํค๋ ๋์์ด ๊ฐ์ ๊ฐ์ธ์ง ๊ฐ๋ง ๋น๊ต
- ์ฆ ๋๋ฑ์ฑ ๋น๊ต
- hashCode()
- ๊ฐ์ฒด ์๋ณ์ ์ํ ๊ณ ์ ํด์๊ฒฐ๊ณผ ๊ฐ(Unique)
- jvm์ ํ์์ญ์์ ์ฃผ์๊ฐ ๊ณ์ ๋ฌ๋ผ์ง๊ธฐ๋๋ฌธ์, ์ฃผ์๊ฐ์ด ์๋ hashCode๋ก ์ธ์คํด์ค ์๋ณ
- ๋์ผ์ฑ ๋น๊ต์ ์ฌ์ฉ
- toString()
- ํด๋์ค๋ช @ํด์์ฝ๋
- getClass()
JVM Concurrent
JVM๊ณผ ์ค๋ ๋
- ์ค๋ ๋์์ข
๋ฅ๋ฅผ ์๋์ฒ๋ผ ๋๋์ ์์
- ํ๋ซํผ ์ค๋ ๋
- ์ปค๋ ์ค๋ ๋
- ๊ฐ์ ์ค๋ ๋
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ดํฐ๋ธ ์ธ์ด๋ ๊ตณ์ด ๊ณ ๋ คํ ํ์๊ฐ ์๋๋ฐ, jvm์ ์ค์ ํ๋ซํผ ์ค๋ ๋์ ์ปค๋์ค๋ ๋๊ด๋ จํด์ ๋ณผ ๊ฒ๋ค์ด ์์
- ์คํ ๋ฉ๋ชจ๋ฆฌ๋ ์ค๋ ๋๋ง๋ค ํ ๋น
- ์๋ฅผ๋ค์ด ์ค๋ฒํค๋๋ฅผ ๋ณผ๋
- tcb๋ฅผ ์ ์ฅ/๋ณต์ํ๋ ์ค๋ฒํค๋์
- java thread๋ฅผ jvm๊ด๋ จ ๋น์ฉ๋ค๋ ๊ฐ์ด ๋ด์ผํจ
๊ฐ์ฒด ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์๊ณผ ํด์์ฝ๋
- object header์ค lock flag๋ฅผ ๋ค์ ๋ณผ ์๊ฐ
- lock flag๋ ๋๊ฐ ์ ์ ํ๋๊ฐ?
- ๊ฒฝ์ ์ํฉ์ ๋ฝ์ ํ๋ค ๋ชปํ๋ฉด ํด๋น๊ฐ์ด ๋ณํ๊ณ ๋ค๋ฅธ ์ค๋ ๋๋ค์ด blocked๋จ
JVM ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์์ ๋ฉ๋ชจ๋ฆฌ(working memory)
-
์์ ๋ฉ๋ชจ๋ฆฌ๋ ์ค๋ ๋๊ฐ ์ฌ์ฉํ๋ ๋ณ์์ ์ฌ๋ณธ์ด ์ ์ฅ๋๋ฉฐ
-
์ค๋ ๋ ๋ด๋ถ์ ์ฐ์ฐ์ ์์ ๋ฉ๋ชจ๋ฆฌ์๋ง ๋ฐ์
-
์ค๋ ๋๋ jvm ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ๊ทผ ๋ถ๊ฐ
-
์ฝ๊ธฐ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์์ ๋ณ์์ ๊ฐ์ ์ฝ์ด ์์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ ์ก
-
์ ์ฌ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์กํ ๊ฐ์ ์์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ
-
์ ์ฅ ์์ ๋ฉ๋ชจ๋ฆฌ ๋ณ์์ ๊ฐ์ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ๋ก ์ ์ก
-
์ฐ๊ธฐ ์์ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ๋ฉ์ธ๋ฉ๋ชจ๋ฆฌ์ ์
-
์ผ๋ฐ ๋ณ์์ ๋๊ธฐํ ์์
- ๋ช ์์ (synchronized, volatile)
- Thread.start(), join()
- Lock, Atomic class
- ํด๋์ค ๋ก๋ฉ ๊ณผ์ ์์ ์ ์ ๋ณ์ ์ด๊ธฐํ์
- ๊ธฐํ jvm์ด ์ ํ ์ต์ ํ, ๋๊ธฐํ ๊ธฐ์ค์ ์ถฉ์กฑ ์
-
volatile
- ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์ ๊ทผํ๋ ๋ณ์์ ๋ํด ๊ฐ์์ฑ์ ์ ๊ณต (๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ ๋๊ธฐํ)
๊ฐ์ ์ค๋ ๋
- ์ค์ ๋ก ํ (์ปค๋)์ค๋ ๋์์ ๋ถ๋ฆฌ๋ ์ฌ๋ฌ ๋จ์์ฝ๋๋ก ์คํํ๋ ๊ฐ๋
- ์ค์์นญ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ธฐ ์ํจ
- ๋ง์น ๊ฐ๊ฐ์ด ๊ฐ๋ณ ์ค๋ ๋๋ก ๋ณด์ด์ง๋ง, ์ฌ์ค ํ๋์ ์ค๋ ๋๋ก ์ฒ๋ฆฌ๋๋๋ก
- ์ํธ ์์กด์ฑ์ด ์ ํ ์๋ ์ฝ๋์ฌ์ผํจ
๋๊ธฐํ๋ฅผ ์ํ OS์์ค ์ปค๋ ๊ฐ์ฒด
- ์ปค๋ ๊ฐ์ฒด๋ฅผ ์ด์ฉํจ (๋๊ธฐํ ๊ฐ์ฒด)
- event
- mutex
- semaphore
- ํฌ์ธํฐ ํน์ ์นด์ดํฐ๋ก ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ก ์๊ฐํ ์์์
- ์ปค๋ ๊ฐ์ฒด๋ ์์ฑํ ์ ์๋ ๊ฐฏ์๊ฐ ์ ํ์ ์ด๋ฉฐ spinlock์ ๋นํด ๋ฌด๊ฑฐ์ (์์๊ฒ๋ค)
๋๊ธฐํ ๋ฉ์๋
- ์๊ณ์์ญ ๊ธฐ๋ฐ ๋๊ธฐํ ๊ธฐ๋ฒ์ผ๋ก ๋ฉ์๋ ์ฝ๋ ์ ์ฒด๋ฅผ ์๊ณ์์ญ์ผ๋ก ์ค์
- ์ฌ๋ฌ ์ค๋ ๋์์ ํธ์ถํ๋๋ผ๋ ๋์ ์คํ์ด ํ์ฉ๋์ง ์์
๋ชจ๋ํฐ๋ฝ ๋์ ์์
- ์ค๋ ๋๊ฐ synchronized ๋ฉ์๋ ํธ์ถ์ ๋ชจ๋ํฐ๋ฝ์ ์์ฒญ
- ํ ์ค๋ ๋๊ฐ ๋ชจ๋ํฐ๋ฝ์ ์ด๋ฏธ ์ ์ ํ๊ณ ์์ผ๋ฉด ์ค๋ ๋ ์ํ๋ฅผ blocked์ํ๋ก ์ ํ
- ๊ธฐ์กด ๋ชจ๋ํฐ ๋ฝ ์ ์ ์ค๋ ๋๊ฐ ๊ตฌ๊ฐ์ ๋ฒ์ด๋(์๊ณ์์ญ์)๋ฉด ๋ชจ๋ํฐ๋ฝ์ ํด์ ํ๊ณ blocked์ํ๋ก ๋๊ธฐ์ค์ธ ์ค๋ ๋์ค ํ๋๊ฐ ๋ฝ์ ์ป๊ณ ๋๊ธฐํ ๊ตฌ๊ฐ์ ์ง์