2011-11-16 3 views
10

Java에서 new Object()을 수행 할 때 jvm은 잠금없는 알고리즘을 사용하여 메모리를 할당합니까? 아니면 잠글 필요가 있습니까?JVM에서 메모리 할당이 잠김입니까?

이 경우 언급하고있는 JVM은 Hotspot VM입니다. 내가 아는 그 작은 부분부터, 메모리를 빠르게 할당하기위한 포인터를 증가시켜야합니다. 그러나 다중 쓰레드의 경우, 그 증가는 잠금 또는 CAS를 요구합니까?

답변

6

언급 한대로 기본값은 tlab을 사용하는 것입니다. 당신이 this blog에서 원하는 수 this blog & 모든 세부 사항에 크기에

TLAB 
Thread-local allocation buffer. Used to allocate heap space quickly without synchronization. Compiled code has a "fast path" of a few instructions which tries to bump a high-water mark in the current thread's TLAB, successfully allocating an object if the bumped mark falls before a TLAB-specific limit address. 

더 자세한 사항을 다음과 같이 behavious은 this glossary에 설명되어 있습니다.

요약하면 TLAB가 꽉 찬 경우가 아니라면 스레드 로컬입니다.이 경우 공유 풀에 도달해야하며 이는 CAS 작업입니다.

또 다른 복잡한 요소는 잠금 장치가 아니지만 성능에 해를 끼치는 카드 표시의 잘못된 공유를 설명하는 this bug 일 수 있습니다 (이것이 잠금에 대해 묻는 이유 인 경우). 비록 이것이 java7에서 수정 된 것처럼 보입니다.

5

다릅니다. -XX:+UseTLAB option (피터가 언급 한 Sun/Oracle JVM의 기본값)을 사용하면 thread-local heaps로 인해 "행복한 경로"에서 경합이 발생하지 않을 것입니다. . 물론 충분한 공간이 없기 때문에 쓰레기 수거가 필요하다면 병렬 GC 등의 영역에 들어가게됩니다. 다양한 구현이 있으며 매우 복잡합니다 ... 물론 이것은 항상 움직입니다.

"단일 힙"모델이라 할지라도 가능한 한 원자 단위 증분을 수행하는 것과 같이 정상적인 의미에서 잠금을 많이 얻지는 않아서 할당이 고도로 최적화 될 것으로 기대합니다. 나는 세부 사항을 알고 있다고 말할 수 없다.

+1

+1 : UseTLAB는 기본적으로 Sun/Oracle JVM에서 사용됩니다. –

+0

@ PeterLawrey : 감사합니다. 적절하게 편집했습니다. –

관련 문제