Aquests últims dies he estat intentant informar-me de quines són les millor tècniques per optimitzar processos Java. Hi ha molta informació a la web, la majoria està a la pàgina oficial de Sun Oracle.
He intentat fer un petit resum per si a algú li interessa. Lògicament és una petita introducció amb molts de links a les pàgines amb la documentació oficial.
Primer, unes consideracions sobre optimitzacions i "benchmarks" que crec que són importants:
Java SE 6 no va introduïr moltes novetats pel que fa a la API. Bàsicament és una actualització que atacava la performance de Java. Podem veure algunes gràfiques comparant els diferents rendiments a [7]. Per tant, és important que ens assegurem que sempre tinguem la última versió de Java instal·lada al sistema. Un altre tema és que la informació que trobareu aquí parla exclusivament de la VM Hotspot (de Sun). Hi ha altres VM, amb altres rendiments, com podeu veure a [8].
En quant a les monitoritzacions, sempre que provem alguna cosa cal que les dades i l'estat de la màquina sigui el mateix. Tot i això en java cal tenir en compte:
- Warmup: La JVM funciona interpretant codi compil·lat. Segons la modalitat en que s'estigui executant (client o server) detectarà mètodes hot (que s'usen molt sovint) i els compilarà a codi natiu de la màquina per millorar-ne el temps d'execució. Això fa que el rendiment millori a mesura que s'executa el programa.
- Garbage collection (GC): He pogut comprovar que la majoria de tècniques d'optimització en Java tenen a veure amb la gestió del GC i de la memòria. Malauradament el tema és molt complexe i es mereix un post ( o un llibre ) per si sól.
- Mesurament de temps: En cas de que volguem pendre mesures de temps del programa i que no tinguem un profiler a mà Java ofereix dues crides que retornen temps. Es veu però que la System.currentTimeMillis() no és del tot fiable (sobretot en sistemes operatius Windows) i es recomana utilitzar la System.nanoTime().
Finalment tenim la interpretació de resultats. No hi ha prou en executar-lo una vegada. Si es pot s'hauria de fer un anàlisi estadístic (més sobre tot això en un pròxim post).
Un cop feta la introducció al tema, comentaré alguns dels links més interessants que he trobat:
Java Tuning Whitepaper [1], tot i que sigui del 2005, és un molt bon recurs introductori. Molt genèric i fàcil d'entendre. Com ja he dit abans, bàsicament es parla de memòria i de GC.
La màquina virtual de Java té les opcions que formen part dels Ergonomics, que són les opcions que permeten modificar el comportament a l'hora d'executar els divesos programes, les opcions més conegudes són:
- Xms: La quantitat de memòria inicial del programa. Si no donem una mida inicial aquesta serà de 2 Mb.
- Xmx: La quantitat màxima de memòria que la màquina virtual estarà permesa a utilitzar.
Lògicament, hem de vigilar a l'hora d'asignar aquests valors, ja que influiran molt en el rendiment del programa, com més memòria millor, ara bé, com més memòria més haurà de treballar el GC i menys quedarà pel sistema operatiu, cosa que pot ocasionar que el rendiment general del sistema es vegi perjudicat.
Algunes opcions relacionades amb el GC [2]:
- The -XX:+UseParallelGC parallel (throughput) garbage collector.
- The -XX:+UseConcMarkSweepGC concurrent (low pause time) garbage collector (also known as CMS)
- The -XX:+UseSerialGC serial garbage collector (for smaller applications and systems)
Una de les opcions que no coneixia d'abans és la de canviar la mida de les pàgines de memòria, bàsicament modificarem la mida de la TLB (Translation-Lookaside Buffer) que és la part de memòria que manté les traduccions de memòria virtual a memòria física. Ampliant la mida de les pàgines també ampliarem la mida de la TLB, i per tant seran menys fallades a l'hora de buscar adreces de memòria. Pot millorar l'eficiència d'aplicacions que utilitzin molta memòria. Cal tenir en compte que es pot afectar negativament l'eficiència del sistema, ja que l'aplicació pot fer un us execessiu de memòria fent que la resta del sistema es quedi curt, a més no és fàcil de configurar (s'ha de fer canvis a nivell del SO) podeu trobar instruccions aquí [3].
I més opcions llistades a [4], de les quals destacaria:
- XX:+UseFastAccessorMethods: Use optimized versions of Get
Field. XX:+StringCache: Enables caching of commonly allocated strings.
El document també té una secció molt interessant amb exemples explicats [5].
Finalment us deixo una llista de links bastant interessants sobre la JVM:
Referències.
No hay comentarios:
Publicar un comentario en la entrada
Comenta: