Páginas

domingo, 16 de septiembre de 2012

Primeros pasos con Gnome Shell

Gnome Shell  es el gestor de ventanas de la versión 3 de Gnome.

Tras instalar Ubuntu 12.04 te encuentras con Unity, que nunca me ha gustado, por lo que tras volver a la versión 2 de Gnome (Gnome Panel), he decidido probar Gnome Shell.

Por el momento no tiene mala pinta, pero he tenido un par de dificultades que, si bien he resuelto, parece que indican que este gestor de ventanas tampoco va a ser intuitivo.

Ajuste de la resolución en Gnome Shell

Tras cerrar cierto juego a pantalla completa con una resolución distinta de la configurada por defecto en el gestor de ventanas, me he encontrado con una resolución de 800x600, por lo que no podía acceder a la configuración del monitor (en la configuración del sistema). Googleando he localizado un comando que permite ajustar la resolución sin problemas:

xrandr -s 1280x1024

Añadir a favoritos un ejecutable en Gnome Shell (dificil)

Para añadir al panel de favoritos una aplicación, ésta debe tener previamente un lanzador, dado que sin lanzador, la aplicación no aparece en la lista de aplicaciones y no he visto ninguna forma de buscar nuevas aplicaciones en esta lista. La forma más cómoda de definir un lanzador es instalar alacarte, que es el asistente de configuración del menú en Gnome 2:

sudo apt-get install alacarte

Después se ejecuta tecleando alacarte y se configura el lanzador en la categoría deseada.

Añadir a favoritos un ejecutable en Gnome Shell (fácil)

Otra forma mucho más simple de añadir aplicaciones al panel de favoritos es hacer permanente el icono "temporal" de la aplicación que aparece en el panel mientras esté abierta la aplicación. Para hacerlo debemos hacer clic con el botón derecho del ratón y seleccionar la opción "Añadir a los favoritos".

Eliminar acceso directo de la barra de favoritos en Gnome Shell

Para eliminar los accesos directos de la barra de tareas de Gnome3 (lo instale en Ubuntu 12.04 porque no me gustaba Unity) tenemos que pulsar con el botón derecho del ratón y, en el menú contextual, seleccionar la opción "Quitar de los favoritos".

Apagado rápido

En el menú de la derecha, donde está la configuración del sistema, tenemos la opción de  cerrar sesión y la de Suspender. La cuestión es que se echa de menos la opción de Apagar. Siempre habrá quien argumente que al fin y al cabo, suspendiendo el sistema tenemos un apagado mejorado que permite reiniciar el ordenador con las aplicaciones que ya teníamos abiertas, pero si queremos apagar completamente no hay una la opción directa. La solución es pulsar la tecla ALT mientras tenemos desplegado el menú, con lo que Suspender pasa a ser Apagar.

Abrir una segunda instancia de una aplicación

Cuando queremos abrir una segunda instancia de una aplicación, deberemos hacer clic con el botón derecho del ratón sobre el icono de la aplicación en la barra de favoritos y, en el menú contextual que aparece, seleccionar la opción "Ventana nueva". Un atajo es mantener pulsada la tecla CTRL mientras se hace clic con el botón izquierdo del ratón.

Minimizar todas las ventanas

Para minimizar todas las ventanas hay un atajo de teclado: CTRL+ALT+D.
Otra opción es: CTRL+ALT+SUPER (siendo SUPER la tecla con el icono de Windows). De todos modos todos éstos atajos son configurables en el panel de control/teclado/atajos.

Reajustar los atajos de teclado

Para reajustar los atajos de teclado deberemos acceder a la pantalla de configuración del sistema, llegamos a ella haciendo clic con el botón derecho del ratón sobre nuestro nombre de usuario en la parte superior derecha de la pantalla, en la ventana de configuración del sistema hacemos clic sobre la opción Teclado y en la pestaña Atajos tenemos todas las opciones.

Ajustar los botones minimizar, maximizar y cerrar en las ventanas

Para reajustar la ubicación de los botones minimizar, maximizar y cerrar en las ventanas, deberemos usar gconf-editor.
  1. Para instalarlo, si es que no está ya instalado: sudo apt-get install gconf-editor
  2. Para lanzarlo: sudo gconf-editor
  3. Si por ejemplo queremos ajustar la ubicación de los botones minimizar, maximizar y cerrar en las ventanas buscamos la variable: apps->metacity->general->button layout y ajustamos su valor a: ":minimize,maximize,close" (sin las comillas y con los dos puntos a la izquierda).

martes, 11 de septiembre de 2012

java.lang.OutOfMemoryError: PermGen space failure

Memoria en la máquina virtual de Java

La memoria de la Máquina Virtual se divide en varias regiones. Una de estas regiones es el PermGen, el área de memoria utilizada para, entre otras cosas, guardar el metadata de las clases como los atributos y sus tipos de datos, métodos etc. Esta memoria es de tipo non-heap. Las instancias de las clases se cargan en la memoria de tipo heap, a la que se van añadiendo y eliminando las instancias de las clases según se van utilizando y eliminándose por el recolector de basura (Garbage Collector, en adelante GC).

No vamos a entrar en el mecanismo de la carga y eliminación de clases en java porque excede este artículo, pero sí lo comentaremos brevemente para poder entender el porqué de la excepción OutOfMemoryException: para que una clase pueda ser eliminada por el recolector de basura (GC), es necesario que no esté referenciada por ninguna otra clase. Para que se pueda eliminar la memoria ocupada por una clase en el espacio PermGen, es necesario además que se elimine el classloader que cargó la clase.

El valor por defecto del espacio PermGen es de 64 Mb en la máquina virtual (VM) de Sun. Este valor es suficiente normalmente para las aplicaciones que corren de forma independiente. En el caso de una aplicación que corra en un servidor web tipo Tomcat o un servidor de aplicaciones, hay casos en los que este valor no es suficiente.

En primer lugar, es posible que la aplicación necesite más espacio por su propia arquitectura. Las librerías Spring e Hibernate son librerías grandes, que cargan muchas clases y además hacen uso de proxies y carga dinámica de clases que hacen uso del espacio PermGen por lo que puede que los 64Mb no sean suficientes. Este caso se da cuando la excepción con el error se produce nada mas arrancar el servidor web o de aplicaciones o al acceder a la aplicación. Para solventar este problema bastará con aumentar el tamaño máximo de la memoria de tipo PermGen según veremos más adelante.

En segundo lugar, la causa más probable de una excepción java.lang.OutOfMemoryError: PermGen space failure se produce cuando la aplicación se reinstala en el servidor sin reiniciar el servidor. La forma de reinstalar las aplicaciones es eliminando el classloader que cargó la aplicación por primera vez y creando un nuevo classloader para la nueva instancia de la aplicación. En teoría, esto proporciona una forma limpia de reinstalar aplicaciones, pero si el servidor web o de aplicaciones guarda una referencia al classloader antiguo, se produce una fuga de memoria (memory leak) y el resultado es que tendremos las clases de la aplicación cargadas dos veces en memoria. Es cuestión del número de recargas y de la memoria gastada por la aplicación el que se produzca la excepción  java.lang.OutOfMemoryError: PermGen space failure. En este caso no basta con aumentar el tamaño máximo de la memoria, ya que esto sólo retrasaría el problema a unas cuantas reinstalaciones más. En este caso la única solución consiste en averiguar la causa de la fuga de memoria. Esto también excede el contenido de este artículo, aunque lo intentarmos tratar con profundidad en otra ocasión. Por el momento sólo proporcionamos un enlace muy interesante, aunque en inglés, acerca de posibles causas de fugas de memoria en java: http://opensource.atlassian.com/confluence/spring/pages/viewpage.action?pageId=2669

Ajuste de la memoria de la máquina virtual Java

En Java, hay varios parámetros para controlar el tamaño inicial y el tamaño máximo que puede tomar la máquina virtual.

Además, hay que tener en cuenta el tipo de memoria sobre el que se quiere actuar: heap, non-heap (PermGen). Los valores por defecto que se dan corresponden a máquina virtuales de Sun, y son orientativos, porque pueden cambiar entre versiones de la máquina virtual. Los parámetros son los siguientes, fijándose a 128Mb.
  • -Xms128m: Tamaño de inicio de la máquina virtual de Java a 128Mb. El valor por defecto son 64Mb. Si se aumenta este valor, se elimina el tiempo que se tardaría en aumentar el tamaño en memoria de la máquina virtual si se llegara el caso de que se necesitara más memoria, por lo que aumentaría el rendimiento en los casos que la aplicación haga uso intensivo de la memoria.
  • -Xmx128m: Tamaño máximo de la máquina virtual de Java a 128Mb.  El valor por defecto son 128Mb. Si la aplicación supera el tamaño máximo de memoria que marca este parámetro, se lanza la excepción java.lang.OutOfMemoryError.  No conviene asignar a este parámetro el máximo de la memoria de la máquina porque si ya no queda memoria física disponible (por la que usa el sistema operativo u otras aplicaciones) se pueden producir escrituras en memoria asignada a otros programas y provocar un auténtico lío.
  • -XX:PermSize=128m: Tamaño de inicio de la memoria de tipo PermGen a 128Mb. Arrancar la máquina virtual con un valor superior al por defecto agiliza la carga de aplicaciones, sobre todo en el caso de aplicaciones que hagan uso intensivo de este tipo de memoria (Spring, Hibernate…)
  • -XX:MaxPermSize=128m: Tamaño máximo de la memoria de tipo PermGen a 128Mb. El valor por defecto son 64Mb. Si la aplicación supera el tamaño máximo de memoria para este tipo que marca este parámetro, se lanza la excepción java.lang.OutOfMemoryError: PermGen space. El valor necesario para este parámetro siempre suele ser menor que el de la memoria de tipo heap.
Si se quiere especificar un valor distinto de 128Mb, que se utiliza para todos los parámetros como ejemplo para simplificar, bastaría con sustituir el valor 128 del parámetro con el que se desee, siempre que sean múltiplos de 2 (64, 128, 256, 512, 768, 1024, 2048…)

Conocidos los tipos de memoria y los parámetros que los controlan, ahora viene la pregunta, ¿cómo especifico estos valores para mi aplicación? La respuesta es la misma para todos los casos: Los valores se especifican como parámetros en el arranque de la máquina virtual que ejecutará la aplicación. La diferencia estribará en cómo se arranca la aplicación: con un script, desde línea de comandos, mediante ant…

Artículos originales en: http://www.programacionenjava.com/blog/tag/outofmemory/