example java multithreading concurrency low-latency

example - ¿Cuál es su lista de comprobación de desarrollo para la aplicación Java de baja latencia?



java concurrency (10)

Aunque la inmutabilidad es buena, no necesariamente va a mejorar la latencia. Garantizar baja latencia es probable que dependa de la plataforma.

Aparte del rendimiento general, el ajuste de GC es muy importante. La reducción del uso de memoria ayudará a GC. En particular, si puede reducir el número de objetos de mediana edad que necesitan moverse, manténgalo bien de larga vida o de corta duración. También evite cualquier cosa que toque el gen de la permanente.

Me gustaría crear una lista de verificación completa para la aplicación Java de baja latencia. ¿Puedes agregar tu lista de verificación aquí?

Aquí está mi lista
1. Haz que tus objetos sean inmutables
2. Trate de reducir el método sincronizado
3. La orden de bloqueo debe estar bien documentada y manejarse con cuidado
4. Usa profiler
5. Usa la ley de Amdhal y encuentra la ruta de ejecución secuencial
6. Use las utilidades de simultaneidad Java 5 y las cerraduras
7. Evite las prioridades de subprocesos ya que dependen de la plataforma
8. El calentamiento de JVM puede ser usado
9. Prefiere la estrategia de bloqueo injusto
10. Evite el cambio de contexto (muchos hilos conducen a contraproducentes)
11. Evita el boxeo, des-boxeo
12. Presta atención a las advertencias del compilador
13. El número de hilos debe ser igual o menor que el número de núcleos

La aplicación de baja latencia se sintoniza por milisegundos.



Use StringBuilder lugar de String al generar Strings grandes. Por ejemplo, consultas.


evitar el boxeo / unboxing, use variables primitivas si es posible.


Otra idea importante es hacer que funcione primero, luego medir el rendimiento, luego aislar los cuellos de botella, luego optimizarlos, luego medir nuevamente para verificar la mejora.

Como dijo Knuth, "la optimización prematura es la raíz de todo mal".


Evite el cambio de contexto siempre que sea posible en la ruta de procesamiento del mensaje. Consecuencia: use NIO y el hilo de evento de evento único (reactor)


No programe más hilos en su aplicación que sus núcleos en el hardware subyacente. Tenga en cuenta que el sistema operativo requerirá la ejecución de subprocesos y posiblemente otros servicios que compartan el mismo hardware, por lo que se le puede solicitar a su aplicación que use menos del número máximo de núcleos disponibles.


Mida, mida y mida. Utilice datos tan cercanos a los reales con un hardware de producción tan cercano para ejecutar puntos de referencia de manera regular. Las aplicaciones de baja latencia a menudo se consideran mejor como dispositivos, por lo que debe tener en cuenta toda la caja implementada, no solo el método / clase / paquete / aplicación / JVM particular, etc. Si no construye puntos de referencia realistas en la configuración de producción, tendrá sorpresas en producción.


Evite el bloqueo extensivo y el multihilo con el fin de no alterar las funciones mejoradas de los procesadores modernos (y sus cachés). Luego puede usar un único subproceso hasta sus límites increíbles (6 millones de transacciones por segundo) con muy baja latencia.

Si desea ver una aplicación Java de baja latencia del mundo real con suficientes detalles sobre su arquitectura, eche un vistazo a LMAX:

La arquitectura LMAX


Creo que "Usar objetos mutables solo donde sea apropiado" es mejor que "Hacer que tus objetos sean inmutables". Muchas aplicaciones de latencia muy baja tienen grupos de objetos que reutilizan para minimizar GC. Los objetos inmutables no se pueden reutilizar de esa manera. Por ejemplo, si tienes una clase de ubicación:

class Location { double lat; double lon; }

Puede crear algunos en el arranque y usarlos una y otra vez para que nunca causen asignaciones y el GC posterior.

Sin embargo, este enfoque es mucho más complicado que usar un objeto de ubicación inmutable, por lo que solo debe usarse donde sea necesario.