1 Optimización del rendimiento de aplicaciones javaConceptos Java y arquitectura JVM
2 Un poco de historia 1995 (1.0) : Primera versión1997 (1.1) : JDBC, RMI, Clases anidadas 1998 (1.2) : JIT, Reflection, Collections 2000 (1.3-Kestrel) : Hot Spot, JNDI 2001 (1.4-Merlin) : Assertions, Logging, NIO 2004 (1.5-Tiger) Generics, Enums, Annotations Aumento Facilidad de Desarrollo 2006 (1.6-Mustang) Swing, JDBC, JAX-WS Aumento del Rendimiento 2009?? (1.7-Dolphin) …
3 Un poco de historia
4 Arquitectura de la plataforma J2SESun Microsystems proporciona dos productos en su plataforma estándar (Java SE): Java SE Runtime Environment (JRE) Proporciona las librerías, Máquina virtual y otros componentes necesarios para la ejecución de applets y aplicaciones escritas en Java Java SE Development Kit (JDK) Incluye el JRE + herramientas de desarrollo de línea de comandos como compiladores y depuradores necesarios o útiles para el desarrollo de applets y aplicaciones
5 Arquitectura de la plataforma J2SE
6 Herramientas incluidas en el JDKJava Virtual Machine Tool Interface (JVMTI) Interfaz para programación en el lenguaje nativo de la plataforma destinado a la creación de herramientas de desarrollo y monitorización Java Platform Debugger Architecture (JPDA) Arquitectura para depuración multicapa que facilita la creación de herramientas de depuración independientes de la plataforma Compilador (javac) Añadidas nuevas opciones al compilador Herramienta javadoc Creación de nuevos tags relacionados con los nuevos elementos Annotation Processing Tool (apt) Herramienta de comandos para el procesado de anotaciones JConsole Herramienta gráfica que permite la monitorización y gestión de aplicaciones utilizando JMX.
7 Características Máquina Virtual Java JVMDefinición Es una máquina abstracta que contiene un conjunto de instrucciones que le permite manipular la memoria en tiempo de ejecución. El bytecode generado en el proceso de compilación es interpretado por la máquina virtual. Existen implementaciones de la máquina virtual para diferentes plataformas, proporcionando independencia del sistema operativo y el hardware. Write once run anywhere (WORA)
8 Características Máquina Virtual JavaLa plataforma estándar proporciona dos implementaciones de máquina virtual (JVM): Java HotSpot Client VM Implementación para plataformas utilizadas para aplicaciones cliente reduce el tiempo de arranque y la cantidad de espacio en memoria. Puede ser invocada mediante la opción –client al arrancar una aplicación. Java HotSpot Server VM Implementación diseñada para proporcionar la máxima velocidad de ejecución de programas a costa de memoria y tiempo de arranque. Puede ser invocada mediante –server cuando se lanza una aplicación.
9 HotSpot Características comunes a ambas implementacionesCompilador Adaptativo (Adaptive compiler) Aplicaciones lanzadas utilizando un interprete estándar. Posteriormente analiza la ejecución del código para detectar cuellos de botella o hot spot que compilará para aumentar el rendimiento evitando la compilación de código poco utilizado. Decide “al vuelo” la mejor forma de optimizar el código compilado con técnicas como el in-lining. Asignación de memoria y garbage collector más rápidos. Sincronización de hilos Presente en todas las plataformas.
10 HotSpot Ergonomía (Ergonomics)Las mejoras presentes en la versión J2SE 1.5 (Ergonomía) tratan de proporcionar un buen rendimiento para la JVM con una mínima utilización de las opciones (en línea de comandos). La ergonomía de la JVM trata de ajustar la mejor selección de: - Garbage Collector: Dentro de entre todos los disponibles - Tamaño de la memoria Heap: Tamaño mínimo, tamaño máximo, etc. - Compilador en tiempo de ejecución (JIT)
11 Comportamiento del GC A la izquierda los objetos young que se eliminan rápidamente. A la derecha los que sobreviven durante mas tiempo
12 GC: Áreas de memoria (heap)Podemos dividir la memoria del Heap en las siguientes regiones: Zona Young: Formada por zona Edén y zonas Survivor. Los objetos son inicialmente colocados en la zona Edén. Una zona Survivor está siempre vacía sirviendo de destino la siguiente vez entre la zona Edén y la zona Survivor utilizada. Zona Tenured (Old): Los objetos son copiados en la zona Young hasta que pasan a tener una edad y son copiados a la esta zona. Zona Perm: Contiene datos requeridos por la VM que no tienen equivalencia en Java. Almacena descripción de clases, métodos, etc.
13 GC: Áreas de memoria (heap)
14 GC: Áreas de memoria (heap)En cada recolección el GC intenta mantener las zonas de memoria dentro de unos límites: -XX:MinHeapFreeRatio = 40: Mínimo porcentaje de memoria (heap) libre después de un GC para evitar expansión. –XX:MaxHeapFreeRatio = 70 : Máximo porcentaje de memoria (heap) libre después de un GC para evitar encogimiento. -Xms : Tamaño inicial (defecto 3670k) -Xmx: Tamaño máximo de la memoria (defecto 64m) En servidores estos parámetros son insuficientes
15 Tipos de GC Además del GC en serie a partir de la versión 1.5 existen los siguientes GC: Throughput collector: Es paralelo y actúa sobre la zona Young. –XX:+UseParallelGC Concurrent Mark Sweep (Recolector de pausa baja): Es paralelo. Utilizado para recolectar la zona tenured y realiza la mayor parte de la recolección concurrentemente durante la ejecución de las aplicaciones. –XX:+useConcMarkSweepGC Incremental (train) Low Pauses: -XX:+UseTrainGC. No ha cambiado desde la versión
16 Hotspots Garbage Collector Ergonomics:1.PararellGC: En VM Server el GC ha cambiado de recolección en serie a recolección en paralelo ( -XX:+UsePararellGC) 2.En VM Server con PararellGC el tamaño del heap ha cambiado: a)Tamaño inicial (mayor de 1/64). -Xms b)Tamaño máximo(menor de ¼ o 1GB) -Xmx 3.PararellGC lanza una excepción(out-of-memory) si se gasta mucho tiempo en recolectar una porción pequeña del heap. Para evitarlo podemos incrementar el tamaño del heap. 4. Cambios en -XX:+UseAdaptiveSizePolicy al usar PararellGC.
17 Hotspots Resto de opciones JVM consultar :
18 Cambios en Java Virtual MachineMejoras En JDK 5.0: Class Data Sharing Server-Class Machine Detection Garbage Collection Ergonomics Thread Priority Changes Otras mejoras En JDK 6.0: DTtrace Probes Garbage Collection Enhancements Parallel Compaction Mejoras en Concurrent Mark Sweep Collector Mayor rendimiento
19 Cambios en Java Virtual MachineMejoras en JDK 5.0 Class Data Sharing Consiste en el volcado de determinadas clases core a un archivo que será compartido por todas las instancias de las máquinas virtuales. Además este archivo está diseñado para ser leído directamente por un HotSpot. Ventajas Disminución del tiempo de arranque de la máquina virtual. Al compartir todas las instancias el mismo archivo eliminamos la duplicidad que existía antes al tener que cargar todas las clases por instancia de máquina virtual. Inconvenientes No soportado en Windows 95/98/ME Solo disponible en VM Client Solo disponible con el Garbage Collector de serie Fuente:http://java.sun.com/javase/6/docs/technotes/guides/vm/class-data-sharing.html
20 Cambios en Java Virtual MachineMejoras en JDK 5.0 Class Data Sharing (Cont.) - Reconstrucción del archivo compartido java -Xshare:dump - Control Manual -Xshare:off :Deshabilita class data sharing. -Xshare:on :Obliga el class data sharing a habilitarse. Podría no habilitarse por varios motivos. -Xshare:auto : Por defecto, habilita la opción siempre que sea posible. Server-Class Machine Detection Opción automática
21 Cambios en Java Virtual MachineMejoras en JDK 5.0 Server-Class Machine Detection Detección automática en el arranque del tipo de máquina virtual que debe arrancar (vm client o vm server) en función de las especificaciones. Al arrancar en el modo mas óptimo para el hardware se consigue aumentar el rendimiento. La deducción se basa en la configuración de la plataforma (hardware + sistema operativo), algo normalmente poco fiable y variable en el tiempo. En Java 6.0 una máquina servidora es aquella con 2CPU y al menos 2GB de memoria.
22 Cambios en Java Virtual MachineMejoras en JDK 5.0 Garbage Collection Ergonomics: El parallel collector ha sido mejorado para adaptarse a las necesidades de memoria de la aplicación. Se puede especificar el tipo de rendimiento que queremos en la aplicación y automáticamente la maquina virtual optimizará el tamaño del heap para conseguir los objetivos de rendimiento. Con esto se evita el ajuste manual por línea de comandos que se necesitaba hasta ahora.
23 Cambios en Java Virtual MachineMejoras en JDK 5.0 Thread Priority Changes Cambio en el mapeo de la prioridad de los hilos. Ahora los hilos Java y los nativos compiten en igualdad asociando cada hilo Java con un hilo nativo únicamente. La relación entre el hilo Java y el hilo nativo es estable y persiste a lo largo del tiempo de vida del hilo Java. Otras mejoras El mecanismo de aviso de errores fatales ha mejorado en el diagnóstico y fiabilidad. Soporte de granularidad de nanosegundos para mediciones de tiempos (dependiente de plataforma).
24 Cambios en Java Virtual MachineMejoras en JDK 6.0 DTrace Probes Es una herramienta de instrumentación desarrollada por Sun en el 2005 y disponible en Solaris 10. DTrace está formado por una serie de elementos, el uso de los cuales nos permiten medir, controlar, registrar, etc. variables del sistema. Cuando utilicemos DTrace debes pensar (la misma nomenclatura de DTrace nos lleva a ello) que estamos poniendo sondas en el sistema que están recogiendo datos para nosotros. Está orientada tanto para desarrolladores, a los cuales puede ayudar en las distintas fases de desarrollo, midiendo variables del sistema, de la misma forma que ocurriría en un sistema en producción. DTrace Probes in HotSpot VM:
25 Cambios en Java Virtual MachineMejoras en JDK 6.0 Mejoras en el Garbage Collector Parallel Compaction Collector Complementa al GC paralelo existente a partir de Java 5.0 update 6. Utilizado en entornos multiprocesador. Realiza “Full GC” en paralelo. Durante un “Full GC” toda la memoria “heap” es revisada y liberada. En Java 5.0 el GC solo era capaz de realizar en paralelo “Young GC” en la que solo son liberados los recursos generados de forma mas temprana. Por defecto no está habilitado, aunque en futuras versiones es posible que sea una opción por defecto. Para habilitarla deberemos incluir -XX:+UseParallelGC al comando java de lanzamiento. https://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf
26 Cambios en Java Virtual MachineMejoras en JDK 6.0 Mejoras en el Garbage Collector (Cont.) - Concurrent Mark Sweep Collector Enhancement (Concurrent Low Pause Collector) Conocido como recolector paralelo de pausa baja o CMS. Está destinado a aplicaciones que son sensibles a pausas prolongadas provocadas por el GC potenciando la actividad del GC concurrentemente. Utilizado en máquinas con múltiples procesadores. Uso: -XX:+UseConcMarkSweepGC La llamada al GC mediante System.gc() o Runtime.getRuntime().gc() para que libere todos los objetos que no son usados, realiza una parada en todas las aplicaciones lo que provoca una pérdida de rendimiento cuando el uso la memoria “heap” es elevado. Beneficios El objetivo del CMS es reducir estos tiempos en pausas mas cortas. Aumento del tamaño de “young generation” cuando el CMS es usado (4MB a 16MB) Marcado paralelo de objetos no usado (Full GC). En versiones anteriores todo se realizaba en un solo hilo.
27 Cambios en Java Virtual MachineMejoras en JDK 6.0 Mayor Rendimiento Fuente: