Optimización de Aplicaciones

Por Carlos Zuluaga.

Después de realizar las optimizaciones de infraestructura el rendimiento de la aplicación puede no ser el esperado o de hecho, puede estar claro que la aplicación tiene problemas de rendimiento como tiempos de respuesta algo, problemas de escalabilidad, de consumo de memoria, entre otros.
Veamos ahora las optimizaciones específicas realizadas a la aplicación tanto de configuración como de código. Para esta sección debe abrir el código fuente del proyecto proporcionado con el .zip que descargó para instalar la aplicación de ejemplo, copiélo en un Workspace existente y ábralo por la opción Import —> General —> Existing Projects into Workspace. El proyecto incluye la configuración para abrirlo en Eclipse.

Optimización de Aplicaciones

1. Duración de la sesión. Una aparente fuga de memoria puede darse por la duración de la sesión que en el caso de la aplicación de ejemplo es 30 minutos. Es decir, cualquier cosa que se almacene en la sesión de usuario, va a durar en memoria 30 minutos más después de la última petición.
Aquí se puede optimizar de dos formas: la primera es eliminando objetos innecesarios de la sesión, algo que veremos en el segundo punto. La segunda, es disminuir el timeout de forma que el Garbage Collector recupere más rápido la memoria consumida.

Modifique el timeout de la sesión modificando el archivo web.xml que está ubicado en EjemploPruebaCarga\WebContent\WEB-INF\web.xml. Asígnele 10 minutos.

Optimización de Aplicaciones

2. Elimine objetos de sesión innecesarios. Intencionalmente en la clase LoginBean.java en la línea 37 puse un objeto bastante pesado en la sesión. Comente la línea.

Optimización de Aplicaciones

3. Evite el uso de estructuras sincronizadas. La clase LoginValidator.java es la encargada de validar la autenticación de usuario y para esto almacena en un objeto de tipo java.util.Map los usuarios y sus contraseñas. El problema es que la implementación que está usando es un Hashtable, un objeto poco recomendado, ya que la forma de proteger su contenido de las modificaciones concurrentes es sincronizar todos sus métodos.
Desde la versión 1.5 del JDK fue incluida la clase ConcurrentHashMap, una estructura que protege los datos de modificaciones concurrentes, pero con un mecanismo mucho más ágil que no afecta tan notablemente los tiempos de la lectura de datos.

Abra la clase LoginValidator.java y cambie el Hashtable por un ConcurrentHashMap.

Optimización de Aplicaciones

4. Hasta acá el proceso de optimización. Vuelva a empaquetar la aplicación en un .war haciendo clic derecho sobre el proyecto y seleccionando Export —> WAR File. Guarde el archivo generado y despliegue la nueva versión en el Tomcat que ha venido trabajando durante el taller y observe el cambio en el compartamiento de la aplicación.

Optimización de Aplicaciones

Seguramente hasta acá las cosas parecerán mucho más fáciles de lo que son, pero en la vida real encontrar puntos de optimización suele ser realmente difícil, consume bastante tiempo y es costoso en términos de recursos y dinero, por esto se deja como última actividad de optimización.
La mejor forma de encontrar estos puntos de optimización es el uso de un profiler, analizar el consumo de tiempo de los métodos ante peticiones consecutivas y peticiones concurrentes o los objetos que hay en memoria antes y después de una sesión de carga. Básese también en buenas prácticas de codificación y use la experiencia ajena en este proceso.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License