Sei sulla pagina 1di 27

Optimización del rendimiento de

aplicaciones java

Conceptos Java y
arquitectura JVM

1
Un poco de historia

 1995 (1.0) : Primera versión


 1997 (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) …

2
Un poco de historia

3
Arquitectura de la plataforma J2SE

Sun 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
4
Arquitectura de la plataforma J2SE

5
Herramientas incluidas en el JDK

 Java 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.

6
Características Máquina Virtual Java JVM

 Definició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)

7
Características Máquina Virtual Java

 La 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.
8
HotSpot
Características comunes a ambas implementaciones
 Compilador 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.

9
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)

10
Comportamiento del GC

 A la izquierda los objetos young que se eliminan


rápidamente. A la derecha los que sobreviven durante
mas tiempo
11
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.
12
GC: Áreas de memoria (heap)

13
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

14
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 1.4.2.

15
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.

http://download.java.net/jdk7/docs/technotes/guides/vm/gc-ergonomics.html

16
Hotspots

Resto de opciones JVM consultar :


http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

17
Cambios en Java Virtual Machine

Mejoras
 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

18
Cambios en Java Virtual Machine
Mejoras 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
19
Cambios en Java Virtual Machine

Mejoras 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

20
Cambios en Java Virtual Machine

Mejoras 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.

http://java.sun.com/javase/6/docs/technotes/guides/vm/server-class.html

21
Cambios en Java Virtual Machine

Mejoras 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.

22
Cambios en Java Virtual Machine

Mejoras 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.

http://forums.sun.com/thread.jspa?forumID=31&threadID=550529
http://www.javaworld.com/javaworld/jw-09-1998/jw-09-threads_p.html
 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).
23
Cambios en Java Virtual Machine

Mejoras 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:


http://java.sun.com/javase/6/docs/technotes/guides/vm/dtrace.html
24
Cambios en Java Virtual Machine
Mejoras 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.

http://java.sun.com/javase/6/docs/technotes/guides/vm/par-compaction-6.html
https://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf

25
Cambios en Java Virtual Machine
Mejoras 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.

26
Cambios en Java Virtual Machine

Mejoras en JDK 6.0


 Mayor Rendimiento

27 Fuente: http://java.sun.com/performance/reference/whitepapers/6_performance.html

Potrebbero piacerti anche