이전 가비지컬렉터 게시물에서 JVM에서의 새 객체가 할당은 eden영역에서 이루어진다고 했었다
HotSpot VM에서는 빠른 메모리 할당을 위해 Bump-the-pointer와 TLAB을 같이 사용중인데
먼저 Bump-the-pointer는 eden에 할당된 마지막 객체를 추적한다
마지막 객체는 eden 영역의 맨 위에 위치해 있으며 그 다음 생성되는 객체를 할당하기 위해선
해당 객체의 크기가 eden영역에 넣기 적당한지만 확인한다
이때 크기가 적당하다고 판단되면 eden에 들어가고 새로 생성된 객체가 맨 위에 위치하게 된다
그러므로 새 객체 생성시 마지막으로 추가된 객체만 점검하면 되므로 매우 빠르게 메모리 할당이 가능해진다
하지만 eden은 스레드 간에 공유되는 메모리 공간인
멀티 스레드 환경이라서 Thread-safe하기 위해 락(lock)이 발생할 수밖에 없고
lock-contention(잠금 경합) 때문에 성능이 매우 떨어질 것이다
메모리 할당방법 쪽 참고
https://d2.naver.com/helloworld/1329
Thread Local Allocation Buffer
각각의 스레드가 객체 생성-할당을 동시에 요청할 경우 동기화 때문에 문제가 발생한다
이러한 문제를 해결하기 위해 JVM HotSpot VM에서는 TLAB을 사용하고 있다
TLAB은 eden의 내부에 있는 각각의 스레드가 독점적으로 가지고 있는 전용 공간(버퍼)이다
해당 TLAB을 가지고 있는 단일 스레드만이 이 버퍼에 새 객체를 할당할 수 있게 하는 것이다
각 스레드에는 자체 TLAB을 가지고 있다고 했기 때문에
객체가 TLAB에 할당되는 한, 다른 스레드와의 동기화 작업이 발생하지 않는다
만약 Bump-the-pointer 방식만 적용했다면
위 그림에서 첫번째와 같이 하나의 스레드가 할당을 완료할때까지
다른 모든 스레드는 기다리고만 있어야할 것이다
잠금 없이 eden 내부의 TLAB 안에서만 메모리를 할당할 수 있게 하는 것이다
다만, 스레드에게 최초로 TLAB을 할당할 때는 동기화가 발생한다
만약 스레드가 현재 TLAB에 맞지 않는 새 객체를 할당해야하는 경우(꽉 찬 경우)
- 스레드가 새로운 TLAB을 얻거나
- 객체가 TLAB외부에 할당된다
첫 번째 방법은 스레드의 현재 TLAB이 폐기되고 새 TLAB에서 할당이 완료된다
두 번째 방법은 TLAB의 밖에서(eden의 공유 영역)에서 수행되기 때문에 동시성 문제가 발생할 수 있고
TLAB 외부 할당이기 때문에 성능이 저하될 수 있다
TLAB은 기본적으로 각 스레드에 대해 동적으로 크기가 조정된다
만약 스레드가 TLAB의 크기에 맞지 않는 큰 객체를 할당해야 하는 경우
eden의 공유 영역에 할당되며 어쩔 수 없이 동기화 작업이 일어나게 된다
TLAB을 사용하지 않고 외부에 할당하는 것이다
하지만 minor GC 전에는 이와 같은 작업으로 이루어지기에
객체를 무조건 TLAB 외부에 할당하는 것이 나쁜 것은 아니지만
TLAB 내부 할당과 비교했을때
TLAB을 사용하지 않고 외부에서의 할당이 엄청나게 많아질때가 문제이다
이런 경우에는 객체의 크기 조정, TLAB의 크기 조정을 통해
TLAB 외부 할당 비율을 줄이는 방식을 목표로 개선을 시도해보는 것이 좋을 것이다
결론적으로 TLAB을 사용한다면
TLAB을 사용하기 위해 추가적인 메모리를 소모하겠지만
여러 스레드가 공유하는 동시성 문제를 해결할 수 있기 때문에
객체를 생성하고 할당하는 과정에서 큰 성능을 뽑아낼 수 있다는 장점이 있다
Introduction to Thread Local Allocation Buffers (TLAB) - DZone
Introduction to Thread Local Allocation Buffers (TLAB) - DZone
This post looks at Thread Local Allocation Buffers (TLAB) in your code and what it means to have a significant amount of allocations happening outside TLAB.
dzone.com
Nursery Collection - Allocation쪽 참고
https://www.mono-project.com/docs/advanced/garbage-collector/sgen/
'CS' 카테고리의 다른 글
레이어드 아키텍처(Layered architecture) (0) | 2023.09.01 |
---|---|
스레드(Thread) (0) | 2023.05.29 |
힙 오염(heap pollution) (0) | 2023.05.21 |
가비지 컬렉터(GC)에 대하여 (0) | 2023.05.15 |