Y después de todo este tiempo de andar jugando con Java uno descubre nuevas cosas; En estos días una aplicación que escribí la cual muestra aproximadamente medio millón de filas (con por lo menos 70 columnas) se empezó a quedar sin memoria con el siguiente error:
java.lang.OutOfMemoryError: PermGen
Una de las cosas que yo hice en mi aplicación para conservar memoria fué utilizar String.intern() para tener un “cache” de las cadenas de caracteres que se repetian más en mi aplicación (lo cual es seguro cuando se usa en múltiples hilos de ejecución también ya que el objeto String no se puede modificar).
¿Pero porqué esto? Bueno, resulta que yo le estaba dando bastante memoria al area de heap de la máquina virtual, la cual esta destinada a objetos de corta duración, pero la sección que contiene las clases y en este caso objetos que nunca son reciclados por la máquina virtual seguía creciendo:
java -Xms512m -Xmx1024m com.kodegeek.app.MyBigApp
La solución: Permitirle a la máquina virtual que descargue cosas que no utiliza y sobre todo darle más espació para poner otras cosas, como objetos ‘String’. Después de correr Jconsole y darme cuenta la que sección de ‘PermGen’ se estaba llenando entonces comencé a probar distintos parámetros, hasta que esta combinación me dio los resultados deseados:
java -Xms512m -Xmx1024m
-XX:MaxPermSize=256m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled com.kodegeek.app.MyBigApp
Hay muchos tutoriales interesantes en la red sobre como entonar la máquina virtual, le recomiendo que los lea primero antes de optimizar o copiar lo que vean por allí.
One thought on “Swing + String.intern() = New Garbage collection settings”
Comments are closed.