Buscar
Social
Ofertas laborales ES

Foro sobre Java EE > Configurar Memoria en JVM o en Aplicación (contenedor, jar, clase)

Hola,

He estado revisando información sobre la configuración del uso de la memoria en java. Los significados de los diferentes parámetros (-Xms, -XX:PermSize, etc) los tengo bastante claros, lo que me genera dudas es la forma cómo se establecen los valores de dichos parámetros, he visto ejemplos que lo hacen al iniciar el contenedor (tomcat, jboss, etc), otros ejemplos al ejecutar una jar o una clase por lo que mis dudas son:

1. ¿los valores se definen para cada aplicación o en general para la JVM instalada en la pc/servidor donde se ejecutan las aplicaciones?

2. Si en una misma pc/servidor ejecuto un tomcat, un jboss, un jar, etc; cada uno con diferentes valores para los parámetros ¿qué valores toma la JVM: los de la primera aplicación ejecutada, de la última, los valores más altos de cada parámetro?

Espero me alguien me pueda ayudar a absolver estas dudas.

Saludos,

octubre 3, 2011 | Unregistered CommenterJuan

Desde tu aplicación tu no controlas la cantidad de memoria asignada o reservada, toda esa gestión la hace la máquina virtual. Los switches como Xmx o XX:MaxPermSize se los pasas como argumento cuando arrancas tu aplicación. Java no está pensado para ejecutar múltiples aplicaciones a la vez, aunque hay programas que emulan este comportamiento. Un application server es un claro ejemplo de ésto, y en consecuencia, toda esta configuración aplica para la máquina virtual que ejecuta al programa (en este caso un application server).

Saludos,

octubre 3, 2011 | Registered Commenterantoniovl

Hola Antonio, gracias por tu respuesta.

Entiendo la primera parte de tu respuesta porque va en el mismo sentido de la información que he leido en la web pero la segunda me agrega una nueva duda cuando dices "Java no está pensado para ejecutar múltiples aplicaciones a la vez".

Yo he usado al mismo tiempo, por ejemplo, eclipse y netbeans; asimismo en un entorno de desarrollo también he trabajado con un tomcat y un jboss al mismo tiempo y es por ello mi duda respecto a la configuración de la memoria: si inicio el tomcat con ciertos valores para los parámetros de memoria de la JVM y luego ejecuto el jboss con otros valores para los mismos parámetros ¿quá pasa? ¿qué valores toma la JVM: los de la primera aplicación ejecutada, de la última, los valores más altos de cada parámetro?

Saludos,

octubre 4, 2011 | Unregistered CommenterJuan

Hola,
no soy un experto ni de lejos, pero creo que los parámetros que pones para elegir y personalizar el GC al ejecutar una aplicación, sólo afectan a esa aplicación. Según entiendo yo, la JVM toma esos valores y configura el GC para esa aplicación.

A mi también me ha extrañado lo de la frase "Java no está pensado para ejecutar múltiples aplicaciones a la vez". Antonio, ¿podrías aclararnos esto?

un saludo

octubre 4, 2011 | Registered Commenterrobertiano

Una cosa es que una aplicación sea multithread y pueda hacer muchas cosas a la vez, y otra es que en una misma JVM puedas lanzar dos classes con método main() desde jars independientes. A eso me refiero con ejecutar múltiples aplicaciones simultáneas.

Les mencionaba como ejemplo un application server como Glassfish o Tomcat (a menor escala). Cuando desarrollamos una "aplicación" web, ésta se empaca en un war pero ninguna clase tiene un método main(). Es el application server el encargado de cargar en memoria las clases e invocar un método específico de servicio; el único método main() invocado fué el del bootstrap del application server. Si arrancamos una copia de NetBeans y después una de Eclipse, cada una de ellas correrá en diferente máquina virtual, y sería deseable por eficiencia y optimización de recursos, que se hiciera en una sola.

Hubo un proyecto que experimentó con esto, conocido como Proyecto Barcelona. También hay un trabajo de Chris Oliver al respecto, llamado "Poor man's multi-VM" el cual les recomiendo que lo lean y experimenten, no tiene desperdicio. De hecho en éste trabajo basamos el projecto Joing del Maestro Peyrona.

Java 9 tiene planes para incluír esto en un feature llamado Multitenancy. Pueden leer un poco mas en el blog de Cay Horstmann.

Saludos,

octubre 4, 2011 | Registered Commenterantoniovl

Ahora mismo, olvidate de aplicaciones, threads y demás. Los parámetros -XX son para la JVM y se aplican a la instancia de la JVM a la que se los pases. Si ejecutas varias JVM, cada una puede tener sus parámetros. Lo que hagas dentro de cada JVM no viene al caso.

En el futuro, ya veremos como se hace.

octubre 6, 2011 | Unregistered CommenterVerdoso

Gracias Antonio!!!

si que me sonaba lo de que no es muy optimo el tema de las instancias de la máquina virtual por proceso, pero no creía que fuese tan chungo. Y no tenía ni idea de estos proyectos.

octubre 6, 2011 | Registered Commenterrobertiano

1. ¿los valores se definen para cada aplicación o en general para la JVM instalada en la pc/servidor donde se ejecutan las aplicaciones?

Hola Juan, coincidiendo con lo que dice Verdoso puede ejecutar en una máquina tantas JVM como quieras (y tengas memoria para ello) y los parámetros los aplicas a cada una de esas JVMs no por aplicación.

2. Si en una misma pc/servidor ejecuto un tomcat, un jboss, un jar, etc; cada uno con diferentes valores para los parámetros ¿qué valores toma la JVM: los de la primera aplicación ejecutada, de la última, los valores más altos de cada parámetro?

Cada uno tendrá los parámetros de memoria que le hayas definido cada JVM es independiente . En los scripts de arranque de tomcat o jboss puedes cambiar estos parámetros.

octubre 7, 2011 | Unregistered CommenterAntuanF1

Gracias a todos por sus respuestas. Ahora tengo completa claridad en el tema.

Saludos,

octubre 8, 2011 | Unregistered CommenterJuan