2011-11-16 23 views
10

Cuando hace un new Object() en Java, utiliza el jvm un algoritmo sin cerradura para asignar memoria o necesita bloquearse?¿Está la asignación de memoria en el JVM sin cerradura

La JVM a la que me refiero en este caso es la VM de Hotspot. Por lo poco que sé, solo necesita incrementar un puntero para asignar memoria súper rápido. Pero en el caso de múltiples hilos, ¿ese incremento requiere bloqueo o CAS?

Respuesta

6

como se mencionó, el valor predeterminado es usar un tlab. El behavious se describe en this glossary de la siguiente manera

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. 

Más detalles sobre el encolado en this blog & todos los detalles que pueda desear en this blog.

En resumen, es un subproceso local a menos que el TLAB esté lleno, en cuyo caso deberá acceder al grupo compartido y esta es una operación CAS.

Otro factor de complicación podría ser this bug que describe la compartición falsa en el marcado de la tarjeta que no es un bloqueo como tal, pero perjudicará el rendimiento (si es por eso que está preguntando sobre el bloqueo). Parece que esto está arreglado en java7.

5

Depende :) Creo que si usa -XX:+UseTLAB option (que es el valor predeterminado para las JVM de Sun/Oracle según lo notado por Peter), estará libre de conflictos en la "ruta feliz" debido a montones de subprocesos locales . Por supuesto, si se requiere recolección de basura debido a que no hay suficiente espacio, entramos en el territorio de los GC paralelos, etc., donde hay varias implementaciones y todo es muy complicado ... y, por supuesto, esto se mueve todo el tiempo.

Incluso en el modelo de "pila única", espero que la asignación esté altamente optimizada, no tanto la adquisición de un bloqueo en el sentido normal como la realización de incrementos atómicos cuando sea posible. Sin embargo, no puedo decir que conozca los detalles.

+1

+1: UseTLAB está activado de forma predeterminada en Sun/Oracle JVM. –

+0

@PeterLawrey: Gracias - editado apropiadamente. –