JVM overzicht
• Java is een 'Write Once Run Anywhere' OO taal die uitgevoerd wordt op een virtuele machine.
• De Java Virtual Machine (JVM) voert applicaties, die geschreven zijn in Java, uit nadat deze Java code gecompileerd werd naar bytecode door het 'javac' proces.
• De JVM voert, samen met een aantal andere componenten, optimalisaties uit op de gecompileerde Java code om deze nog sneller te kunnen uitvoeren.
• De JVM zorgt automatisch voor het geheugen (Garbage Collection) zodat het voor de developers makkelijker wordt om ervoor te ontwikkelen en dat het risico om memory leaks beperkt blijft.
• Er zijn meerdere implementaties van de JVM, met een eigen set aan instellingen.
De JVM's core runtimes zijn ontwikkeld in C/C++ en voeren dan ook een groot deel van de functies uit in native code, zoals GC, MMU, JIT, OS calls, IO subroutines, ... De J2SE/J2EE API bestaat op Java code niveau.
Classloader overzicht
• Laden - De bytecode bekomen van een Java class bestand
• Verificatie - Valideert de code binnen de class (geen illegale operaties in de JVM, corrupt, ...)
• Voorbereiding - Allocatie en initializatie van ruimte voor de static members
• Initializatie - Voert de initializatie code van een class uit en initialiseert static fields
JIT overzicht
De just-in-time compiler (JIT) is niet echt een onderdeel van de JVM, maar is wel essentieel voor een snel werkende Java applicatie. De JIT werkt door het compileren van bytecode, geladen door de classloader, wanneer deze aanroepen wordt.
Memory Management
Garbage Collection is een van de hoofdoorzaken van geheugen gerelateerde performance problemen in Java. 2 zaken moeten altijd in het achterhoofd gehouden worden bij GC:
- Frequentie: hangt af van de heap size en allocatie ratio
- Duur: hangt af van de heap size en de Java heap footprint
Na deze korte intro, vraag ik me af hoe de meerderheid hier te werk gaat om zijn JVM af te stellen op zijn applicatie.
• Welke methodes pas jij toe? (stap-voor-stap)
• Waar haal jij de meeste performance winsten uit?
• Wat zijn de richtlijnen waarmee jij rekening probeert te houden?
De eerste techniek die ik meestal probeer toe te passen in
1. Heap size tuning (-Xms -Xmx)
- Frequentie: max. om de 10s
- Duratie: max. 2s
tip: Voor het bepalen van een goede heap size; kan je het gemiddelde van de applicatie + 30% nemen.
-XX:+AggresiveHeap: nieuwe setting (JDK1.4.1+), en voorziet in het automatisch tunen van de heap settings (GC algorithm, Young/Old generation spaces, etc...)
2. Runtime optimalisaties
-server: efficiënter voor applicaties met CPU intensieve taken
-XX:+UseParallelGC: Betere performance op machines met veel CPUs (4+)
-XX:+UseConcMarkSweepGC: Constantere response tijden op machines met veel CPUs (4+)
-XX:+UseTrainGC: Constantere response tijden op machines met weinig CPUs
3. Repeat 1.
"Meten is weten"
Alles is gebaseerd op goede applicatiestatistieken. Als je bijvoorbeeld meer wil teweten komen over de GC van je applicatie; is het voldoende om volgende optie aan je JVM mee te geven:
-verbose:gc of -Xloggc:<file> -XX:+PrintGCDetails
Verder zijn er nog een aantal commerciële tools zoals JProfiler, JMeter, ...
Meer info kan je ook terugvinden op javaperformancetuning.com
• Java is een 'Write Once Run Anywhere' OO taal die uitgevoerd wordt op een virtuele machine.
• De Java Virtual Machine (JVM) voert applicaties, die geschreven zijn in Java, uit nadat deze Java code gecompileerd werd naar bytecode door het 'javac' proces.
• De JVM voert, samen met een aantal andere componenten, optimalisaties uit op de gecompileerde Java code om deze nog sneller te kunnen uitvoeren.
• De JVM zorgt automatisch voor het geheugen (Garbage Collection) zodat het voor de developers makkelijker wordt om ervoor te ontwikkelen en dat het risico om memory leaks beperkt blijft.
• Er zijn meerdere implementaties van de JVM, met een eigen set aan instellingen.
De JVM's core runtimes zijn ontwikkeld in C/C++ en voeren dan ook een groot deel van de functies uit in native code, zoals GC, MMU, JIT, OS calls, IO subroutines, ... De J2SE/J2EE API bestaat op Java code niveau.
Classloader overzicht
• Laden - De bytecode bekomen van een Java class bestand
• Verificatie - Valideert de code binnen de class (geen illegale operaties in de JVM, corrupt, ...)
• Voorbereiding - Allocatie en initializatie van ruimte voor de static members
• Initializatie - Voert de initializatie code van een class uit en initialiseert static fields
JIT overzicht
De just-in-time compiler (JIT) is niet echt een onderdeel van de JVM, maar is wel essentieel voor een snel werkende Java applicatie. De JIT werkt door het compileren van bytecode, geladen door de classloader, wanneer deze aanroepen wordt.
Memory Management
Garbage Collection is een van de hoofdoorzaken van geheugen gerelateerde performance problemen in Java. 2 zaken moeten altijd in het achterhoofd gehouden worden bij GC:
- Frequentie: hangt af van de heap size en allocatie ratio
- Duur: hangt af van de heap size en de Java heap footprint
Na deze korte intro, vraag ik me af hoe de meerderheid hier te werk gaat om zijn JVM af te stellen op zijn applicatie.
• Welke methodes pas jij toe? (stap-voor-stap)
• Waar haal jij de meeste performance winsten uit?
• Wat zijn de richtlijnen waarmee jij rekening probeert te houden?
De eerste techniek die ik meestal probeer toe te passen in
1. Heap size tuning (-Xms -Xmx)
- Frequentie: max. om de 10s
- Duratie: max. 2s
tip: Voor het bepalen van een goede heap size; kan je het gemiddelde van de applicatie + 30% nemen.
-XX:+AggresiveHeap: nieuwe setting (JDK1.4.1+), en voorziet in het automatisch tunen van de heap settings (GC algorithm, Young/Old generation spaces, etc...)
2. Runtime optimalisaties
-server: efficiënter voor applicaties met CPU intensieve taken
-XX:+UseParallelGC: Betere performance op machines met veel CPUs (4+)
-XX:+UseConcMarkSweepGC: Constantere response tijden op machines met veel CPUs (4+)
-XX:+UseTrainGC: Constantere response tijden op machines met weinig CPUs
3. Repeat 1.
"Meten is weten"
Alles is gebaseerd op goede applicatiestatistieken. Als je bijvoorbeeld meer wil teweten komen over de GC van je applicatie; is het voldoende om volgende optie aan je JVM mee te geven:
-verbose:gc of -Xloggc:<file> -XX:+PrintGCDetails
Verder zijn er nog een aantal commerciële tools zoals JProfiler, JMeter, ...
Meer info kan je ook terugvinden op javaperformancetuning.com
