domingo, 30 de octubre de 2011

Problema "Java heap space" en aplicación Netbeans Platform

Hola.

En estos días he estado desarrollando sobre Netbeans Platform porque hace magia  y el caso es que mientras ejecuto mi proyecto desde Netbeans IDE no existe problema alguno, entonces piensas: voy a generar mi instalador y a probar lo que llevo a ver si de verdad sirve esa opción que dice Package as -> Installers, así, ejecutas tu aplicación y se congela/traba/valequeso y no entiendes porque si todo iba tan bien. En este punto como buenos programadores que somos ¡ajá!, sícomo no recordamos las leyes de Murphy y mejor ejecutamos desde terminal para llevarnos la siguiente sorpresa:


java.lang.OutOfMemoryError: Java heap space

Googleando un poco nos enteramos que este error se produce cuando la JVM se queda sin memoria (de almacenamiento dinámico/ de intercambio) y además que por default el tamaño de la memoria es de 64MB (sobre Java 6). La forma de asignar tamaño a la memoria es con los siguientes parámetros de la JVM:
-Xms128m  // Como mínimo 128 MB
-Xmx512m  // Como máximo 512 MB
-Xmx1G    // Como máximo 1 GB

esto solo es parte de lo que necesitamos ya que el usuario no va a ejecutar la aplicación desde terminal pasándole algunos de los argumentos de arriba.
Buscando otro poco encontramos que la solución es modificar el script de creación Build Script que se encuentra en (Ctrl+1) Projects -> MiProyecto -> Important Files -> Build Script o en el directorio del proyecto MiProyecto -> build.xml, en este momento tenemos algo como esto:
<?xml version="1.0" encoding="UTF-8"?>
<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
<!-- for some information on what you could do (e.g. targets to override). -->
<!-- If you delete this file and reopen the project it will be recreated. -->
<project name="MiProyecto" basedir=".">
    <description>Builds the module suite MiProyecto.</description>
    <import file="nbproject/build-impl.xml"/>    
</project> 
y agregamos las siguientes líneas

<!-- Modifies the default settings for JVM (ANTES DEL CIERRE DE la etiqueta project)-->
<target name="build-launchers" depends="suite.build-launchers">
<replace file="build/launcher/etc/${app.name}.conf" token="--branding miproyecto -J-Xms24m -J-Xmx64m" value="--branding miproyecto -J-Xms128m -J-Xmx512m"/>
</target>
<!-- Modifies the default settings for JVM -->

obviamente deben cambiar miproyecto por el nombre de su proyecto (en minúculas), además pueden cambiar -J-Xms128m -J-Xmx512m según sus necesidades. Ahora sí, generamos instaladores, ejecutamos nuestra aplicación y problema resuelto.

También podría interesarnos asignar tamaño a la memoria cuando ejecutamos nuestra aplicación desde NetBeans IDE:

How to pass command line arguments to a NetBeans Platform application when run inside the IDE

 

0 comentarios:

Publicar un comentario