..

JVM TLAB: thread-local allocation buffer

TOC


  1. Overview
  2. TLAB이란?
  3. 왜 TLAB이 필요한가
  4. Eden과 TLAB의 관계
  5. TLAB의 동작 방식
  6. Conclusion

Overview


앞 글인 JVM new와 Eden: 객체가 처음 할당되는 곳에서는 new로 생성된 객체가 보통 Eden에서 시작한다는 흐름을 다뤘다.

결국 thread가 공유 공간인 Eden 안에 할당을 진행한다. 하지만 thread는 하나가 아닌 여러개다. 그다음 질문은 결국 여러 thread가 동시에 객체를 만들 때, JVM은 어떻게 Eden 안의 할당 경합을 줄일까?

이 글에서는 그 해답으로 쓰이는 TLAB(Thread-Local Allocation Buffer)을 다룬다.

TLAB이란?


TLABThread-Local Allocation Buffer의 약자다.

thread마다 작은 전용 할당 구역을 주고, 그 안에서는 각 thread가 자기 포인터만 밀면서 객체를 빠르게 할당할 수 있게 만든다.

핵심은 “공용 할당 지점을 여러 thread가 같이 두드리지 않게 만드는 것”이다.

왜 TLAB이 필요한가


하나의 전역 할당 포인터를 여러 thread가 동시에 갱신하면 동기화 비용이 생긴다.

객체 하나를 만드는 일은 단순해 보여도, 그 단순한 작업을 많은 thread가 동시에 반복하면 경합이 커진다. TLAB은 이 경합을 thread 단위로 잘라서 줄인다. (동적할당)

Eden과 TLAB의 관계


TLABEden과 무관한 별도 영역이 아니다.

일반적으로 TLABEden 안에서 thread별로 나눠 쓰는 작은 공간처럼 이해하면 된다. 그래서 Eden이 새 객체의 시작점이라면, TLAB은 그 시작점을 thread 단위로 더 세분화한 구조다.

앞 글인 JVM new와 Eden: 객체가 처음 할당되는 곳에서는 Eden 자체를 다뤘고, 여기서는 그 안에서 thread가 어떻게 더 빠르게 움직이는지 본다.

TLAB의 동작 방식


thread(local)가 객체를 할당할 때마다 다음과 같은 흐름을 따른다.

  1. local thread 자신이 할당받은 buffer에 공간 확인
  2. 공간이 부족시, GC heap allocator 에 신규 buffer 요청
  3. 객체 할당

즉, TLAB은 thread마다 작은 Eden 조각을 준 것처럼 동작한다.

Conclusion


TLAB은 thread별 전용 할당 구역이다.

  • Eden 안에서 thread 간 경합을 줄인다.
  • thread는 자기 TLAB 안에서 빠르게 객체를 배치한다.
  • TLAB이 부족하면 다음 할당 경로로 넘어간다.

정리하면 TLABEden에서 thread별 할당 경합을 줄이기 위한 장치다.