<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Programacion en JAVA &#187; OutOfMemory</title>
	<atom:link href="http://www.programacionenjava.com/blog/tag/outofmemory/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.programacionenjava.com</link>
	<description></description>
	<lastBuildDate>Thu, 29 Apr 2010 10:46:38 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Aumentar el tamaño de memoria de la máquina virtual en Java</title>
		<link>http://www.programacionenjava.com/blog/2008/06/24/problemas-frecuentes/aumentar-el-tamano-de-memoria-de-la-maquina-virtual-en-java/</link>
		<comments>http://www.programacionenjava.com/blog/2008/06/24/problemas-frecuentes/aumentar-el-tamano-de-memoria-de-la-maquina-virtual-en-java/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 15:05:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Problemas Frecuentes]]></category>
		<category><![CDATA[Heap]]></category>
		<category><![CDATA[Memoria]]></category>
		<category><![CDATA[OutOfMemory]]></category>

		<guid isPermaLink="false">http://www.programacionenjava.com/?p=34</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>En Java, hay varios parámetros para controlar el <strong>tamaño inicial</strong> y el <strong>tamaño máximo</strong> que puede tomar la máquina virtual.</p>
<p>Además, hay que tener en cuenta el tipo de memoria sobre el que se quiere actuar: <strong>heap</strong>, <strong>non-heap</strong> (<strong>PermGen</strong>). 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.</p>
<ul>
<li><strong>-Xms128m</strong>: <strong>Tamaño de inicio</strong> 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.</li>
<li><strong>-Xmx128m</strong>: <strong>Tamaño máximo</strong> 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 <strong>java.lang.OutOfMemoryError</strong>.  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.</li>
<li><strong>-XX:PermSize=128m</strong>: <strong>Tamaño de inicio</strong> de la memoria de tipo <strong>PermGen</strong> 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&#8230;)</li>
<li><strong>-XX:MaxPermSize=128m</strong>: <strong>Tamaño máximo</strong> de la memoria de tipo <strong>PermGen</strong> 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 <strong>java.lang.OutOfMemoryError: PermGen space</strong>. El valor necesario para este parámetro siempre suele ser menor que el de la memoria de tipo heap.</li>
</ul>
<p>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&#8230;)</p>
<p>Conocidos los tipos de memoria y los parámetros que los controlan, ahora viene la pregunta, <strong>¿cómo especifico estos valores para mi aplicación? </strong>La respuesta es la misma para todos los casos: Los valores <strong>se especifican como parámetros en el arranque de la máquina virtual que ejecutará la aplicación</strong>. La diferencia estribará en cómo se arranca la aplicación: con un script, desde línea de comandos, mediante ant&#8230;</p>
<p>A continuación se dan distintos ejemplos de modificación de la memoria de distinta forma. No es necesario especificar todos los parámetros, se pueden especificar todos o ninguno (y se tomarían los valores por defecto)</p>
<p><strong>Línea de comandos</strong></p>
<ul>
<li><strong>Ejecución de un jar</strong>: java -Xms128m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m  -jar example.jar</li>
<li><strong>Ejecución de una clase</strong>: java -Xms128m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m  com.programacionenjava.examples.MemoryExample</li>
</ul>
<p><strong>Ant</strong></p>
<p>&lt;java classname=&#8221;com.programacionenjava.examples.MemoryExample&#8221; fork=&#8221;yes&#8221; spawn=&#8221;true&#8221;&gt;<br />
&lt;jvmarg value=&#8221;-Xms128m&#8221;/&gt;<br />
&lt;jvmarg value=&#8221;-Xmx512m&#8221;/&gt;<br />
&lt;jvmarg value=&#8221;-XX:PermSize=128m&#8221;/&gt;<br />
&lt;jvmarg value=&#8221;-XX:MaxPermSize=128m&#8221;/&gt;<br />
&lt;classpath refid=&#8221;execution.classpath&#8221;/&gt;<br />
&lt;/java&gt;</p>
<p><strong>Script</strong></p>
<p>Si el arranque de la máquina virtual se produce en un script, hay que editar el script y añadir estos parámetros en la sentencia de arranque. El siguiente ejemplo muestra cómo añadir estos parámetros en el <strong>script de arranque de un Tomcat</strong>.</p>
<ul>
<li>En <strong>Windows</strong>: set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=256m</li>
<li>En <strong>Linux</strong>: JAVA_OPTS=&#8221;$JAVA_OPTS -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=256m&#8221;</li>
</ul>
<p>Por último, recordamos que resolver el problema de una excepción de tipo java.lang.OutOfMemoryError simplemente aumentando el tamaño de la memoria virtual puede retrasar el problema pero no evitarlo si el problema es una fuga de memoria. Puedes encontrar más información <a href="http://www.programacionenjava.com/blog/2008/03/28/j2ee/causas-y-solucion-de-javalangoutofmemoryerror-permgen-space-failure/" target="_self">aquí</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programacionenjava.com/blog/2008/06/24/problemas-frecuentes/aumentar-el-tamano-de-memoria-de-la-maquina-virtual-en-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Causas y solución de java.lang.OutOfMemoryError: PermGen space failure</title>
		<link>http://www.programacionenjava.com/blog/2008/03/28/j2ee/causas-y-solucion-de-javalangoutofmemoryerror-permgen-space-failure/</link>
		<comments>http://www.programacionenjava.com/blog/2008/03/28/j2ee/causas-y-solucion-de-javalangoutofmemoryerror-permgen-space-failure/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 13:21:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Problemas Frecuentes]]></category>
		<category><![CDATA[Memoria]]></category>
		<category><![CDATA[OutOfMemory]]></category>
		<category><![CDATA[PermGen]]></category>

		<guid isPermaLink="false">http://www.programacionenjava.com/blog/2008/03/28/j2ee/causas-y-solucion-de-javalangoutofmemoryerror-permgen-space-failure/</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>La memoria de la Máquina Virtual se divide en varias regiones. Una de estas regiones es el <strong>PermGen</strong>, 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).</p>
<p>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.</p>
<p>El <strong>valor por defecto del espacio PermGen es de 64 Mb</strong> 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.</p>
<p>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.</p>
<p>En segundo lugar, la <strong>causa más probable</strong> de una excepción <strong>java.lang.OutOfMemoryError: PermGen space failure</strong> 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 <strong>fuga de memoria (memory leak)</strong> 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: <a href="http://opensource.atlassian.com/confluence/spring/pages/viewpage.action?pageId=2669" target="_blank">http://opensource.atlassian.com/confluence/spring/pages/viewpage.action?pageId=2669</a></p>
<p>Por último, a continuación incluimos el argumento que es necesario incluir al arrancar la máquina virtual para especificar el tamaño de esta región PermGen en Mb, <strong>XX:MaxPermSize=128m</strong> para el tamaño máximo y <strong>XX:PermSize=128m</strong> para que la máquina virtual ya arranque con este tamaño y no tenga que reservar más espacio en tiempo de ejecución.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programacionenjava.com/blog/2008/03/28/j2ee/causas-y-solucion-de-javalangoutofmemoryerror-permgen-space-failure/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
