Cómo JVM garantiza la seguridad del hilo de la asignación de memoria para un nuevo objeto

Supongamos que esto está por suceder en un verdadero entorno paralelo, una VM, al mismo tiempo:

// Thread 1:
  new Cat()

// Thread 2:
  new Dog()

// Thread 3:
  new Mouse()

¿Cómo garantiza JVM la seguridad de los subprocesos de las asignaciones de memoria en el montón?

Heap es uno para todos los subprocesos y tiene sus propios datos internos.

Por simplicidad, asuma una implementación simple de recolección de basura compactadora, -XX: + UseSerialGC -XX: + UseParallelGC, con un puntero incremental simple para marcar el inicio del espacio libre y un espacio libre continuo en el Edén (montón).

Debe haber algún tipo de sincronización entre subprocesos cuando se asigna espacio de almacenamiento dinámico paraGato, Perro yRatón casos de lo contrario, pueden terminar fácilmente sobrescribiéndose entre sí. ¿Eso significa que cadanuevo El operador se esconde dentro de algunos bloques sincronizados? De esta manera, muchos algoritmos "sin bloqueo" no están completamente libres de bloqueo;)

Supongo que las asignaciones de memoria son realizadas por el hilo de la aplicación, sincrónicamente, no por otro hilo (s) dedicado.

Estoy consciente deTLABs, o Thread Local Allocation Buffer. Permiten que los subprocesos tengan áreas de memoria separadas en Eden para las asignaciones, por lo que no se requiere sincronización. Pero no estoy seguro de si TLAB está configurado de forma predeterminada, es una característica HotSpot algo oscura. Nota: no confunda TLAB yThreadLocal variables!

También supongo que con los recolectores de basura más complejos, como G1, o los recolectores de basura no compactados, se deben mantener datos de estructura de eap más complejos, como una lista de bloques libres para CMS, por lo que se necesita más sincronización.

ACTUALIZAR: Por favor, déjame aclarar esto. Acepto la respuesta para la implementación y las variantes de HotSpot JVM con y sin TLAB activo.

ACTUALIZAR: De acuerdo ami prueba rapida, TLAB están activados por defecto, en mi JDK 7 de 64 bits, para recolectores de basura serie, paralelo y CMS, pero no para G1 GC.

Respuestas a la pregunta(2)

Su respuesta a la pregunta