{"id":2076,"date":"2009-10-31T07:06:00","date_gmt":"2009-10-31T14:06:00","guid":{"rendered":"http:\/\/kodegeek.com\/blog\/?p=2076"},"modified":"2009-10-31T07:07:50","modified_gmt":"2009-10-31T14:07:50","slug":"swing-string-intern-new-garbage-collection-settings","status":"publish","type":"post","link":"http:\/\/kodegeek.com\/blog\/2009\/10\/31\/swing-string-intern-new-garbage-collection-settings\/","title":{"rendered":"Swing + String.intern() = New Garbage collection settings"},"content":{"rendered":"<p>Y despu\u00e9s de todo este tiempo de andar jugando con Java uno descubre nuevas cosas; En estos d\u00edas una aplicaci\u00f3n que escrib\u00ed la cual muestra aproximadamente medio mill\u00f3n de filas (con por lo menos 70 columnas) se empez\u00f3 a quedar sin memoria con el siguiente error:<\/p>\n<p><code><br \/>\n<a href=\"http:\/\/www.jroller.com\/agileanswers\/entry\/preventing_java_s_java_lang\">java.lang.OutOfMemoryError: PermGen<\/a><br \/>\n<\/code><\/p>\n<p>Una de las cosas que yo hice en mi aplicaci\u00f3n para conservar memoria fu\u00e9 utilizar <a href=\"http:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/lang\/String.html#intern%28%29\">String.intern()<\/a> para tener un &#8220;cache&#8221; de las cadenas de caracteres que se repetian m\u00e1s en mi aplicaci\u00f3n (lo cual es seguro cuando se usa en m\u00faltiples hilos de ejecuci\u00f3n tambi\u00e9n ya que el objeto String no se puede modificar).<\/p>\n<p>\u00bfPero porqu\u00e9 esto? Bueno, resulta que yo le estaba dando bastante memoria al area de heap de la m\u00e1quina virtual, la cual esta destinada a objetos de corta duraci\u00f3n, pero la secci\u00f3n que contiene las clases y en este caso objetos que nunca son reciclados por la m\u00e1quina virtual segu\u00eda creciendo:<\/p>\n<p><code><br \/>\njava -Xms512m -Xmx1024m com.kodegeek.app.MyBigApp<br \/>\n<\/code><\/p>\n<p>La soluci\u00f3n: Permitirle a la m\u00e1quina virtual que descargue cosas que no utiliza y sobre todo darle m\u00e1s espaci\u00f3 para poner otras cosas, como objetos &#8216;String&#8217;. Despu\u00e9s de correr <a href=\"http:\/\/java.sun.com\/developer\/technicalArticles\/J2SE\/jconsole.html\">Jconsole<\/a> y darme cuenta la que secci\u00f3n de &#8216;PermGen&#8217; se estaba llenando entonces comenc\u00e9 a probar distintos par\u00e1metros, hasta que esta combinaci\u00f3n me dio los resultados deseados:<\/p>\n<p><code><br \/>\njava -Xms512m -Xmx1024m<br \/>\n<strong>-XX:MaxPermSize=256m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled<\/strong> com.kodegeek.app.MyBigApp<br \/>\n<\/code><\/p>\n<p>Hay muchos tutoriales interesantes en la red sobre como entonar la m\u00e1quina virtual, le recomiendo que los lea primero antes de optimizar o copiar lo que vean por all\u00ed.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Y despu\u00e9s de todo este tiempo de andar jugando con Java uno descubre nuevas cosas; En estos d\u00edas una aplicaci\u00f3n que escrib\u00ed la cual muestra aproximadamente medio mill\u00f3n de filas (con por lo menos 70 columnas) se empez\u00f3 a quedar sin memoria con el siguiente error: java.lang.OutOfMemoryError: PermGen Una de las cosas que yo hice <a class=\"read-more\" href=\"http:\/\/kodegeek.com\/blog\/2009\/10\/31\/swing-string-intern-new-garbage-collection-settings\/\">[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[9,438],"tags":[547],"_links":{"self":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/2076"}],"collection":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/comments?post=2076"}],"version-history":[{"count":3,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/2076\/revisions"}],"predecessor-version":[{"id":2079,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/2076\/revisions\/2079"}],"wp:attachment":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/media?parent=2076"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/categories?post=2076"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/tags?post=2076"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}