Forord. Produktrapport

Like dokumenter
Innhold Forord...3 Begreper og akronymer...4 Systembeskrivelse...5 Generelt...5 Funksjonelle krav...7 Ikke-Funksjonelle krav...9 Prioritering...

2 Om statiske variable/konstanter og statiske metoder.

Testrapport. periode noe som er et godt tegn i et operativsystem, gruppen har derfor ikke klart å konstruere en slik situasjon for testing.

Forord. Brukerveiledning

Forord. Javaprogrammering Database Overvåking / Statistikk JSP / Java web teknologi

Litt om Javas class-filer og byte-kode

2 Om statiske variable/konstanter og statiske metoder.

NOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse. INF 5110, 10/5-2011, Stein Krogdahl

NOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse

Operativsystemer og grensesnitt

OPPGAVESETT 7 OBJEKTER OG REFERANSER

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Javas klasse-filer, byte-kode og utførelse (og litt om C# sin CIL-kode)

Av Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Tildeling av minne til prosesser

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Minnehåndtering i operativsystemer

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Objekter og referanser

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Kodegenerering del 3: Tilleggsnotat fra AHU Samt litt om class-filer og byte-kode INF5110 V2007. Stein Krogdahl, Ifi UiO

Debugging. Tore Berg Hansen, TISIP

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Tildeling av minne til prosesser

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

Kapittel 1. Datamaskiner og programmeringsspråk. 1.1 Programmering

INF våren 2017

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Java PRP brukermanual

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

IN våren 2019 Onsdag 16. januar

IN våren 2018 Tirsdag 16. januar

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Dagens forelesning. Husk prøveeksamen Fredag 15/3-13 kl 12 i R1. Iterator-teknikken. Eksempel med bruk av Iterator og Iterable-grensesnittene

Minnehåndtering i operativsystemer

Argumenter fra kommandolinjen

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Programmeringsspråket C

Løsningsforslag for eksamensoppgave, våren 2004

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

Generiske mekanismer i statisk typede programmeringsspråk

Enkle generiske klasser i Java

Repitisjonskurs. Arv, Subklasser og Grensesnitt

Socket og ServerSocket

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

En prosess kan sees på som et stykke arbeid som skal utføres på datamaskinen. Ofte vil det være flere prosesser/tråder på datamaskinen samtidig.

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

UNIVERSITETET I OSLO

INF 1010, vår 2005 Løsningsforslag uke 11

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

Algoritmer og datastrukturer E Løkker i Java

Løsningsforslag Test 2

Sortering med Comparable og Comparator

Generelt om operativsystemer

Gjennomgang prøveeksamen oppgave 1, 2, 4, 5, 7

INF Innleveringsoppgave 6

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Håndtering av minne i et OS

INF 1000 høsten 2011 Uke september

Liste som abstrakt konsept/datatype

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet (kalt kildekoden): Hva er kompilering?

INF1000 undervisningen INF 1000 høsten 2011 Uke september

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

TDT4100 Objektorientert programmering

EKSAMENSFORSIDE Skriftlig eksamen med tilsyn

Informasjon Eksamen i IN1000 høsten 2017

Hva er kompilering? Dagens tema. En kompilator En kompilator leser Minila koden og lager Flok koden.

Obligatorisk oppgave 1 INF1020 h2005

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

GUI («Graphical User Interface») del 2

UNIVERSITETET I OSLO

Generelt om operativsystemer

Faglærerne prøver å besøker eksamenslokalet mellom klokka 15 og 16 for å oppklare eventuelle uklarheter og feil i oppgaveteksten.

Løsnings forslag i java In115, Våren 1998

INF Obligatorisk innlevering 6

INF1000 Prøveeksamen Oppgave 7 og 9

INF1020 Algoritmer og datastrukturer. Dagens plan

Hvordan en prosessor arbeider, del 1

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

I et Java-program må programmøren lage og starte hver tråd som programmet bruker. Er dette korrekt? Velg ett alternativ

Stein Gjessing. Institutt for informatikk. Universitetet i Oslo. Institutt for informatikk

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Introduksjon til objektorientert programmering

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

Definisjon av prosess

UNIVERSITETET I OSLO

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

"Nelsons kaffebutikk"

Tildeling av minne til prosesser

Leksjon 7. Filer og unntak

Stack. En enkel, lineær datastruktur

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

Transkript:

Forord Produktdokumentasjonen omhandler sluttproduktet gruppen har utviklet som er en samling av 32 Munin plugin som henter ut ressursbruken til en JVM instans. Prosjektarbeidet har blitt utført av Mo Amini, Diyar Amin og Younes Hajji ved Høgskolen i Oslo, avdeling for ingeniørutdanning våren 2009. Produktdokumentasjonen er ment for de som skal benytte seg av produktet eller vil vite hva som skjer under panseret. Her vil gruppen forklare med tekst, diagrammer og grafer hvordan produktet fungerer og hvordan dataene blir overført mellom de forskjellige delene av systemet. Ved å lese dette dokumentet skal leseren også bli kjent med hva som skal til for å implementere systemet i et Unix miljø. Derfor er det også forutsatt at lesere av dokumentet har sin bakgrunn innenfor IT generelt og særlig innenfor Unix installasjon og administrasjon, samt programmering generelt og særlig Java. Kommentarer og informasjon om grafer i den aktuelle pluginen vil være skrevet på engelsk da dette er synlig for administratorer fra alle land på internett. Dette er Munin standard og et praktisk valg. Leseren må derfor også forvente engelsk tekst i dokumentet. 2

Innhold Forord...2 Beskrivelse av produktet...4 1. OperatingSystemMXBean...4 1.1 Available processors...6 2. ThreadMXBean...7 2.1 DeadlockedThreads...7 2.2 CurrentThreadCpuTime...8 2.3 CurrentThreadUserTime...9 2.4 DaemonThreadCount... 10 2.5 PeakThreadCount... 11 2.6 ThreadCount... 12 2.7 TotalStartedThreadCount... 13 3. RuntimeMXBean... 14 3.1 Uptime... 14 4. ClassLoadingMXBean... 16 4.1 LoadedClassCount... 17 4.2 TotalLoadedClassCount... 18 4.3 UnloadedClassCount... 19 5. MemoryMXBean... 19 5.1 HeapMemoryUsage... 22 5.2 NonHeapMemoryUsage... 23 5.3 ObjectPendingFinalizationCount... 24 6. GarbageCollectorMXBean... 26 6.1 CollectionCount... 28 6.2 CollectionTime... 31 7. CompilationMXBean... 33 7.1 TotalCompilationTime... 34 8. MemoryPoolMXBean... 35 8.1 Collection Usage... 39 8.2 Peak Usage... 41 8.3 Usage... 43 Kilder:... 45 Ordliste... 46 3

Beskrivelse av produktet Produktet er en samling av 32 Munin plugin. Disse pluginene benytter seg av JMX rammeverket for å hente ut ressursbruken og annen informasjon om ønsket JVM instans. Med instans menes en Java prosess, da hver prosess har hver sin virtuelle maskin i Java og har hvert sitt sett med ressursbruk som er uavhengig av en annen Java prosess. Disse 32 pluginene kan kopieres og bli konfigurert til å hente ut ressursbruken til så mange JVM instanser som ønskelig. Det er viktig å merke seg at pluginene ikke henter ut den akkumulerte ressursbruken til Java i sin helhet på en plattform. 1. OperatingSystemMXBean Dette MXBean interfacet inneholder metoder for å hente ut informasjon fra JVM om operativsystemet den kjører på. Den inneholder også metoder for å hente ut konstanter eller andre variable som ikke lar seg plotte på grafer slik som operativsystemversjon. Disse metodene har blitt ignorert. 4

5

1.1 Available processors Denne pluginen viser antall prosessorer som er tilgjengelig for den aktuelle JVM. Dette kan være interessant å overvåke på fysiske maskiner som inneholder flere CPU. Det finnes tilfeller hvor ikke alle prosessorer blir benyttet til enhver tid. Årsaken til at denne variabelen er interessant å overvåke er at oppdragsgiveren har erfart applikasjoner som ikke utnytter alle prosessorer som er tilgjengelig for JVM til enhver tid, noe som har ført til ytelsesproblemer. OperatingSystemMXBean mxbean = ManagementFactory.newPlatformMXBeanProxy(connection, ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class); System.out.println("AvailableProcessors.value " + mxbean. getavailableprocessors()); 6

2.ThreadMXBean Dette MXBean interfacet inneholder metoder for JVM tråder. Det finnes en instans av dette interfacet for hver JVM. 2.1 DeadlockedThreads Denne pluginen viser antall tråder som er deadlocked. Dette kan være en nyttig graf for å overvåke tråder som har stoppet opp. Dersom en eller flere tråder er deadlocked og forblir deadlocked vil jobber i Java applikasjonen stoppe opp. Dersom denne har en verdi over 0 vil det være lurt å sjekke loggfiler for applikasjonen for hva som har stoppet og eventuelt restarte applikasjonen. ThreadMXBean mxbean=managementfactory.newplatformmxbeanproxy(connection, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class); System.out.print("DeadlockedThreads.value "); if(mxbean.findmonitordeadlockedthreads() == null) else System.out.println("0"); + ""); System.out.println(mxbean.findMonitorDeadlockedThreads().length 7

2.2CurrentThreadCpuTime Denne pluginen viser den totale CPU tiden tråden i nanosekunder (men er ikke i nanosekund nøyaktighet).dersom Java distribusjonen som er installert på systemet skiller mellom usertime og systemtime blir summen av disse returnert. ThreadMXBean threadmxbean = ManagementFactory.newPlatformMXBeanProxy(connection, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class); System.out.println("CurrentThreadCpuTime.value " + mxbean.getcurrentthreadcputime()); 8

2.3 CurrentThreadUserTime Denne pluginen viser CPU tiden som tråden har brukt i usermodus. Tiden er ikke nødvendigvis ikke i nanosekund nøyaktighet. ThreadMXBean mxbean = ManagementFactory.newPlatformMXBeanProxy(connection, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class); System.out.println("CurrentThreadUserTime.value " + mxbean.getcurrentthreadusertime()); Dette er tilsvarende metode som å kalle: getthreadusertime(thread.currentthread().getid()); Som ville vært ad-hoc metoden dersom man hadde kjørt koden i inneværende JVM. 9

2.4 DaemonThreadCount Denne pluginen viser antall kjørende tråder som er daemon tråder. Daemon tråder er tråder som er hjelpetråder for runtime miljøet. Eksempler på daemon tråder er garbage collector tråden og time handler tråden m.m. ThreadMXBean mxbean=managementfactory.newplatformmxbeanproxy(connection, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class); System.out.println("DaemonThreadCount.value "+mxbean.getdaemonthreadcount()); 10

2.5 PeakThreadCount Denne pluginen viser det høyeste antall tråder som har kjørt i løpet av JVM sin oppetid. Denne vil derfor øke dersom antallet øker til høyere verdi enn tidligere og vil ikke gå ned. Denne verdien kan resettes manuelt og er en alternativ måten å endre verdien til 0 uten å restarte JVM. ThreadMXBean mxbean=managementfactory.newplatformmxbeanproxy(connection, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class); System.out.println("PeakThreadCount.value "+mxbean.getpeakthreadcount()); 11

2.6 ThreadCount Denne pluginen vil vise antall nåværende kjørende tråder. Dette vil gjelde både daemon tråder og ikke-daemon tråder. ThreadMXBean mxbean=managementfactory.newplatformmxbeanproxy(connection, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class); System.out.println("ThreadCount.value "+mxbean.getthreadcount()); 12

2.7 TotalStartedThreadCount Denne pluginen vil vise antall tråder som har blitt startet siden JVM startet. Denne grafen vil i normale tilfeller vokse som en tilnærmet lineær linje med små avvik. Dersom applikasjonen blir benyttet med varierende last slik det vanligvis vil være for en applikasjon vil denne grafen øke med ulik stigningstall. For eksempel vil mange applikasjoner toppe belastning klokken 18:00 dersom det er en webapplikasjon. Årsaken kan være at personer kommer hjem fra jobb og skole og benytter seg mer av applikasjonen. Overvåking av denne grafen vil ettersom tiden går bli mindre nyttig da endringer blir mindre prosentvis og små endringer vil ikke komme frem i grafen. ThreadMXBean mxbean=managementfactory.newplatformmxbeanproxy(connection, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class); 13

System.out.println("TotalStartedThreadCount.value "+mxbean.gettotalstartedthreadcount()); 3. RuntimeMXBean Dette MXBean interfacet inneholder metoder for runtime for JVM. Det finnes èn instans av dette interfacet for hver JVM. 3.1 Uptime Denne pluginen viser oppetiden til JVM. Verdien som blir hentet ut er i millisekunder som senere blir gjort om til dager. 14

RuntimeMXBean mxbean = ManagementFactory.newPlatformMXBeanProxy(connection, ManagementFactory.RUNTIME_MXBEAN_NAME, RuntimeMXBean.class); System.out.println("Uptime.value " + mxbean.getuptime()/(1000*60*60*24)); 15

4. ClassLoadingMXBean Dette MXBean interfacet inneholder metoder for klassesystemet til en JVM. Det finnes en instans av dette interfacet for hver JVM. 16

4.1 LoadedClassCount Denne pluginen viser antall klasser som er lastet inn i JVM. ClassLoadingMXBean mxbean=managementfactory.newplatformmxbeanproxy(connection, ManagementFactory.CLASS_LOADING_MXBEAN_NAME, ClassLoadingMXBean.class); System.out.println("LoadedClassCount.value "+mxbean.getloadedclasscount()); 17

4.2 TotalLoadedClassCount Denne pluginen viser antall klasser som har blitt lastet inn siden JVM startet. Denne grafen vil naturligvis bare øke og resettes dersom JVM restartes. ClassLoadingMXBean mxbean=managementfactory.newplatformmxbeanproxy(connection, ManagementFactory.CLASS_LOADING_MXBEAN_NAME, ClassLoadingMXBean.class); System.out.println("TotalLoadedClassCount.value "+mxbean.gettotalloadedclasscount()); 18

4.3 UnloadedClassCount Denne pluginen viser antall klasser som har blitt lastet ut av JVM. ClassLoadingMXBean mxbean=managementfactory.newplatformmxbeanproxy(connection, ManagementFactory.CLASS_LOADING_MXBEAN_NAME, ClassLoadingMXBean.class); System.out.println("UnloadedClass.value "+mxbean.getunloadedclasscount()); 5. MemoryMXBean Dette MXBean interfacet inneholder metoder for å hente ut ressursbruk for minne og er et av de viktigste interfacene hva angår overvåking av JVM ressurser. Dette interfacet har metoder for å returnere MemoryUsage objekter som i sin tur kan være Heap og Non-Heap. Det finnes èn instans av dette interfacet for hver JVM. Heap minne er meget interessant å overvåke da det representerer minne for runtime data. Dette inneholder minne for klasser og array. Heap minnet kan i tillegg også økes eller 19

minskes etter behov. Derfor er dette meget variable data som burde overvåkes. Dette minnet blir behandlet av garbage collectoren når objektet ikke lenger blir referert til. Non-Heap minnet er den delen av minnet som ikke inngår i heap. Dette blir også kalt for metode-området da det i stor grad lagrer metoder, konstruktører og konstanter. I likhet med heap minnet kan størrelsen av dette minnet endres. Dette minnet blir derimot ikke nødvendigvis behandlet av garbage collectoren. Dette er naturlig da denne type data ofte må ligge i minnet over lengre tid på grunn av sin konstante natur. Ved å overvåke variable som kan returneres via MemoryMXBean interfacet kan man oppdage og tolke: Minneforbruket og forløpet til en applikasjon (JVM). Arbeidsmengden til JVM minnehåndteringssytemet. Minnelekkasje. Pluginene som er generert fra MemoryMXBean interfacet kan og er anbefalt til å bli benyttet når en applikasjon skal lastebalanseres mellom flere JVM. Her kan man enkelt finne utnyttelsesgrenser og fordele arbeidet mellom prosessene ved riktige grenser. På denne måten kan man utnytte JVM instansen til det ytterste uten å påvirke ytelsen. 20

21

5.1 HeapMemoryUsage Denne pluginen viser variablene comitted, max, init og used for heap minnet. MemoryMXBean mxbean = ManagementFactory.newPlatformMXBeanProxy(connection,ManagementFactory. MEMORY_MXBEAN_NAME, MemoryMXBean.class); System.out.println("Committed.value " + mxbean.getheapmemoryusage().getcommitted()); System.out.println("Max.value " + mxbean.getheapmemoryusage().getmax()); System.out.println("Init.value " + mxbean.getheapmemoryusage().getinit()); System.out.println("Used.value " + mxbean.getheapmemoryusage().getused()); 22

5.2 NonHeapMemoryUsage Denne pluginen viser variablene comitted, max, init og used for non-heap minnet. MemoryMXBean mxbean = ManagementFactory.newPlatformMXBeanProxy(connection,ManagementFactory. MEMORY_MXBEAN_NAME, MemoryMXBean.class); System.out.println("Committed.value " + mxbean.getnonheapmemoryusage().getcommitted()); System.out.println("Max.value " + mxbean.getnonheapmemoryusage().getmax()); System.out.println("Init.value " + mxbean.getnonheapmemoryusage().getinit()); System.out.println("Used.value " + mxbean.getnonheapmemoryusage().getused()); 23

Forklaringer for heap og non-heap minnet: Comitted minnet viser mengden minne (i byte) som er garantert å være tilgjengelig for JVM. Max er forkortelse for maksimum minne som kan bli brukt for minnehåndtering. Init er forkortelse for initial som er mengden av det initielle minnet som JVM forespør fra operativsystemet for minnehåndtering under oppstart. Used viser mengden minne som er opptatt. 5.3 ObjectPendingFinalizationCount Denne pluginen viser antall objekter som venter på avslutning fra JVM. Denne grafen vil være meget interessant å overvåke i tilfeller hvor minnelekkasjer skjer ofte. En årsak til minnelekkasje er når en klasse inneholder en finalize metode og denne blir misbrukt eller benyttet ofte. Objekter av denne typen vil ikke bli frigitt av garbage collectoren men derimot puttet inn i en kø for finalization som vil bli behandlet ved et senere tidspunkt. Dersom finalizer tråden ikke kan behandle finalization køen raskere enn den blir fylt opp kan heap minneområdet bli overfylt og skape en OutOfMemoryError exception. Dette kan skje i 24

tilfeller hvor det blir opprettet tråder med høy prioritet. Verdien i denne grafen er kun en tilnærming av antall objekter som venter på finalization men er allikevel nyttig for å oppdage om en applikasjon er veldig avhengig av finalization. MemoryMXBean mxbean = ManagementFactory.newPlatformMXBeanProxy(connection,ManagementFactory. MEMORY_MXBEAN_NAME, MemoryMXBean.class); System.out.println("Objects.value " + mxbean.getobjectpendingfinalizationcount()); 25

6. GarbageCollectorMXBean Dette MXBean interfacet inneholder metoder for å overvåke garbage collectoren. Da garbagecollectoren har en sentral del for JVM, nemlig det å frigjøre objekter som ikke kan nås vil det være naturlig å overvåke hvor mange objekter som har blitt samlet og hvor lang tid det har blitt benyttet for oppgaven. Det finnes et eller flere instanser av dette interfacet for hver JVM. 26

27

6.1 CollectionCount Denne pluginen viser antall samlinger som har skjedd i tidspunktet. // Denne koden er hentet ut fra GCCount.java men er kun et lite utsnitt av klassen GCCountGet collector = new GCCountGet(connection); String[] temp = collector.gc(); System.out.println("CopyCount.value " + temp[0]); System.out.println("MarkSweepCompactCount.value " + temp[1]); // Denne koden er hentet ut fra GCCountGet.java public String[] GC() throws IOException, MalformedObjectNameException { ObjectName gcname = null; gcname = new ObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAI N_TYPE + ",*"); 28

Set mbeans = connection.querynames(gcname, null); if (mbeans!= null) { gcmbeans = new ArrayList<GarbageCollectorMXBean>(); Iterator iterator = mbeans.iterator(); while (iterator.hasnext()) { ObjectName objname = (ObjectName) iterator.next(); GarbageCollectorMXBean gc = ManagementFactory.newPlatformMXBeanProxy(connection, objname.getcanonicalname(), GarbageCollectorMXBean.class); gcmbeans.add(gc); } } int i = 0; for (GarbageCollectorMXBean gc : gcmbeans) { GCresult[i++] = gc.getcollectioncount() + ""; } return GCresult; } 29

Forklaring til Minor og MajorCount: Garbagecollectoren utfører hovedsakelig to typer collection. En Minor count som vi har navngitt det i grafen er en enkel innhenting av objekter. Denne heter i Sun sin dokumentasjon Minor Copy collection. En minor collection vil kjøre relativt fort da den vil flytte rundt på objekter i heap minnet mens tråden kjører. En Major count som gruppen har navngitt det i deres graf er en mye mer komplisert algoritme. Denne heter i Sun sin dokumentasjon Major Mark-Sweep-Compact collection. En major sweep garbage collection vil stoppe alle kjørende tråder i JVM mens den utfører sin oppgave. Dette vil derfor påvirke ytelsen til JVM dersom det er mange innhentinger av denne typen. I forhold til ytelse vil det være interessant å overvåke denne variabelen og dersom mulig programmere applikasjonen slik at denne typen innhentinger av garbage collectoren er få, og utføres raskt. 30

6.2 CollectionTime Denne pluginen vil vise tiden garbage collectoren har brukt i millisekunder public String[] GC() throws IOException, MalformedObjectNameException { ObjectName gcname = null; gcname = new ObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAI N_TYPE + ",*"); Set mbeans = connection.querynames(gcname, null); if (mbeans!= null) { gcmbeans = new ArrayList<GarbageCollectorMXBean>(); Iterator iterator = mbeans.iterator(); while (iterator.hasnext()) { ObjectName objname = (ObjectName) iterator.next(); GarbageCollectorMXBean gc = ManagementFactory.newPlatformMXBeanProxy(connection, objname.getcanonicalname(), GarbageCollectorMXBean.class); gcmbeans.add(gc); } } 31

int i = 0; for (GarbageCollectorMXBean gc : gcmbeans) { GCresult[i++] = formatmillis(gc.getcollectiontime()); } return GCresult; } 32

7. CompilationMXBean Dette MXBean interfacet inneholder metoder for kompilering i JVM. Her omtales det just in time(jit) kompilatoren. Det finnes en instans av dette interfacet for hver JVM. 33

7.1 TotalCompilationTime Denne pluginen viser tiden som har blitt benyttet for JIT kompilatoren. Denne verdien er ikke en indikasjon på ytelse av JVM og er ikke ment for ytelse sammenligning mellom andre JVMda implementasjoner kan ha ulik definisjon og ulik algoritme for å måle kompilasjonstiden. Verdien blir angitt i millisekunder. CompilationMXBean mxbean = ManagementFactory.newPlatformMXBeanProxy(connection, ManagementFactory.COMPILATION_MXBEAN_NAME, CompilationMXBean.class); System.out.println("TotalCompilationTime.value " + mxbean.gettotalcompilationtime() ); 34

8. MemoryPoolMXBean Dette MXBean interfacet inneholder metoder for de forskjellige minnebassengene i JVM. Det finnes èn instans av dette interfacet for hver JVM. Minnebassengene representerer heap og non-heap minnet. Disse går i detaljer og er i stor grad inndelt i tiden objekter har eksistert. Eden Space bassenget inneholder minnet som har blitt opptatt av tidlige objekter. Survivor Space bassenget inneholder minne hvor objekter har overlevd minne fra Eden Space selv etter en garbage collection. Tenured Gen bassenget inneholder objekter som har overlevd mange garbage collections. Perm Gen bassenget inneholder minne for JVM herunder klasser og minneobjekter. Dette vil i stor grad være heap minne, og ikke bli berørt av garbage collector. Herav Perm (Permanent). Disse minnebassengene har i sin tur spesifisert minnebruken slik: Usage Minnebruk Collection Usage Garbage collection minnebruk. Peak usage Topper For hver bassengundergruppe (Usage, Collection Usage og Peak) finnes disse variable: Comitted minnet viser mengden minne (i byte) som er garantert til å være tilgjengelig for JVM. Max er forkortelse for maksimum minne som kan bli brukt for minnehåndtering. Init er forkortelse for initial som er mengden av det initielle minnet som JVM forespør fra operativsystemet for minnehåndtering under oppstart. Used viser mengden minne (i byte) som er opptatt. 35

I tillegg finnes variabelen Treshold som kan bli satt manuelt. Dersom denne verdien er satt til et positivt tall vil Treshold sjekk bli automatisk startet for minnebassenget. Den vanlige verdien for denne atributten er 0. class GetCollectionUsage { private ArrayList<MemoryPoolMXBean> mxbean; private String[] GCresult = new String[5]; private MBeanServerConnection connection; private int memtype; public GetCollectionUsage(MBeanServerConnection connection, int memtype) { this.memtype = memtype; this.connection = connection; } public String[] GC() throws IOException, MalformedObjectNameException { ObjectName gcname = null; gcname = new ObjectName(ManagementFactory.MEMORY_POOL_MXBEAN_DOMAIN_TYPE +",*");//GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",*"); 36

Set mbeans = connection.querynames(gcname, null); if (mbeans!= null) { mxbean = new ArrayList<MemoryPoolMXBean>(); Iterator iterator = mbeans.iterator(); while (iterator.hasnext()) { ObjectName objname = (ObjectName) iterator.next(); MemoryPoolMXBean gc = ManagementFactory.newPlatformMXBeanProxy(connection, objname.getcanonicalname(), MemoryPoolMXBean.class); mxbean.add(gc); } } int i = 0; GCresult[i++] = mxbean.get(memtype).getcollectionusage().getcommitted()+ ""; GCresult[i++] = mxbean.get(memtype).getcollectionusage().getinit()+""; GCresult[i++] = mxbean.get(memtype).getcollectionusage().getmax()+""; GCresult[i++] = mxbean.get(memtype).getcollectionusage().getused()+""; 37

GCresult[i++]= mxbean.get(memtype).getcollectionusagethreshold()+""; return GCresult; } GetCollectionUsage collector = new GetCollectionUsage(connection, 3); String[] temp = collector.gc(); System.out.println("Comitted.value " + temp[0]); System.out.println("Init.value " + temp[1]); System.out.println("Max.value "+temp[2]); System.out.println("Used.value "+temp[3]); System.out.println("Threshold.value "+temp[4]); Gruppen har valgt å fordele variable i flere grafer for hvert basseng. Det ville gjort grafen uoversiktlig dersom alle 12 variable for hvert basseng hadde vært presentert i en graf. 38

8.1 Collection Usage 39

40

8.2 Peak Usage 41

42

8.3 Usage 43

44

Kilder: http://java.sun.com/javase/6/webnotes/trouble/tsg-vm/html/memleaks.html Minnelekkasje forklart. http://munin.projects.linpro.no/wiki/fieldname.type Munin standarder http://www.javadocexamples.com/java_source/com/sun/enterprise/admin/mbeans/jvm/memor yreporter.java.html Eksempler for polling av data for MemoryPoolMXBean http://en.wikipedia.org/wiki/extreme_programming XP programmering http://www.anyang-window.com.cn/tag/cross-platform/page/11/ Overvåking av JVM http://www.java2s.com/code/java/development- Class/ThisVerboseGCclassdemonstratesthecapabilitytogetthegarbagecollectionstatisticsandme moryusageremotely.htm Garbage Collection eksempler http://www.informit.com/guides/content.aspx?g=java&seqnum=249 Minneovervåking JMX http://munin.projects.linpro.no/browser/trunk/makefile Munin Trunk makefil http://www.jotschi.de/?p=251 newplatformmxbeanproxy metoden http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#remote Mbean server konfigurasjon med eller uten sikkerhet http://tomcat.apache.org/tomcat-5.5-doc/monitoring.html Tomcat JMX konfigurasjon med eller uten sikkerhet http://java.sun.com/developer/technicalarticles/j2se/jconsole.html Jconsole applikasjonen som benytter samme MXBeans som dette prosjektet http://forums.sun.com/thread.jspa?threadid=5260769 forum hvor vi stilte spørsmål 45

Ordliste Deamon: Daemon tråder er tråder som er hjelpetråder for runtime miljøet. Garbage collector: GC er en form av automatisk minne behandling. Heap memory: Er minnet som er reservert for et programm under kjøring av programmet. Interface: Refererer til en abstraksjon som en entitet gir av seg til det ytre. Java application: Et java program. JMX: En java teknologi som formidler verktøy for behandling og overvåking av programmer, objekter... JVM: En virtuel maskin som kjøre java byte-code programmer. Memory pool: Minne blokker med samme størrelse. Munin: Et system som overvåker applikasjoner og fremviser info på graffer. Mbean: Presenterer en kilde som kjører i JVM, som en applikasjon eller en Java EE. Kan bli brukt for å hente og sette applikasjoners konfigurasjon for å hente statistikk og feilmeldinger. Non-Heap memory: All minnet som ikke er heap. Plugin: Er et program som kobles til en applikasjon for en viss bruk. Runtime: Tiden et program bruker fra start av kjøring til slutt, kompilasjons tiden. Thread: En sekvens av instruksjoner som kan kjøres parallelt med andre tråder. Threshold: grense 46