2011-02-07 5 views
2

ThreadLocal 변수가 Thread Local allocation Buffer (s) 또는 TLABs에 할당되어 있다고 가정합니다.TLAB에 ThreadLocal이 할당 되었습니까?

정확히 어떤 클래스가 TLAB에 저장되는 이유를 설명하는 문서를 찾지 못했습니다. 일부를 아는 경우 링크를 게시하십시오.

+0

모든 답변이 정확하다고 생각합니다.하지만 그 중 하나를 선택해야했습니다. –

답변

3

번호를 참조하십시오 자바에서 각 스레드지도가 유지 threadLocals라는 필드가 1.4. 각 threadLocal에는 구조체에 대한 인덱스가 있으므로 hashCode()를 사용하지 않습니다. 배열과 각 ThreadLocal이 슬롯 인덱스를 유지한다고 상상해보십시오.

스레드가 으로 죽을 때 더 이상 스레드 참조가 없다면 ThreadLocals는 GC됩니다. 아주 간단한 아이디어.

스레드를 확장하고 참조를 보유 할 필드를 추가하여 고유 한 ThreaLocal을 구현할 수 있습니다. 그런 다음 스레드를 자신의 클래스로 캐스팅하고 데이터를 가져옵니다.

TLAB가 아니기 때문에 다른 개체와 마찬가지로 여전히 힙입니다.


역사적 데이터를 액세스하는 것은 매우 느렸다 정적의 WeakHashMap/w 구현 있었다.

+0

Java 1.5, 1.6은 어떻게 사용합니까? 나는 많은 것들이 바뀌 었다고 생각한다. –

+1

@binary_runner - 변경 사항이 없습니다. 문구는 '현재'(또는 이후)입니다. 사실 처음에는 TLAB 주석을 이해할 수 없었습니다. 메모리가 할당 된 곳은 스레드 로컬에 대한 추가 지정이 전혀 없습니다. ThreadLocal은 매우 일반적인 Java 객체이며 마술은 전혀 없습니다 (복사 된 상속 된 버전은 예외). – bestsss

+0

답변이 거의 부적절하며 TLAB의 정의를 잘못 이해하고 있기 때문에 Downvoted. gustafc의 답변이 실제 답변입니다. –

1

저는 이것이 JVM 구현 자의 재량에 달려 있다고 확신합니다. 원하는 경우 TLAB에 데이터를 넣거나 스레드 ID로 키 테이블에 넣을 수 있습니다. Java 언어 사양은 이러한 종류의 문제에 대해 무음이되어 경향이 있으므로 JVM 작성자는 가능한 많은 다양한 플랫폼에 Java를 배포 할 수 있습니다.

2

TLAB는 모든 중소 개체의 개체 할당에 사용됩니다. 귀하의 ThreadLocal은 다르게 할당되지 않습니다.

4

정확히 어떤 클래스가 TLAB에 저장되는 것을 나타내는 문서를 찾지 못했습니다. 일부를 아는 경우 링크를 게시하십시오. 단일 스레드에 의해 할당에 사용되는 에덴의 영역은

스레드 지역 할당 버퍼 (TLAB)된다

사실, 설명은 당신이 lnked 블로그 게시물의 권리가있다. 스레드가 스레드 로컬 상위 및 제한 포인터를 사용하여 개체 할당을 수행 할 수있게합니다. 이는 스레드간에 공유되는 상위 포인터에서 원자 연산을 수행하는 것보다 빠릅니다.

모든 스레드는 자신의 에덴 덩어리 인 힙의 "Generation 0"부분에서 메모리를 할당합니다. 거의 모든 것은 TLAB에 일정 시간 동안 저장됩니다. 아마도 ThreadLocal도 가능할 것입니다. 그러나 gen0 가비지 수집 후에 거기에서 멀리 이동하게됩니다. TLAB는 다른 스레드에서 메모리를 액세스 할 수 없도록 할당을 더 빠르게 수행합니다. 링크 된 동일한 블로그에서 더 쉽게 액세스 할 수있는 설명은 A little thread privacy, please입니다.

관련 문제