{"id":238,"date":"2004-11-24T16:10:00","date_gmt":"2004-11-24T23:10:00","guid":{"rendered":"http:\/\/kodegeek.com\/blog\/?p=238"},"modified":"2004-11-24T16:10:00","modified_gmt":"2004-11-24T23:10:00","slug":"echando-codigo-%c2%bfcomo-entonar-la-maquina-virtual-de-java-pasandole-parametros","status":"publish","type":"post","link":"http:\/\/kodegeek.com\/blog\/2004\/11\/24\/echando-codigo-%c2%bfcomo-entonar-la-maquina-virtual-de-java-pasandole-parametros\/","title":{"rendered":"Echando c\u00f3digo: \u00bfComo entonar la m\u00e1quina virtual de Java pasandole par\u00e1metros?"},"content":{"rendered":"<p><a href=\"http:\/\/java.sun.com\/\"><img decoding=\"async\" src=\"http:\/\/java.sun.com\/im\/logo_java.gif\" \/><\/a><\/p>\n<p>Normalmente la m\u00e1quina virtual de Java (<span style=\"font-style: italic;\">JVM o Java Virtual Machine<\/span>) hace un trabajo bastante razonable cuando corremos una aplicaci\u00f3n en terminos de velocidad y uso de recursos; Sin embargo la \u00fanica forma de saber eso por seguro es observando como se porta nuestro programa a trav\u00e9s del tiempo.<\/p>\n<p>la JVM cuenta con parametros que afectan su comportamiento, veamos que podemos hacer para mejorar la ejecuci\u00f3n de nuestro programa; Suponga por ejemplo que usted escribi\u00f3 un programa para hacer reportes desde la base de datos de &#8216;<a href=\"http:\/\/www.bugzilla.org\/\">Bugzilla<\/a>&#8216; en formato XML y que llama a su aplicaci\u00f3n en Java as\u00ed (s\u00f3lo le muestro el fragmento de c\u00f3digo que nos interesa). El programa es un simple programa que corre por la l\u00ednea de comandos:<br \/>\n<\/p>\n<blockquote><p>\n<br \/>SYSTEM_PROPERTIES=&#8221;-DBugzillaReport.startdate=${ARGUMENTS[0]} -DBugzillaReport.enddate=${ARGUMENTS[1]} -DBugzillaReport.outputFile=${ARGUMENTS[2]} -DBugzillaReport.configFile=${ARGUMENTS[3]}&#8221;<br \/>\n<br \/>COMMAND=&#8221;${JAVA_HOME}\/bin\/java ${SYSTEM_PROPERTIES} -classpath ${CLASSPATH} com.XXXX.bugzilla.report.CronReporter&#8221;<br \/>\n<br \/>exec $COMMAND<\/p><\/blockquote>\n<p><span style=\"font-family:courier new;\"><\/span><br \/>\n<br \/>OK, vamos a ver ahora como alterar la llamada del programa para obtener informaci\u00f3n. Primero veamos cuanto tarda el programa en correr usando la herramienta &#8216;time&#8217;.<\/p>\n<p><span style=\"font-family:courier new;\">COMMAND=&#8221;<span style=\"font-weight: bold;\">\/usr\/bin\/time -p<\/span> ${JAVA_HOME}\/bin\/java ${SYSTEM_PROPERTIES} -classpath ${CLASSPATH} com.XXXX.bugzilla.report.CronReporter&#8221;<\/span><\/p>\n<p>Corriendolo tenemos:<\/p>\n<p><span style=\"font-family:courier new;\"><\/span><\/p>\n<blockquote><p>[josevnz@god josevnz]$ .\/BugzillaReport.bsh -s 2004-08-01 -e 2004-11-24 -c \/home\/josevnz\/.BugzillaReport -f test.xml<br \/>\n<br \/><span style=\"font-weight: bold; font-style: italic;\">real 7.04<br \/>\n<br \/>user 2.80<br \/>\n<br \/>sys 2.42<\/span><span style=\"font-style: italic;\"><br \/>\n<br \/><\/span><\/p><\/blockquote>\n<p>\u00bfQue significa todo esto? &#8216;<span style=\"font-style: italic;\">real<\/span>&#8216; es cuanto se tard\u00f3 el programa en realidad (7.04 segundos), &#8216;<span style=\"font-style: italic;\">user<\/span>&#8216; es cuanto tiempo pas\u00f3 haciendo trabajo \u00fatil mientras que &#8216;<span style=\"font-style: italic;\">sys<\/span>&#8216; es cuanto pas\u00f3 utilizando recursos del sistema (todo esto es a MUY groso modo). La herramienta &#8216;time&#8217; nos d\u00e1 mucha informaci\u00f3n \u00fatil, y le hemos pedido que nos muestre esa informaci\u00f3n en el formato (p)ortable (POSIX).<\/p>\n<p>Vamos a jugar ahora con las est\u00e1disticas del recolector de basura (Garbage Collector). La salida es muy dependiente de la version del JDK que usted est\u00e9 utilizando:<br \/>\n<\/p>\n<blockquote><p>[josevnz@god josevnz]$<span style=\"font-weight: bold;\"> java -version<\/span><br \/>\n<br \/>java version &#8220;<span style=\"color: rgb(255, 102, 102);\">1.4.2_04<\/span>&#8221;<br \/>\n<br \/>Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_04-b05)<br \/>\n<br \/>Java HotSpot(TM) Client VM (build 1.4.2_04-b05, mixed mode)<br \/>\n<br \/>[josevnz@god josevnz]$<\/p><\/blockquote>\n<p>Modificando el script:<br \/>\n<\/p>\n<blockquote><p>SYSTEM_PROPERTIES=&#8221;-DBugzillaReport.startdate=${ARGUMENTS[0]} -DBugzillaReport.enddate=${ARGUMENTS[1]} -DBugzillaReport.outputFile=${ARGUMENTS[2]} -DBugzillaReport.configFile=${ARGUMENTS[3]} <span style=\"font-weight: bold;\">-verbosegc<\/span>&#8220;<\/p><\/blockquote>\n<p>Corriendo el programa tenemos:<\/p>\n<blockquote><p>[josevnz@god josevnz]$ .\/BugzillaReport.bsh -s 2004-08-01 -e 2004-11-24 -c \/home\/josevnz\/.BugzillaReport -f test.xml<br \/>\n<br \/>[GC 478K->128K(1984K), 0.0123790 secs]<br \/>\n<br \/>[GC 578K->198K(1984K), 0.0096410 secs]<br \/>\n<br \/>&#8230;.<br \/>\n<br \/>[Full GC <span style=\"color: rgb(255, 102, 102);\">2222K<\/span>-><span style=\"color: rgb(51, 255, 255);\">2162K<\/span>(<span style=\"color: rgb(102, 255, 153);\">2892K<\/span>), <span style=\"color: rgb(204, 51, 204);\">0.0603210<\/span> secs]<br \/>\n<br \/>[GC 2674K->2162K(4180K), 0.0070220 secs]<br \/>\n<br \/>[GC 2672K->2165K(4180K), 0.0068920 secs]<br \/>\n<br \/>[GC 2677K->2163K(4180K), 0.0063560 secs]<br \/>\n<br \/>[GC 2667K->2171K(4180K), 0.0072510 secs]<br \/>\n<br \/>[GC 2681K->2168K(4180K), 0.0008050 secs]<br \/>\n<br \/>real 9.61<br \/>\n<br \/>user 2.92<br \/>\n<br \/>sys 2.49<\/p>\n<\/blockquote>\n<p>El n\u00famero en <span style=\"color: rgb(255, 102, 102);\">rojo<\/span> es cuanto hab\u00eda antes de correr el GC (Garbage Collector), el n\u00famero<span style=\"color: rgb(51, 255, 255);\"> azul<\/span> es cuanto habia despu\u00e9s, el <span style=\"color: rgb(102, 255, 153);\">verde<\/span> es la diferencia entre esos dos valores y el <span style=\"color: rgb(255, 153, 255);\">purpura<\/span> es cuanto tiempo tard\u00f3 liberando la memoria.<\/p>\n<p>Idealmente deber\u00edamos usar un programita para parsear el archivo, algo como esto:<br \/>\n<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #666699; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\">!\/usr\/bin\/perl<\/span>\n<br \/><span class=\"gutter\">   2:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">This<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">program<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">parses<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">the<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">GC<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">log<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">file<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">of<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">a<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">JDK<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">1.4.2<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">and<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">generates<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">some<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">stats<\/span>\n<br \/><span class=\"gutter\">   3:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Author:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Jose<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">V<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Nunez<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Zuleta<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">(josevnz@yahoo.com)<\/span>\n<br \/><span class=\"gutter\">   4:<\/span><span class=\"syntax8\">my<\/span> <span class=\"syntax9\">%stats<\/span>;\n<br \/><span class=\"gutterH\">   5:<\/span><span class=\"syntax8\">my<\/span> <span class=\"syntax9\">$count<\/span><span class=\"syntax18\">=<\/span><span class=\"syntax5\">0<\/span>.<span class=\"syntax5\">0<\/span>;\n<br \/><span class=\"gutter\">   6:<\/span><span class=\"syntax10\">open<\/span>(LOG, <span class=\"syntax9\">$ARGV<\/span>[<span class=\"syntax5\">0<\/span>]) <span class=\"syntax18\">|<\/span><span class=\"syntax18\">|<\/span> <span class=\"syntax8\">die<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax9\">$<\/span><span class=\"syntax13\">!<\/span><span class=\"syntax13\">\"<\/span>;\n<br \/><span class=\"gutter\">   7:<\/span><span class=\"syntax8\">while<\/span>(<span class=\"syntax18\">&lt;<\/span>LOG<span class=\"syntax18\">&gt;<\/span>) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\">   8:<\/span>        <span class=\"syntax9\">$_<\/span> <span class=\"syntax18\">=<\/span><span class=\"syntax18\">~<\/span> <span class=\"syntax18\">\/<\/span>\\[GC (.<span class=\"syntax18\">*<\/span>)K<span class=\"syntax18\">-<\/span><span class=\"syntax18\">&gt;<\/span>(.<span class=\"syntax18\">*<\/span>)K\\((.<span class=\"syntax18\">*<\/span>)K\\), (.<span class=\"syntax18\">*<\/span>) secs\\]<span class=\"syntax18\">\/<\/span>;\n<br \/><span class=\"gutter\">   9:<\/span>        <span class=\"syntax9\">$stats<\/span><span class=\"syntax18\">{<\/span>bytes_freed<span class=\"syntax18\">}<\/span><span class=\"syntax18\">+<\/span><span class=\"syntax18\">=<\/span><span class=\"syntax9\">$3<\/span>;\n<br \/><span class=\"gutterH\">  10:<\/span>        <span class=\"syntax9\">$stats<\/span><span class=\"syntax18\">{<\/span>time_used<span class=\"syntax18\">}<\/span><span class=\"syntax18\">=<\/span><span class=\"syntax9\">$4<\/span>;\n<br \/><span class=\"gutter\">  11:<\/span>        <span class=\"syntax9\">$count<\/span><span class=\"syntax18\">+<\/span><span class=\"syntax18\">+<\/span>;\n<br \/><span class=\"gutter\">  12:<\/span><span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutter\">  13:<\/span><span class=\"syntax10\">close<\/span>(LOG);\n<br \/><span class=\"gutter\">  14:<\/span><span class=\"syntax8\">my<\/span> <span class=\"syntax9\">$average<\/span> <span class=\"syntax18\">=<\/span> <span class=\"syntax9\">$stats<\/span><span class=\"syntax18\">{<\/span>bytes_freed<span class=\"syntax18\">}<\/span> <span class=\"syntax18\">\/<\/span> <span class=\"syntax9\">$count<\/span>;\n<br \/><span class=\"gutterH\">  15:<\/span><span class=\"syntax10\">print<\/span> (<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Bytes<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">freed<\/span><span class=\"syntax13\">:<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax9\">$<\/span><span class=\"syntax9\">stats<\/span><span class=\"syntax13\">{<\/span><span class=\"syntax13\">bytes_freed<\/span><span class=\"syntax13\">}<\/span><span class=\"syntax13\">K<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">(<\/span><span class=\"syntax9\">$<\/span><span class=\"syntax9\">average<\/span><span class=\"syntax13\">)<\/span><span class=\"syntax13\">K<\/span><span class=\"syntax13\">,<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">Time<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">used<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">in<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">GC<\/span><span class=\"syntax13\">:<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax9\">$<\/span><span class=\"syntax9\">stats<\/span><span class=\"syntax13\">{<\/span><span class=\"syntax13\">time_used<\/span><span class=\"syntax13\">}<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">secs\\n<\/span><span class=\"syntax13\">\"<\/span>);\n<br \/><\/pre>\n<p>La salida ser\u00eda also asi:<\/p>\n<blockquote><p>[josevnz@god josevnz]$ tmp\/parse_gc_jdk142.pl gc.log<br \/>\n<br \/>Bytes freed: 65872K (2744.66666666667)K, Time used in GC: 0.0008050 secs<br \/>\n<br \/>[josevnz@god josevnz]$<br \/>\n<\/p><\/blockquote>\n<p>Idealmente la JVM deber\u00eda pasar menos de %5 haciendo GC, %15 y m\u00e1s alla ya es un problema. En nuestro ejemplo: <span style=\"font-family:courier new;\">(0.0008050 * %100.0) \/ 7.2 =~ %0.011181, estamos bien.<\/span><\/p>\n<p>Esta aplicaci\u00f3n en particular corre muy r\u00e1pido, adem\u00e1s de que no usa casi memoria en la pile (heap) asi que en teor\u00eda podr\u00edamos decirle a Java que reserve menos memoria al principio y que demore las operaciones del GC lo m\u00e1s posible:<\/p>\n<blockquote><p>SYSTEM_PROPERTIES=&#8221;-DBugzillaReport.startdate=${ARGUMENTS[0]} -DBugzillaReport.enddate=${ARGUMENTS[1]} -DBugzillaReport.outputFile=${ARGUMENTS[2]} -DBugzillaReport.configFile=${ARGUMENTS[3]}<span style=\"font-weight: bold; color: rgb(255, 102, 102);\"> -Xms10m -XX:NewSize=5m -Xincgc<\/span><br \/>\n<br \/>&#8220;<\/p><\/blockquote>\n<p>Ahora veamos el resultado final:<br \/>\n<\/p>\n<blockquote><p>[josevnz@god josevnz]$ .\/BugzillaReport.bsh -s 2004-08-01 -e 2004-11-24 -c \/home\/josevnz\/.BugzillaReport -f test.xml<br \/>\n<br \/><span style=\"font-weight: bold;\">real 3.73<\/span><br \/>\n<br \/>user 1.93<br \/>\n<br \/>sys 1.33<br \/>\n<br \/>[josevnz@god josevnz]$<\/p><\/blockquote>\n<p>Nada mal, \u00a1la mitad del tiempo, s\u00f3lo con cambiar unos par\u00e1metros!<\/p>\n<p>Tenga en cuenta que usted deber\u00e1 experimentar mucho con su aplicaci\u00f3n para obtener estad\u00edsticas valederas y que este peque\u00f1o articulo es muy informal como para ser tomado en serio (pero si espero haber despertado su curiosidad). Si quiere saber m\u00e1s acerca de este t\u00f3pico, entonces <a href=\"http:\/\/developers.sun.com\/techtopics\/mobility\/midp\/articles\/garbagecollection2\/\">lea este articulo<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Normalmente la m\u00e1quina virtual de Java (JVM o Java Virtual Machine) hace un trabajo bastante razonable cuando corremos una aplicaci\u00f3n en terminos de velocidad y uso de recursos; Sin embargo la \u00fanica forma de saber eso por seguro es observando como se porta nuestro programa a trav\u00e9s del tiempo. la JVM cuenta con parametros que <a class=\"read-more\" href=\"http:\/\/kodegeek.com\/blog\/2004\/11\/24\/echando-codigo-%c2%bfcomo-entonar-la-maquina-virtual-de-java-pasandole-parametros\/\">[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/238"}],"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=238"}],"version-history":[{"count":0,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/238\/revisions"}],"wp:attachment":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/media?parent=238"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/categories?post=238"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/tags?post=238"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}