En el famoso Java Concurrency in Practice, sección 2.4, dice que el enfoque de bloqueo intrínseco, en contra de bloqueos explícitos era una mala decisión de diseño porque es confuso y también "... obliga a los implementadores de JVM a hacer intercambios entre el tamaño del objeto y el bloqueo actuación." ¿Puede alguien explicar por favor cómo el tamaño del objeto afecta el rendimiento de bloqueo?¿Existe una relación entre el tamaño del objeto y el rendimiento de bloqueo en Java?
Respuesta
Bien, ya que cada objeto puede ser bloqueado, esto significa que cada objeto debe tener suficiente lugar para almacenar toda la información que necesitamos al bloquear.
Eso no es atractivo porque la gran mayoría de los objetos nunca estarán bloqueados, por lo que estamos desperdiciando mucho espacio. Entonces, en la práctica, Hotspot resuelve esto usando 2bits para registrar el estado del objeto y reutilizar el resto del encabezado del objeto dependiendo de estos dos bits.
Luego está toda la información de bloqueo sesgada/no sesgada ... bueno, puede comenzar a leer al respecto here. La documentación de Hotspot no es lo que yo llamaría extensa, pero los encabezados de bloqueo y de objeto están mejor representados que la mayoría del resto. Pero en duda: lee el código fuente.
PD: También tenemos un problema similar con el código hash nativo de cada objeto. "Simplemente use la dirección de memoria" no es muy buena si su GC mezcla objetos alrededor. (Pero al contrario que con el bloqueo no hay una alternativa real, si queremos esta funcionalidad)
gracias por la información, básicamente se trata de todas las sincronizaciones primitivas, independientemente del tamaño del objeto particular utilizado para el bloqueo – meer
¿tiene alguna información específica para ir con esas declaraciones? "¿mucho espacio? ¿Qué información se necesita cuando se bloquea? – Toby
@Toby Bueno, al menos, el TID y un contador de recursividad. Para más detalles, tendrá que mirar las pesadas clases de bloqueo en la fuente del punto de acceso. Teniendo en cuenta que esto se agrega a cada objeto, incluso 1-2 palabras son "mucho espacio". – Voo
Los bloqueos más eficientes usan el tamaño de palabra nativo p. Ej. Campos de 32 bits. Sin embargo, no desea agregar 4 bytes a cada objeto, por lo que se usa AFAIK 1 bit, sin embargo, establecer este bit es más caro que establecer un tamaño de palabra.
Hmm ¿podemos hacerlo sin un CAS incluso si usamos campos de tamaño de palabra? Si no es básicamente solo lectura + mezcla de bits + CAS contra CAS - probablemente no tan mal, pero aún más lento. – Voo
@Voo no es tan malo en mi experiencia como 'sincronizado' puede ser optimizado por el JIT es maneras de bloqueo no lo es. –
Estoy hablando de la implementación sincronizada. Incluso si usáramos un encabezado de bloqueo con palabras, aún necesitaríamos un CAS que debería dominar la mezcla de bit, por lo que no hay mucha diferencia allí. Sin embargo, probablemente estamos hablando el uno del otro. – Voo
- 1. Relación entre el objeto MembershipUser y IPrincipal
- 2. ¿Existe una relación entre RTTI y excepciones?
- 3. Bloqueo anidado al mismo rendimiento del objeto
- 4. Diferencia entre el bloqueo (esto) y un bloqueo en el objeto estático
- 5. ¿Hay alguna diferencia entre el "bloqueo" de Java y el "bloqueo" de C#?
- 6. Relación entre archivo de objeto y archivo de objeto compartido
- 7. ¿Existe una relación entre llamar a una función e instanciar un objeto en lenguajes funcionales puros?
- 8. PIL cómo escalar el tamaño del texto en relación con el tamaño de la imagen
- 9. ¿Existe una diferencia de rendimiento entre el uso de 20 jarras y el uso de una sola reembalaje?
- 10. Cálculo del tamaño de bytes del objeto Java
- 11. La relación existente entre el tamaño de la ventana y el número de secuencia
- 12. PHP include(): Tamaño y rendimiento del archivo
- 13. relación entre el flop y la metaestabilidad
- 14. Diferencia entre el objeto y el objeto
- 15. Relación entre "cerrar" para PreparedStatement y Connection?
- 16. ¿Diferencia entre el bloqueo sincronizado y el reentrante?
- 17. Cola concurrente y de bloqueo en Java
- 18. ¿Cómo maneja Android las diferencias entre el tamaño/relación de vista previa y el tamaño real de SufaceView?
- 19. ¿Cómo conseguir el tamaño del archivo en Java
- 20. Asesorar sobre el rendimiento del cifrado de archivos en Java
- 21. ¿Cómo obtener el tamaño de la vida real de un objeto a partir de una imagen, cuando no se conoce la distancia entre el objeto y la cámara?
- 22. ¿El tamaño de una clase java afectará el rendimiento de la aplicación?
- 23. fwrite() - efecto de tamaño y cuenta en el rendimiento
- 24. ¿Qué relación existe entre GDAL, FDO y OGR?
- 25. Diferencia entre el objeto Node y el objeto Element?
- 26. ¿Es posible contar remotamente el objeto y el tamaño del repositorio de git?
- 27. Diferencia entre bloqueo (taquilla) y bloqueo (variable_which_I_am_uso)
- 28. diferencia entre el valor inicial y el punto de referencia en el rendimiento de una aplicación
- 29. ¿Existe una relación entre las citas de código sin tipo/tipadas en F # y macro hygiene?
- 30. Bloqueo parcial en java
No debe haber relación con el tamaño con bloqueos de tipo 'sincronizado' (según mi experiencia al implementar esto), y de una breve reseña de Java 5 esquema de bloqueo, no veo de manera directa cómo podría haber una dependencia allí tampoco. Obviamente requiere más almacenamiento, por supuesto, implementar los objetos 'Lock' por separado, pero eso debe ser una sobrecarga fija. –
@HotLicks eso es lo que me sorprendió, el tamaño no tiene gastos adicionales, ¡gracias! – meer