/
1. TLAB์ด ์ ํ์ํ๊ฐ?
Java์์ new ํค์๋๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด JVM์ Heap ๋ฉ๋ชจ๋ฆฌ์ ๊ณต๊ฐ์ ํ ๋นํฉ๋๋ค. ํนํ Young Generation์ Eden ์์ญ์ ๊ฐ์ฒด๊ฐ ๋จผ์ ๋์ด๊ฒ ๋ฉ๋๋ค.
์ฑ๊ธ ์ค๋ ๋ ํ๊ฒฝ์์๋ ๋ฌธ์ ๊ฐ ์์ง๋ง, ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์๋ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ์๊น๋๋ค. ๋ ์ค๋ ๋๊ฐ ๋์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์์ฒญํ๋ฉด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
Thread A โโโถ Eden [____ํ ๋น ํฌ์ธํฐ____] โโโ Thread B
โ ๋ ์ค๋ ๋๊ฐ ๋์์ ๊ฐ์ ์์น ์์ฒญ!
Plain Text
๋ณต์ฌ
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋จ์ํ ๋ฐฉ๋ฒ์ ๋ฝ(Lock)์ผ๋ก ๋๊ธฐํํ๋ ๊ฒ์ด์ง๋ง, ๊ฐ์ฒด ์์ฑ์ด ๋งค์ฐ ๋น๋ฒํ Java ํน์ฑ์ ๋ฝ ๊ฒฝํฉ์ด ๊ทน์ฌํ ์ฑ๋ฅ ๋ณ๋ชฉ์ด ๋ฉ๋๋ค.
2. TLAB์ ๊ฐ๋
TLAB(Thread Local Allocation Buffer)์ Eden ๋ด๋ถ์์ ํน์ ์ค๋ ๋์๊ฒ ์ ์ฉ์ผ๋ก ํ ๋น๋ ์์ญ์
๋๋ค. ์ฆ, ํด๋น ์์ญ์๋ ์ค์ง ํ๋์ ์ค๋ ๋๋ง ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ ์ ์์ผ๋ฉฐ, ๊ฐ ์ค๋ ๋๋ ์์ ๋ง์ TLAB์ ๊ฐ์ง๋๋ค.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Eden Space โ
โ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโ โ
โ โ Thread-1 โ โ Thread-2 โ โ Thread-3 โ โ
โ โ TLAB โ โ TLAB โ โ TLAB โ โ
โ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโ โ
โ ๊ณต์ Eden ์์ญ (Slow Allocation) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Plain Text
๋ณต์ฌ
3. ํต์ฌ ๋์ ๋ฐฉ์: Pointer Bump Allocation
๊ฐ์ฅ ๋น๋ฒํ "์ ์" ๊ฒฝ๋ก๋ ๋จ์ํ TLAB์ ํ์ฌ ์ปค์(ํฌ์ธํฐ)์ ๊ฐ์ฒด ํฌ๊ธฐ๋ฅผ ๋ํ๊ณ ์งํํ๋ ๊ฒ์
๋๋ค. ์ด ๋๋ฌธ์ ์ด ๋ฐฉ์์ **"ํฌ์ธํฐ ๋ฒํ ํ ๋น(Pointer Bump Allocation)"**์ด๋ผ๊ณ ๋ ํฉ๋๋ค.
// TLAB ๋ด ๊ฐ์ฒด ํ ๋น ์์ฌ ์ฝ๋
Object allocate(size) {
if (tlab.top + size <= tlab.end) {
Object obj = tlab.top;
tlab.top += size; // ํฌ์ธํฐ๋ง ์ด๋! ๋๊ธฐํ ๋ถํ์
return obj;
}
// TLAB์ด ๋ถ์กฑํ๋ฉด ๋ค๋ฅธ ์ฒ๋ฆฌ
}
Java
๋ณต์ฌ
์ด ๋ฐฉ์์ ํต์ฌ์ ๋๊ธฐํ๊ฐ ์ ํ ํ์ ์๋ค๋ ์ ์
๋๋ค. ๊ฐ ์ค๋ ๋๊ฐ ์์ ๋ง์ ์์ญ์์๋ง ํฌ์ธํฐ๋ฅผ ์์ง์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
4. TLAB ๊ณต๊ฐ์ด ๋ถ์กฑํ ๋: 4๊ฐ์ง ์ ํ์ง
๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ ค๋๋ฐ TLAB์ ๊ณต๊ฐ์ด ๋ถ์กฑํ๋ฉด JVM์ ๋ค ๊ฐ์ง ์ ํ์ ํ ์ ์์ต๋๋ค. ์ฒซ์งธ๋ก ํด๋น ์ค๋ ๋๋ฅผ ์ํด ์ TLAB ๊ณต๊ฐ์ ํ ๋น(TLAB ํ์ฅ), ๋์งธ๋ก TLAB ์ธ๋ถ(๊ณต์ Eden ์์ญ)์์ ํด๋น ๊ฐ์ฒด์ ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น, ์
์งธ๋ก GC๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ํ์ ์๋, ๋ท์งธ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์คํจํ๊ณ ์๋ฌ๋ฅผ ๋์ง๋ ๊ฒ์
๋๋ค. ๋ค ๋ฒ์งธ๋ ์ต์
์ ๊ฒฝ์ฐ์ด๋ฉฐ JVM์ ์ด๋ฅผ ์ต๋ํ ํผํ๋ ค ํฉ๋๋ค.
TLAB Retirement (์ํด) ๋ฉ์ปค๋์ฆ
TLAB ๋จ์ ๊ณต๊ฐ์ด **์๊ณ๊ฐ(Refill Waste)**๋ณด๋ค ์์ผ๋ฉด, JVM์ ํ์ฌ TLAB์ "์ํด(retire)"์ํค๊ณ ์ TLAB์ ๋ฐ์์ต๋๋ค. ๋ฐ๋๋ก ๋จ์ ๊ณต๊ฐ์ด ์๊ณ๊ฐ๋ณด๋ค ํฌ๋ฉด, ํฐ ๊ฐ์ฒด๋ฅผ TLAB ์ธ๋ถ(๊ณต์ Eden)์ ์ง์ ํ ๋นํฉ๋๋ค(Slow Allocation).
๊ธฐ๋ณธ์ ์ผ๋ก ์ด ์๊ณ๊ฐ์ TLAB ํฌ๊ธฐ์ 1%์ด๋ฉฐ, -XX:TLABWasteTargetPercent=N ํ๋๊ทธ๋ก ๊ฒฐ์ ๋ฉ๋๋ค(๊ธฐ๋ณธ๊ฐ 1). Slow Allocation์ด ์ฆ๊ฐํ ์๋ก ๋ ๋ง์ Slow Allocation์ ์ค์ด๊ธฐ ์ํด JVM์ ์ด ๊ฐ์ -XX:TLABWasteIncrement=N์ ์ํด ๊ฒฐ์ ๋ ๊ฐ๋งํผ ์ฆ๊ฐ์ํต๋๋ค(๊ธฐ๋ณธ๊ฐ 4).
5. TLAB ํฌ๊ธฐ ๊ฒฐ์ ๋ฐฉ์
๊ธฐ๋ณธ์ ์ผ๋ก TLAB์ ๊ฐ ์ค๋ ๋๋ง๋ค ๋์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ์กฐ์ ๋ฉ๋๋ค. TLAB ํฌ๊ธฐ๋ Eden์ ํฌ๊ธฐ, ์ค๋ ๋ ์, ๊ทธ๋ฆฌ๊ณ ์ค๋ ๋๋ณ ํ ๋น ์๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๊ณ์ฐ๋ฉ๋๋ค.
์ค๋ ๋๊ฐ ์ข
๋ฃ๋ ๋๋:
โข
์ด๋ฏธ ์์ฑ๋ ๊ฐ์ฒด๋ค์ Eden ์์ญ์ ๊ทธ๋๋ก ๋จ์ GC๊ฐ ๊ด๋ฆฌ
โข
๋จ์ ๋ฏธ์ฌ์ฉ ๊ณต๊ฐ์ Eden์ ๋ฐํ๋๋ฉฐ, JVM์ด GC๊ฐ ํ์ ํ์ฑํ ์ ์๋๋ก ๋๋ฏธ(Filler) ๊ฐ์ฒด๋ก ์ฑ์๋๋ค
6. ์ฑ๋ฅ ํจ๊ณผ
TLAB ์์ด ๋จ์ผ ์ค๋ ๋์์๋ CAS(Compare-And-Swap) ์์ ์ฐ์ฐ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ TLAB์ ์ฌ์ฉํ์ ๋ ๋๋น ์ฑ๋ฅ์ด ์ ๋ฐ ์์ค์ ๊ทธ์นฉ๋๋ค. x86 ์ฝ์ด์์ ์ผ๋ฐ์ ์ธ store๋ ์ฆ์ ํ๋ก์ธ์ ์บ์์ ๋๋ฌํ์ง ์๊ณ "์คํ ์ด ๋ฒํผ"์ ๋จผ์ ์ฐ์ด๊ณ ์คํ์ด ๊ณ์๋๋ ๋ฐ๋ฉด, CAS ์ฐ์ฐ์ ๊ทธ๋ ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ค์ ๋ฒค์น๋งํฌ์์ TLAB ํ์ฑํ ์ ๋จ์ผ ์ค๋ ๋๋ก๋ ์ด๋น ์ฝ 2.5GB/s์ ํ ๋น ์๋, 16๋ฐ์ดํธ ๊ฐ์ฒด ๊ธฐ์ค ์ด๋น 1์ต 6์ฒ๋ง ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
7. ์ฃผ์ JVM ํ๋๊ทธ ์ ๋ฆฌ
ํ๋๊ทธ | ์ค๋ช
| ๊ธฐ๋ณธ๊ฐ |
-XX:+UseTLAB | TLAB ํ์ฑํ | true (๊ธฐ๋ณธ ํ์ฑํ) |
-XX:-UseTLAB | TLAB ๋นํ์ฑํ | - |
-XX:TLABSize=N | TLAB ์ด๊ธฐ ํฌ๊ธฐ ์ค์ | 0 (์๋) |
-XX:MinTLABSize=N | TLAB ์ต์ ํฌ๊ธฐ | - |
-XX:MaxTLABSize=N | TLAB ์ต๋ ํฌ๊ธฐ | - |
-XX:TLABWasteTargetPercent=N | Slow Allocation ์๊ณ๊ฐ (%) | 1 |
-XX:TLABWasteIncrement=N | Slow Alloc ๋ฐ์ ์ ์๊ณ๊ฐ ์ฆ๊ฐ๋ | 4 |
-XX:TLABRefillWasteFraction=N | TLAB ์ฌ์ถฉ์ ๋ญ๋น ๋น์จ | - |
8. TLAB ํต๊ณ ํ์ธ ๋ฐฉ๋ฒ
GC ๋ก๊ทธ์์ TLAB ๋์์ ๊ด์ฐฐํ ์ ์์ต๋๋ค:
# GC ๋ก๊ทธ ํ์ฑํ
-XX:+PrintTLAB
-Xlog:gc+tlab=trace # JDK 9 ์ด์
Bash
๋ณต์ฌ
๋ก๊ทธ ์์ ํด์:
TLAB: gc thread: 0x... [id: 1234]
desired_size: 491KB
slow allocs: 7 waste 44%
refills: 111
waste: 0.1%
Plain Text
๋ณต์ฌ
โข
slow allocs: TLAB ์ธ๋ถ ํ ๋น ํ์ โ ๋์ผ๋ฉด ๋ฌธ์
โข
refills: TLAB ์ฌ์ถฉ์ ํ์
โข
waste: ๋ญ๋น ๋น์จ โ ๋ฎ์์๋ก ํจ์จ์
9. ์ค๋ฌด์์ ์ฃผ์ํด์ผ ํ ์
TLAB ์ธ๋ถ ํ ๋น(Slow Allocation)์ด ๋ง์ ๊ฒฝ์ฐ์ ์์ธ๊ณผ ํด๊ฒฐ์ฑ
:
1.
ํฐ ๋ฐฐ์ด/๊ฐ์ฒด: TLAB์ ๋ง์ง ์๋ ํฐ ๊ฐ์ฒด๋ ๋ฌด์กฐ๊ฑด ๊ณต์ Eden์ ํ ๋น๋ฉ๋๋ค. โ ๊ฐ์ฒด ํฌ๊ธฐ๋ฅผ ์ค์ด๊ฑฐ๋ MaxTLABSize๋ฅผ ๋๋ ค๋ณผ ๊ฒ
2.
์ค๋ ๋๊ฐ ๋๋ฌด ๋ง์: ์ค๋ ๋ ์๊ฐ ๋ง์์ง๋ฉด ๊ฐ TLAB ํฌ๊ธฐ๊ฐ ์์์ ธ ์์ฃผ ์ฌ์ถฉ์ ์ด ํ์ํฉ๋๋ค. โ ์ค๋ ๋ ํ ํฌ๊ธฐ ์กฐ์
3.
ํ ๋น ์๋๊ฐ ์ง๋์น๊ฒ ๋์: GC ํ๋๊ณผ ํจ๊ป Eden ํฌ๊ธฐ(Xmn) ์กฐ์ ์ ๊ณ ๋ ค
ํต์ฌ ์ ๋ฆฌ: TLAB์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์๊ณ JVM์ด ์๋์ผ๋ก ์ต์ ํํ๋ฏ๋ก ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ฑด๋๋ฆด ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Slow Allocation ๋น์จ์ด ๋๊ฑฐ๋ ํ ๋น ๊ด๋ จ ์ฑ๋ฅ ์ด์๊ฐ ์์ ๋, TLAB ํต๊ณ๋ฅผ ๋ถ์ํ์ฌ ๊ฐ์ฒด ํฌ๊ธฐ๋ฅผ ์ค์ด๊ฑฐ๋ ์ค๋ ๋/ํ ํ๋์ ํ๋ ์ ๊ทผ์ด ํจ๊ณผ์ ์
๋๋ค.



