Posts Tagged 'java'

Sin palabras…

pantallazo-30

pantallazo-32

Más información en la web de Sun o la de Oracle.

Java: Entendiendo los parámetros Xmx y Xms (parte I)

Recientemente he recibido una notificación del CPD donde uno de «mis clientes» alojan una aplicación web Java™ desarrollada por mi equipo advirtiéndome de que la misma estaba consumiendo grandes cantidades de memoria (más de 1 Gb) que aparentemente no se recuperaba (sube de modo gradual sin llegar a liberar).

La razón, lejos de ser un problema de la aplicación en cuestión, es más bien un comportamiento correcto acorde con los parámetros de configuración de la máquina virtual asignados por parte de los administradores del servidor de aplicaciones que, en concreto, eran -Xms500m -Xmx1700m.

Estos parámetros explican perfectamente este comportamiento. Veamos la teoría:

  • Xms: Indica el tamaño mínimo del heap que ha de reservar la máquina virtual.
  • Xmx: Indica el tamaño máximo del heap.

Veamos ahora que ocurre en la práctica:

1.- Añadimos el siguiente parámetro a la máquina virtual para poder monitorizar remotamente nuesta aplicación-cobaya:

-Dcom.sun.management.jmxremote

2.- Fijamos los parámetros Xmx y Xms por ejemplo así:

-Xmx512m
-Xms128m

3.- Ejecutamos la consola de Java usando el comando jconsole (viene de serie con el JDK) y nos conectamos el agente correspondiente a la aplicación a testear.

agente

4.- Ahora podemos ver, tras hacer click en la pestaña «memory» y meter caña a la aplicación en paralelo, la gráfica de memoria. Para los parámetros antes fijados dicha gráfica debería ser similar a esta.

-Xmx512m

-Xmx512m

Como se puede observar la memoria usada del heap va aumentando escalonadamente hasta aproximarse al especificado en el parámetro Xmx. Una vez llegado a lo alto del pico el GC limpia y el uso de memoria cae en picado para volver de nuevo a empezar el ciclo.

Si por ejemplo fijamos el parámetro Xmx a 128 megas el pico máximo sería precisamente un valor próximo a esa cantidad. La gráfica sería similar a la anterior aunque las iteraciones serían, como es lógico más cortas:

-Xmx128

-Xmx128

En próximos posts mostraré el comportamiento en casos de andar escasos de memoria, fijar valores muy bajos, como tunear estos parámetros, etc.

Java.Inquisition

Java.Inquisition es una aplicación stand alone para la creación y resolución de tests del estilo a los que nos podemos encontrar en el «Sun Certified Java Programmer» (SCJP). Por defecto trae 30 cuestiones prácticas del SCJP 5 y del SCJP 6, y 50 para el SCWCD 1.4 y para el SCWCD 5

Entre sus características más descables se encuentra la capacidad de responder preguntas via drag and drop y es compatible con las preguntas de JPilotExam, con las preguntas de Ultramock y parcialmente con las de Magnet Mocker. Además está desarrollada en Java y es open source.

Nueva Refcardz disponible para descargar – JPA

La gente de DZone acaba de publicar una nueva refcardz. Las refcardz son unas excelentes guías de referencia rápida sobre diferentes temas relacionados con la programación. Esta vez es sobre JPA (Getting started with JPA ).

Precisamente llevo toda la mañana tratando de resolver un problemilla que tengo con OpenJPA… así que la guía me viene de maravilla 😉

Guerras de robots

Pero… ¿En qué mundo vivo? ¿Cómo es posible que no conociera de la existencia de RoboCode hasta ahora?.

RoboCode consiste en programar mini tanques para luchar contra otros tanques programados por otra gente. Todos los robots son iguales con sus cañones, sensores y demás. El juego consiste en programar una estrategia. Esta pensado como herramienta para aprender a programar, pero también puede ser un juego muy adictivo.

Creo que he descubierto un nuevo hobbie 😉

— Actualización (22:41): Otro jueguecillo más simple y online es el que acabo de ver en noticiasfrikis.com. Se llama light-bot y consiste en crear un algoritmo de forma visual para tratar de conseguir que un robot consiga llegar a su objetivo.

Libro gratuito de introducción a JSF

En breve postearé un tutorial de introducción a Icefaces. ICEfaces es un framework AJAX que permite a los desarrolladores Java EE crear, de manera sencilla, aplicaciones RIA usando únicamente Java. Las aplicaciones ICEfaces son aplicaciones JavaServer Faces (JSF).

Si te interesa introducirte en el mundo JSF aquí puedes obtener un libro gratuito en PDF con una introducción.

Visto en: http://java.dzone.com/articles/jsf-jumpstarter-free-pdf-book-

IAQs

IAQ. es la sigla de Infrequently Answered Question. En español lo traduciríamos como Pregunta Infrecuentemente Contestada y viene a ser lo contrario a la sigla FAQ que todos conocemos.

Peter Norvig director de investigación de Google mantiene desde hace tiempo una colección de IAQs de Java e IAQs de Python.

Este tipo de preguntas infrecuentemente contestadas son las que a veces aparecen en los típicos test de exámenes de certificación o en sitios del estilo JavaBlackBelt.

Jeliot 3 – Como se interpreta un programa Java

Jeliot 3 es una aplicación que muestra de forma gráfica como un programa Java es interpretado. Para hacerlo funcionar tan solo hay que crear una o varias clases (una de ellas con un main), compilar, dar al botón animar y acto seguido la aplicación mostrará las llamadas a los métodos, la transformación de las variables, y las operaciones a medida se vayan realizando.

Otra particularidad de Jeliot 3 es que puede ser añadido a BlueJ como extensión. Para quien no lo conozca BlueJ es el mejor IDE para aprender a programar.

Prueba de concepto de DWR (parte I)

He oido hablar muy bien de DWR (Direct Web Remoting) pero hasta ahora no he tenido un momento para probarlo.

DWR es una librería RPC para la realización de llamadas a métodos de clases Java desde funciones JavaScript de manera asíncrona (ajax)

y viceversa (Ajax inverso):

A continuación muestro los pasos que he seguido para realizar las prueba de concepto.

Creo un proyecto web (Dynamic Web Project) con Eclipse.

Descargo dwr.jar y lo añado a las librerías del proyecto junto al jar de Commons Logging requerido.

Dwr.jar contiene dos partes fundamentales. Un Servlet corriendo en el servidor que procesa las peticiones para devolver las respuestas al cliente y unos ficheros js que se encargan de realizar peticiones desde la parte cliente.

El Servlet se añade al proyecto como cualquier otro; insertando su definición y su correspondiente mapping en el fichero web.xml:

<servlet>
	<servlet-name>dwr-invoker</servlet-name>
	<display-name>DWR Servlet</display-name>
	<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
	<init-param>
		<param-name>debug</param-name>
		<param-value>true</param-value>
	</init-param>
</servlet>
<servlet-mapping>
	<servlet-name>dwr-invoker</servlet-name>
	<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

Una vez definido el servlet hay que crear un fichero de configuración en el directorio WEB-INF y llamarlo dwr.xml:

<!DOCTYPE dwr PUBLIC
    "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
    "http://getahead.org/dwr/dwr20.dtd">

<dwr>
  <allow>
    <create creator="new" javascript="JDate">
      <param name="class" value="java.util.Date"/>
    </create>
  </allow>
</dwr>

Este fichero define que clases van a ser creadas y usadas remotamente desde JavaScript. Por ahora sólo he definido la clase java.util.Date y lo he hecho usando new como valor del atributo creator. Este valor indica que se creará una instancia de la clase usando este mismo operador. Aquí hay un listado con el resto de de los creators disponibles.

Ya tengo todo lo necesario para trabajar con DWR y para comprobar que no falta nada despliego* el proyecto en el servidor y hago una llamada al servlet [http://localhost:8080/PruebaDWR/dwr/] desde el navegador. Si todo va bien debería aparecer un listado con todas las clases visibles por DWR (las definidas en las propiedades) y, pinchando sobre cada una de ellas, un detalle de las mismas:

* Nota: Si usas Eclipse Ganymede hace poco publiqué una entrada de como desplegar una aplicación en Jetty

Posteriormente creo un html sencillo y en el head añado las referencias a los ficheros js indicadas en el detalle de la pantalla previamente mostrada.

<script type='text/javascript' src='/PruebaDWR/dwr/interface/JDate.js'></script>
<script type='text/javascript' src='/PruebaDWR/dwr/engine.js'></script>
<script type='text/javascript' src='/PruebaDWR/dwr/util.js'></script>

Por último, tan sólo queda realizar la llamada de forma remota a un método cualquiera de la clase Date. En este caso la hago al método toString que debería devolver la fecha y la hora actual del sistema:

    JDate.toString(function(data) {
  	    document.write(data); 
    });

Llamo al html desde el navegador y obtengo el resultado esperado Sun Aug 24 23:40:22 CEST 2008.

—-

Esto es todo por hoy… en la parte 2 de esta introducción, que publicaré presumiblemente mañana, mostraré como modificar el contenido de la parte cliente desde Java (Ajax inverso).

Buenas noches. Mañana será otro hermoso día 😉

Sustituir DisplayTag por JMESA

Son muchos los proyectos que usan DisplayTag para la creación de tablas con paginación y exportación automática. Es un taglib muy últil que ahorra mucho tiempo y líneas de código a un programador. En mi opinión se ha quedado un poco deprecated. Afortunadamente existe una alternativa más moderna y potente llamada jMesa.

A continuación muestro los pasos a seguir para sustituir DisplayTag por Jmesa:

Descargo jMesa de la aquí.

Añado la tld que se encuentra bajo el directorio /jmesa-2.3.3/dist del zip al directorio /WEB-INF/tld de mi aplicación.

También añado los ficheros css, javascript, las imágenes y por supuesto los jar en sus directorios correspondientes. Como jMesa requiere de JQuery también lo añado al directorio al directorio js (la versión de producción la puedes obtener aquí). No importa donde se coloquen los css ni los javascript dado que se referencian posteriormente a mano. Las imágenes sin embargo tienen que estar en una ruta determinada que ha de coincidir con la del valor de la clave html.imagesPath especificada en el fichero jmesa.properties.

Este último fichero hay que crearlo y referenciarlo desde el web.xml así que, primero lo referencio:

  <context-param>
<param-name>jmesaPreferencesLocation</param-name>
<param-value>WEB-INF/jmesa.properties</param-value>
</context-param>

Y luego lo creo en el directorio WEB-INF de la aplicación. Tiene esta pinta:

html.table.component.theme=jmesa
html.table.renderer.styleClass=table

html.row.renderer.highlightClass=highlight
html.row.renderer.evenClass=even
html.row.renderer.oddClass=odd

html.column.header.renderer.image.sortAsc=sortAsc.gif
html.column.header.renderer.image.sortDesc=sortDesc.gif
html.column.filter.renderer.image.droplistHandle=droplistHandle.gif

html.tbodyClass=tbody
html.titleClass=title
html.filterClass=filter
html.headerClass=header
html.toolbarClass=toolbar
html.statusBarClass=statusBar
html.imagesPath=/images/table/
html.rowcount.includePagination=false

html.toolbar.maxRowsDroplist.increments=15,50,100

html.toolbar.image.csv=csv.png
html.toolbar.image.pdf=pdf.gif
html.toolbar.image.excel=excel.gif
html.toolbar.image.clear=clear.png
html.toolbar.image.firstPage=firstPage.png
html.toolbar.image.firstPageDisabled=firstPageDisabled.png
html.toolbar.image.lastPage=lastPage.png
html.toolbar.image.lastPageDisabled=lastPageDisabled.png
html.toolbar.image.nextPage=nextPage.png
html.toolbar.image.nextPageDisabled=nextPageDisabled.png
html.toolbar.image.prevPage=prevPage.png
html.toolbar.image.prevPageDisabled=prevPageDisabled.png
html.toolbar.image.filter=filter.png
html.toolbar.image.separator=separator.gif

Ya esta configurado. Se puede usar de muchas maneras todas muy bien documentadas en la página oficial. Como mi idea es sustituir el DisplayTag del modo más rápido e indoloro posible tan sólo he de sustituir el tag usado antes por uno similar donde lo que voy a iterar en cada fila es un item de lista de objetos. Es exactamente lo mismo que se hace con DisplayTag con lo que no he de cambiar para nada el controlador.


<jmesa:tableFacade
        id="tag"
        items="${listaObjetos}"
        var="bean"
        >
        <jmesa:htmlTable>
            <jmesa:htmlRow>
                <jmesa:htmlColumn property="nombre"/>
                <jmesa:htmlColumn property="descripcion" title="Descripción"/>

            </jmesa:htmlRow>
        </jmesa:htmlTable>
    </jmesa:tableFacade>

En el ejemplo cada objeto tiene un atributo nombre y un atributo descripción, se mostrará cada uno en una columna.

No hay que olvidar cambiar en namespace de displaytag por el de Jmesa:


<%@ taglib uri="/WEB-INF/tld/jmesa.tld" prefix="jmesa" %>


Add to Technorati Favorites
Clicky Web Analytics Clicky

Flickr Photos